我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

双情感学习DEAN:从文本与用户评论的情感一致性中发现假新闻

双情感学习DEAN:从文本与用户评论的情感一致性中发现假新闻 假新闻检测这个话题技术方案看了不少但很多都给我一种“道理我都懂落地就翻车”的感觉。真正让我愿意反复读的是 DEAN 这篇 2019 年发布的预印本论文Learning Dual Emotion for Fake News Detection on Social Media。它把“情感”这个很容易被忽略的中间变量拆成两条线来用一条是新闻内容本身表达出来的情感另一条是用户在评论、转发里流露出来的群体情绪。这个 Dual Emotion 的双情感思路不依赖昂贵的事实库也不需要人工对每一条新闻做背景核查而是希望从文本和交互行为中找出假新闻传播的共性特征。这篇博文我会把研究动机、模型结构、实验设计、复现踩坑和后续扩展讲透适合正在入门假新闻检测、做社交媒体文本分析或者打算用多任务学习提升分类效果的同学参考。1. 这项研究到底解决了什么问题1.1 假新闻检测的第一个难题特征太容易被“伪装”假新闻检测最尴尬的地方在于字面上看假新闻和真新闻可以几乎没有区别。很多内容只是把时间、地点、人物换掉或者把某段描述的语气调强一点在词频、可读性、标题长度这些传统特征上完全看不出破绽。早期方案喜欢统计内容里的绝对词、情感词数量、感叹号密度一套规则下去训练集上效果不错一旦换个话题领域分类器就迅速退化。原因在于这些特征本质上都是“创作者可以主动控制”的表面信号。造一则假新闻的人完全可以把自己的文本风格伪装成正常新闻。我在实际项目里遇到过类似的情况把文本经过几轮改写之后原先基于语言风格训练的分类器预测结果就像抛硬币但人类一眼还是能看出“这语气不太对”。这说明单纯统计字面特征没有抓住更稳定的东西。所以 DEAN 把切入点放在情感上但又不是简单的情感词计数而是把情感当成一种“关系信号”来用。也就是说重要的不是这条新闻有多愤怒而是它唤起了读者多大的愤怒以及这两者之间的匹配关系是否正常。1.2 所谓“双情感”到底是哪两种情感Dual Emotion 这个名字听起来玄乎拆开之后其实很朴素一份社交平台上的新闻内容天然存在两个情感主体。第一个是发布者也就是新闻文本里直接表达出来的情感倾向第二个是受众也就是评论区、转发语里体现出来的情感反应。论文里通常把前者叫做目标情感把后者叫做用户参与情感有些后续研究也把它称作来源情感或者反馈情感。用一个生活化类比想象一场演讲。演讲者可以控制自己的语气和措辞这是文本侧情感但听众是鼓掌、起哄还是无动于衷这是用户侧情感。如果演讲者语气激昂台下却一片冷静那这段内容很有可能是“念稿”出来的。反过来说演讲者语气平平台下却莫名其妙集体亢奋那背后可能就有外部力量在煽动。DEAN 想做的就是同时捕捉这两个信号再进一步判断它们之间的一致性和传导关系。这个设计最聪明的地方是不再孤零零地分析一篇文本而是把“内容-受众”看成一个系统来建模拟判。2. DEAN 的整体设计思路为什么从“情绪”下手2.1 假新闻传播中情绪往往跑在事实前面假新闻能被大量转发靠的从来不是严谨论证而是快速击中读者的情绪开关。愤怒、焦虑、恐惧、猎奇这些情绪会降低人的判断意愿让人更倾向于“先转再说”。从这个角度看情绪不只是文章的附属品它本身就是一个强信号。DEAN 选择情感下手还有一个很现实的原因情感标注比真实性标注便宜得多。要判断一条新闻是真是假需要外部知识但判断一段文本是愤怒还是平静普通标注员就能完成。如果模型能在做假新闻检测的同时学会预测情感就相当于用大量的低成本情感数据辅助训练这在标注预算有限的场景里非常划算。我自己的体会是情感特征还有另一个隐藏优势它比关键词更抗时间变化。某个事件的专有名词会过时但“愤怒”“恐慌”这类情感标签在多个热点事件里是稳定的分布模型跨事件迁移时不容易失效。2.2 为什么只分析新闻文本的情感不够只看新闻文本的情感本质上还是在“创作者可控的范围”里打转。现在做对抗样本很容易把同一则假新闻里的显性情绪词替换掉保留同样的事实错误文本情感分类器就会失效。但用户评论很难被批量伪造即使雇佣水军也难在短时间内制造出自然、多样、时间分布合理的评论。所以 DEAN 把第二个分支放在用户侧。这里有个关键前提假新闻要想造成传播效果必须让足够多的用户产生真实情绪反应。一旦大量真实用户被调动起来评论里的情感分布就会留下痕迹而这个痕迹是造假者很难彻底抹掉的。把文本情感和用户情感一起看等于给检测系统上了两道锁。2.3 一致性、转移两种互补的建模视角双情感有了之后怎么用也有讲究。DEAN 体现的框架可以分成两个互补的视角一致性视角和转移视角。一致性视角关心的是“创作者表达的情绪”和“用户反馈的情绪”是否匹配。真实新闻通常追求客观中立文本情绪和评论情绪的相关性比较弱而假新闻往往刻意放大情绪并且评论区也随之出现明显的情感共鸣这种“高情感共振”就是可疑信号。当然真实新闻也会有争议性内容激怒用户所以一致性只是一个证据维度不能单独下结论。转移视角关心的是“情绪怎么在用户之间传导”。把评论按时间排序看早期评论和后期评论的情感变化趋势。假新闻经常出现“短时间情绪爆发、后续跟风升温”的曲线真实新闻的情绪扩散则更平稳、更多元。这两个视角一个看横向匹配一个看纵向演变组合起来能比较完整地刻画一条新闻的情感生命周期。3. 模型结构与核心模块拆解3.1 输入层与文本编码DEAN 的输入并不复杂一条新闻的正文文本加上这条新闻收到的若干条用户评论。如果只有一条新闻却没有评论后续的“用户侧”分支就无法生效这也是方法自身的一个适用边界。文本编码层在 2019 年的主流选择是卷积网络、循环网络或者它们的组合。拿当时常见的做法举例正文可以用一维卷积加池化得到一个定长向量评论可以按回复时间排列用双向 GRU 把每条评论编码成向量。放在今天这块编码层直接用预训练语言模型替换也完全合理DEAN 的核心创新不在编码器而在于编码之后如何把双情感关系提取出来。注意复现时不要把编码层当成研究重点反复调参真正决定模型性格的是后面的情感分布计算和双通道交互方式。3.2 目标情感分支把正文映射成一个情感分布目标情感分支要做的事情是把新闻正文变成一个情感概率分布。一般的做法是定义若干个情感类别比如愤怒、害怕、开心、悲伤、惊讶、中性这六类然后让模型对每一个类别输出一个概率值。这里有三个容易被忽略的细节。第一输出概率分布而不是输出单一情感标签能保留“这则新闻同时带有一点愤怒和一点恐惧”这样的模糊信息分类器后续用起来信息量更大。第二分类器可以放在文本向量之上也可以设计成多标签形式因为一段文本完全可能同时包含多种情绪。第三这个分支的训练标签可以来自人工标注也可以用情感词典做远程弱标注代价很低。我在实际操作中倾向于把这个分支当成一个“先验过滤器”它的预测质量不需要很高甚至只有 70% 的正确率也没关系因为后面会跟一个一致性计算真正的判别任务由整体网络完成。3.3 用户评论侧的情感聚合注意力机制是核心用户评论侧比正文侧更容易处理。一般来说我们并不关心某一条具体评论而是关心“整体评论区的情感结构”。但用户评论有两个麻烦数量不确定有的新闻下只有一两条评论有的有上千条噪声很大评论里夹杂大量与正文无关的闲聊、表情包、链接。DEAN 风格的解法是把正文侧得到的目标情感向量作为注意力查询去评论集合里筛选最相关的信息。这个操作说起来很自然如果新闻正文表达的是恐惧模型就会重点看评论里那些恐惧感较强的回复而不是被无关评论带偏。注意力机制在这里起到的其实是特征选择作用它让用户侧情感表示动态适配正文侧而不是固定地平均所有评论。我用一个比喻帮助理解目标情感分支相当于给出了“我们要找什么样的现场反应”用户侧注意力相当于“在反应里找出最像这种反应的瞬间”。两个分支在信息获取阶段就开始互动比最后简单拼接要有效得多。3.4 一致性得分与情感转移建模得到两个分支的表示之后DEAN 类模型通常还要做两件事。第一件是计算一致性得分。简单方案是直接算两个情感分布向量之间的余弦相似度得到一个 0 到 1 之间的数值更精细的做法是把两个向量拼接后过一个多层感知机让模型自己学习什么叫“匹配”。我自己在实践里更推荐后者因为不同场景对“一致”的定义并不一样硬编码余弦相似度容易限制模型表达能力。第二件事是情感转移建模。把用户评论按时间排好用循环网络逐个读取同时把相邻评论的时间间隔编码成衰减因子让模型能感知“情绪是突然爆发还是逐步累积”。把最后一个隐藏状态展开就得到一个序列级的情感转移特征。这个特征和一致性得分拼接在一起再联合正文表示最后过一个全连接层做二分类。我按理解写一段伪代码方便大家直观理解结构# 伪代码仅用于表达结构不是原论文逐行实现 news_vec encode(news_text) # [B, D] target_dist softmax(emotion_clf(news_vec)) # [B, K] reply_vecs encode(replies, mask) # [B, M, D] query target_dist emotion_emb_table # [B, D_q] attn softmax((reply_vecs query.unsqueeze(1)).squeeze(1), dim-1) source_vec (attn.unsqueeze(-1) * reply_vecs).sum(dim1) source_dist softmax(emotion_clf(source_vec)) # [B, K] consistency cosine_similarity(target_dist, source_dist) # [B, 1] transition_feat time_aware_gru(reply_vecs, time_gap) # [B, H] fake_prob classifier(cat(news_vec, consistency, transition_feat, source_vec))这段结构把“文本情感”和“用户情感”都融合进去了但最终预测仍然走的是一个端到端的分类器不需要额外维护两套推理逻辑。3.5 多任务学习与损失函数怎么设计DEAN 这类双情感框架还有一个很常见的配套动作把情感分类当成辅助任务和假新闻检测一起训练。总损失大致是[ L \lambda_1 L_{fake} \lambda_2 L_{emotion_target} \lambda_3 L_{emotion_source} ]其中 ( L_{fake} ) 是假新闻二分类的交叉熵后面两项分别是正文情感和评论情感的交叉熵。( \lambda ) 是权重我复现时通常先让 ( \lambda_1 1 )情感任务权重从 0.2 开始调。多任务在这里有三个好处。第一情感分类任务提供额外梯度帮助文本编码器学到更有通用性的语义表示。第二情感标签比真假标签噪声更小、类别更均衡训练更稳定。第三如果未来要上线系统情感分布本身就是一个不错的可解释中间结果运营同学能直接看出“这条内容激起了哪种情绪”。要注意的是多任务不是万能的。如果数据里情感标签和真假标签本身高度相关模型可能偷懒直接用情感标签作为假新闻代理而不再学习其他证据。这时候需要观察两个 loss 是否同步下降如果 ( L_{fake} ) 掉得很快但泛化测试很差就要降低情感分支权重。4. 实验设计与关键结论4.1 数据怎么构建正文、评论、时间戳对齐复现这类方法数据组织比模型结构更容易出问题。每条新闻至少要有三样东西新闻正文、一组用户评论、评论发布时间。只拿到聚合评论却不拿到时间戳情感转移模块就形同虚设。我习惯的数据清洗流程是先按新闻 ID 聚合评论过滤明显是机器生成的短评论比如重复字符占比过高的内容对评论做句式归一化不需要做太粗的停用词过滤因为情感表达常常依赖否定词和语气词保留原始时间戳并计算相邻评论的时间间隔。整个管道做完再按新闻级划分训练集和测试集不允许同一条新闻的评论同时出现在两个集合里否则就是严重的数据泄漏。4.2 评测指标与对比基线假新闻检测领域常用的指标是准确率、精确率、召回率和宏观 F1。由于假新闻在真实分布里比例通常偏低宏观 F1 比准确率更有参考价值。我当时拿几个典型方案做对照基于词频的逻辑回归、只用文本情感分支的变体、只用用户情感分支的变体、以及完整的 DEAN 结构。下面的表格是示意性结果用来展示相对趋势不代表任何官方复现数据具体数字会因为数据集划分和编码器选择有明显波动。模型变体示意是否使用双情感是否使用一致性/转移宏观F1示意词频逻辑回归否否0.701仅正文情感分支部分否0.752仅用户情感分支部分否0.764双情感简单拼接是否0.783双情感一致性转移是是0.814从趋势上看双情感切换带来的提升是最稳定的而一致性、转移模块带来的属于“锦上添花”级别的提升。如果训练数据很少优先保住双情感分支如果数据量足够大再把两个交互模块加进去也不迟。4.3 消融实验到底说明了什么消融实验的核心问题是双情感是不是真的有用还是只是多了几个参数导致效果变好。如果只把源情感分支拿掉分类性能会明显下降说明用户评论里的群体情感确实携带了正文之外的信息。如果去掉一致性模块模型退化成简单拼接我能观察到的典型现象是整体准确率略降但更难调参训练曲线抖动得更厉害。这说明一致性模块除了提升性能还有一定的正则化效果。更有意思的是在情感类别维度上不同情感的可分性差异很大。愤怒和恐惧这两类情感对区分假新闻的贡献通常最明显因为它们与“煽动性内容”高度相关而喜悦和平静类情感的区分度相对弱。不过这个结论不是普适的换一个领域和数据集主导情感的类别会变需要根据数据重新观察。4.4 从结果反推的可解释性双情感模型给人最直观的可解释性证据来自情感分布本身。拿一个测试样本举例系统判断为假的新闻正文情感分布呈现出“愤怒 0.62、惊讶 0.21”评论区情感分布则是“愤怒 0.58、害怕 0.19”一致性很高而真实新闻的正文情感分布通常更分散评论区则更多元。这种分布差异可以直接可视化给审核人员看比单纯输出一个 0.87 的可疑分数要可信得多。但这并不是说凡是文本和评论都愤怒的新闻就一定是假的。真实新闻里也会出现重大负面事件引发大面积愤怒。所以这套方法更适合作为舆情研判的辅助信号而不是唯一的判案依据。5. 复现与实战中的避坑要点5.1 情感分布的稳定性比准确率更重要复现 DEAN 时我踩过的第一个大坑是过度追求情感分类的准确率。当时我把正文情感分支单独拿出来调优用了更复杂的模型准确率确实涨了几个点但整体假新闻检测 F1 反而降了。原因是单独调优后的情感分类器变得更敏感很喜欢把中性文本也预测成激进情感导致一致性计算分数整体偏高失去了区分度。后来我把情感分类器固定在中低复杂度把训练重心放在双通道交互上效果才恢复正常。记住这个模块要的是稳定、可比的相对分布不是绝对准确率。5.2 零评论样本怎么处理社交平台上不是每条内容都有评论新账号、新话题尤其明显。直接在源情感分支里填充零向量会带来副作用零向量参与注意力计算时会产生不可预测的向量方向。稳妥做法是加一个评论数量是否为零的指示特征同时让注意力机制学会把零评论样本的源情感表示退化为可学习的默认向量。我实测下来与其硬造一条伪评论不如分开建模。评论数量足够多的样本用完整双通道零评论样本退化为纯文本基线。上线系统时可以在同一个模型里对两种情况分别做分支只要控制好批次里的掩码就行。5.3 情感类别粒度怎么选情感类别定多少类对结果影响很大。定太少比如只有正面负面中性信息太粗糙定太多比如 20 类细粒度情绪标注噪声和训练难度都会上升。我常用的起点是 6 类基础情感加中性这样每个类别样本量相对均衡远程标注也方便。如果是做中文场景还要额外处理情绪词的尺度差异比如“还行”和“太棒了”之间的强度就完全不同需要用带强度的情感词典做初始化。5.4 训练稳定性的三个典型问题训练过程中我遇到的三个典型问题应该也是很多人会碰到的。第一个是正负样本不平衡假新闻占比过低时前几个 epoch 模型会一直预测“真”这时候要在损失里给假新闻加权重或者先用类别平衡采样。第二个是情感分支和主分类分支梯度冲突表现为情感 loss 下降但主 loss 震荡解决办法是给两个分支设置不同的学习率情感分支用小一点的学习率。第三个是评论长度差异过大长评论容易主导注意力所以要么做长度截断要么对注意力分数做长度归一化。提示不要在一开始就把所有模块都打开。第一步只跑通“编码器 拼接分类器”第二步再加上双情感交互第三步再加入多任务损失。一步步加出了问题才可能定位到具体模块。5.5 把双情感思路迁移到其他场景这套“目标侧 反馈侧”的双通道思路其实不只在假新闻检测里能用。我在做产品评论可信度判断时也复用类似设计一条商品评价是目标侧其他人对这条评价的“评论的评论”是反馈侧。恶意刷评内容经常出现“正文极力吹捧留言区却一片嘲讽”的高不一致信号。在迁移时核心要改的是情感类别定义和时序范围比如评论诚信度场景里不是判断愤怒或恐惧而是判断“是否过度夸张”“是否高度空泛”。结构上保留一致性模块和转移建模就能快速适配。6. 这个方向的后续进化与我的实际感受6.1 从文本情感走向多模态与传播时序DEAN 让我印象最深的不是某个模块有多精巧而是它重新定义了“假新闻检测里的情感应该怎么作为证据”。在它之后很多研究把文本情感扩展到了图像情感、视频封面情感也有研究把情感转移进一步细化成“级联传播图上的时间衰减建模”。如果你今天重新看这个话题完全可以在 DEAN 的基础上把正文编码换成更大的预训练语言模型把评论聚合改成图神经网络把一致性计算放到多个层次上做每一步都是增量提升。6.2 双情感方法的三点局限这套方法并非没有边界。第一它非常依赖评论数量热门新闻效果好长尾内容效果差。第二它会被大规模水军攻击如果评论者刻意模仿正常人的情感分布一致性信号就会失真。第三它不能判断“事实性错误”只能判断“内容是否在情感上表现异常”所以更适合作为辅助筛选系统而不是最终裁决系统。把这三点摆清楚应用时就不会抱过高期望。6.3 我的使用建议和最后一条小技巧如果让我给一个最落地的组合我会这样做用 DEAN 的双情感分支作为召回阶段把情感一致性异常的内容先捞出来再用外部事实库或者人工审核做精排。这样既避免了纯事实库的高维护成本也避免了纯机器学习的高误报率是一个成本可控的工程方案。最后分享一个小技巧在情感标签实在缺失的场景不需要人工从头标。先用一个公开的情感分类器给训练集做伪标签然后用伪标签跑一版 DEAN把模型预测概率高于 0.95 的样本挑出来交给人工复核迭代两轮之后情感分支的质量就能满足要求。我用这个方法在只有几千条人工标注的情况下把情感分支训练到位后续迁移到新产品线时这套“弱标签起步、双情感交互、多任务稳定”的组合拳基本没有失手过。
返回列表