谣言检测论文分享(三)

论文分享之

Rumor Detection on Twitter with Tree-structured

Recursive Neural Networks

Jing Ma , Wei Gao , Kam-Fai Wong

简介:

该论文提出了一种基于树结构递归神经网络(Tree-structured Recursive Neural Networks,简称TreeRNN)的推特谣言检测方法。该论文中的TreeRNN模型能够自动地从推特中提取出有用的特征,并且通过学习推特中单词之间的上下文关系来进行谣言检测。具体来说,该模型首先将推特中的单词转化为树形结构,然后通过递归神经网络对树形结构进行编码,最终得到整个推特的向量表示。这种编码方式可以有效地捕捉单词之间的语义关系和上下文信息。 实验结果表明,该模型相比于传统的机器学习模型和其他深度学习模型具有更好的谣言检测效果。此外,该模型还可以对谣言进行分类,即确定谣言的类型。这对于进一步理解谣言的产生和传播机制具有重要意义。

该论文的创新点在于提出了一种全新的推特谣言检测方法,并且通过实验证明了该方法的有效性。该方法具有一定的普适性,可以应用于其他领域的文本分类任务。

摘要:自动谣言检测在技术上是非常具有挑战性的。在这项工作中,我们试图通过遵循推文内容的非顺序传播结构来学习区分特征,并生成更强大的表示来识别不同类型的谣言。我们提出了基于自底向上和自顶向下树状神经网络的两种递归神经模型,用于谣言表示学习和分类,自然地,该模型符合推文的传播布局。在两个公共Twitter数据集上的结果表明,我们的递归神经模型1)比最先进的方法获得了更好的性能;2)在早期阶段就能发现谣言。

1 介绍

1.1 研究背景

分析表明,如果谣言是假的,人们往往会停止传播(Zubiaga et al., 2016b)。然而,识别这些虚假信息并非易事,需要新闻调查对可疑声明进行事实核查,这是一项劳动密集型和耗时的工作。社交媒体的泛滥使信息负荷和动态性不断增加,使情况变得更糟。因此,需要开发自动化和辅助的方法以方便实时的谣言追踪和揭穿。

为了自动化谣言检测,之前的研究大多集中在基于特征工程的监督模型从序列微博流中进行文本挖掘(Castillo et al., 2011;Kwon等人,2013;刘等,2015;Ma等人,2015),以及最近的深度神经模型(Ma等人,2016;Chen等人,2017;Ruchansky等人,2017)。这些方法在很大程度上忽略或过度简化了与消息传播相关的结构信息,但这些信息已被证明有助于为识别谣言提供有用的线索。(Wu等人,2015;因此,Ma等人,2017)提出基于核方的法,从而将结构建模为传播树,以便通过比较基于树的相似性来区分谣言和非谣言主张。但是,这种方法不能直接对树进行分类,除非与其他树进行两两比较,这带来了不必要的开销,而且它也不能从噪声表面特征中自动学习到任何高级特征表示。

该文提出了一种基于递归神经网络(recursive neural networks, RvNN)的神经谣言检测方法,将谣言的内容语义和传播线索联系起来。RvNN及其变体最初用于组成短语或句子表示以进行句法和语义分析(Socher et al., 2011, 2012)。与解析树不同,本文模型的输入是一个植根于源文章的传播树,而不是单个句子的解析树,并且每个树节点都是响应文章而不是单个单词。通过沿树结构的递归特征学习过程,可以联合捕获帖子的内容语义和帖子之间的响应关系。

1.2 RvNN 的优势

那么,为什么这种神经模型(递归神经网络)可以在任务中做得更好呢?分析普遍发现,随着用户分享意见、猜测和证据,Twitter可以“自我纠正”一些不准确的信息(Zubiaga et al., 2017)。为了说明,图1展示了数据集中两个谣言的传播树,一个是假的,另一个是真的。结构不敏感的方法基本上依赖于文本中不同立场的相对比例,当这样的线索不明确时,就不能做得很好。然而,可以看到,当一个帖子否认虚假谣言时,往往会引发支持或肯定的回复,确认否认;相反,对真实谣言的否认往往会引发质疑或在其回答中予以否认。这个观察结果可能暗示了一个更普遍的假设:回答者倾向于不同意(或质疑)支持虚假谣言或否认真实谣言的人,也倾向于同意否认虚假谣言或支持真实谣言的人。与此同时,回复通常是对其父节点的回复,而不是直接回应源推文(即根)(Lukasik et al., 2016;Zubiaga等人,2016a),表明相互作用具有明显的局部特征。递归网络自然地对这种结构进行建模,以学习捕获谣言指示信号,并通过递归聚合来自不同分支的信号来增强表示。

1.3 本文贡献:

  1. 这是第一个基于树状递归神经网络深度融合结构和内容语义的微博谣言检测研究。
  2. 提出了两种基于自底向上和自顶向下树结构的RvNN模型,通过捕捉信号谣言的结构和纹理属性,为声明生成更好的集成表示。
  3. 基于真实的Twitter数据集进行的实验,在谣言分类和早期检测任务上都比最先进的基线取得了卓越的改进。

2 相关研究

4 基于RvNN 的谣言检测方法

该方法的核心思想是通过在树的不同分支上遵循传播结构的递归来加强树节点的高级表示。例如,响应性节点确认或支持某个节点(例如,“我同意”,“是对的”等)可以进一步加强该节点的立场,而拒绝或质疑性响应(例如,“不同意”,真的吗?!)则会削弱其立场。与使用传播树的基于内核的方法相比(Wu et al., 2015;Ma等人,2017),本文的方法不需要在大量子树之间进行成对比较,并且可以根据响应结构学习更强的内容表示。

4.1 标准的RvNN

RvNN是一种树状结构神经网络。RvNN的原始版本使用了二叉化句子解析树(Socher et al., 2012),其中与解析树的每个节点相关的表示是从它的直接子节点计算出来的。标准RvNN的整体结构如图2的右侧所示,对应于左侧的输入解析树。

叶节点是输入句子中的单词,每个单词由一个低维词嵌入表示。非叶节点是句子的组成部分,基于子节点的表示通过递归计算得到。设p为子节点为c1和c2的父节点的特征向量,父节点可表示由

,其中f(·)是以W和b为参数的激活函数。该计算在所有树节点上递归完成。学习到的节点隐藏向量可以用于各种分类任务。

4.2 自下而上的RvNN

自底向上模型的核心思想是通过递归访问从底部叶子到顶部根的每个节点,为每个子树生成一个特征向量。通过这种方式,具有相似上下文的子树,例如具有否认父节点和一组支持子节点的子树,将被投射到表示空间中的邻近位置。因此,这些局部谣言指示性特征沿着不同的分支聚合成整个树的一些全局表示。

为此,对原有的RvNN进行了自然的扩展,提出的自底向上模型的总体结构如图3(b)所示,将自底向上树(参见图3(a))作为输入。与标准RvNN不同,自底向上模型中每个节点的输入都是一个post,表示为词汇表中单词的向量,以tfidf值表示。在这里,每个节点都有一个输入向量,节点的子节点数量变化很大。

在标准RvNN中,由于输入实例是句子的解析树,只有叶节点有输入向量,每个节点代表输入句子的一个单词,非叶节点是句子的组成部分,因此节点的子节点数量是有限的。

在谣言检测中,使用长短期记忆(LSTM)和门控循环单元(GRU)学习文本表示,采用记忆单元通过长时间步骤存储信息。在本文中,选择扩展GRU作为隐藏单元来建模树节点上的长距离交互作用,因为它的参数更少,因此效率更高。设S (j)表示节点j的直接子节点的集合。自底向上模型中节点j的过渡方程公式如下:

其中

是节点j的原始输入向量, E表示转换该输入的参数矩阵。是j的变换表示,[W∗,U∗]是GRU内部的权重连接,和指j及其第s个子节点的隐藏状态。因此,表示j所有子结点的隐状态之和,假设所有子结点对j都同等重要。与标准GRU一样,表示元素乘法;重置门决定如何将当前输入与子节点的信息合并,更新门定义了有多少子节点的内存级联到当前节点;表示当前节点隐藏状态的候选激活。与标准的GRU单元不同,本文的GRU变体中的门控向量依赖于许多子单元的状态,允许我们的模型包含来自不同子单元的表示。

经过自下到上的递归聚合后,根节点的状态(即源tweet)可以看作是用于监督分类的整个树的表示。因此,一个输出层连接到根节点,使用softmax函数来预测树的类:

公式2中,h0为学习到的根节点隐藏向量;V和b为输出层的权值和偏差。

4.3 自上而下的RvNN

该模型旨在利用自顶向下树的结构来捕获复杂的传播模式,以对谣言主张进行分类,如图3(c)所示。它模拟了信息流如何从源post到当前节点。这种自上向下方法的思想是为每个帖子生成一个考虑其传播路径的强化特征向量,其中谣言指示特征沿着传播路径中的传播历史聚合。例如,如果当前发布的帖子与拒绝源帖子的父节点的立场一致,那么从根节点到这条路径上的当前节点的拒绝立场应该得到加强。由于任何非叶节点都有不同的分支,对其子树节点的自顶向下访问也是递归的。然而,自顶向下的树的性质使得该模型不同于自底向上的树。每个节点的表示是通过结合它自己的输入和它的父节点(而不是它的子节点)来计算的。这个过程从根节点递归地进行到它的子节点,直到到达所有叶节点。

通过自顶向下的递归,学习到的表示最终被嵌入到所有叶节点的隐藏向量中。由于叶节点的num- 1985 ber不同,所得到的向量不能直接输入一个固定大小的神经层进行输出。因此,本文添加了一个最大池化层,以取所有叶节点上向量的每个维度的最大值。这还可以帮助从所有传播路径中捕获最吸引人的指示性特性。

基于池化的结果,我们最终在输出层中使用一个softmax函数来预测树的标签:

4.4 模型训练

模型的训练目标是最小化预测结果和真实值概率分布之间的平方误差:

其中是真实值,是一个类的预测概率,N是训练声明数,c是类别数,||...||2是所有模型参数θ的L2正则项,λ是权衡系数。

在训练过程中,使用高效的反向传播结构更新所有模型参数(Goller和Kuchler, 1996;Socher et al., 2013),并且优化是基于梯度的,遵循Ada-grad更新规则(Duchi et al., 2011),以加快收敛速度。凭经验以均匀分布初始化模型参数,并将词汇表大小设置为5000,嵌入和隐藏单元的大小设置为100。在每次迭代中迭代所有训练样本,直到损失值收敛或满足最大迭代次数。

5 实验

5.1 数据集

为了进行实验评估,本文使用了两个公开可用的Twitter数据集,Twitter15和Twitter164,分别包含1381和1181棵传播树。在每个数据集中,以树结构提供了一组广泛传播的源推文及其传播线程(回复和转发)。每棵树都标注四种类别标签中的一种,即非谣言、虚假谣言、真实谣言和未经验证的谣言。本文从树中删除转发,因为它们不提供任何额外的信息或证据。通过翻转边的方向,为每棵树构建两个版本,一个为自下向上的树,另一个为自上向下的树。

5.2 实验设置

对比模型:

  1. DTR:提出了一种基于决策树的排名模型,通过搜索查询短语来识别趋势谣言。
  2. DTC:使用决策树分类器(Castillo et al.,2011),基于人工工程推文的各种统计特征。
  3. RFC:随机森林分类器,使用3个拟合参数作为时间属性和一组关于用户、语言和结构特性的手工特性(Kwon et al.,2013)
  4. SVM-TS:一种线性的SVM分类器,它使用时间序列来建模手工制作的社会上下文特征的变化(Ma等人,2015)。
  5. SVM- bow:通过使用词袋表示文本内容和使用线性SVM进行谣言分类构建的原始基线。
  6. SVM-TK和SVM-HK: SVM分类器分别使用树核(Ma等人,2017)和使用混合核(Wu等人,2015),这两种分类器都用核建模传播结构
  7. GRU-RNN:一种基于递归神经网络的检测模型(Ma et al.,2016),使用GRU单元,通过建模相关帖子的顺序结构来学习谣言表示。

5.3 谣言分类表现

可以观察到,第一组基于手工特征的4个基线的性能明显较差,准确率在0.409 ~ 0.585之间,这表明它们由于缺乏捕获有用特征的能力而无法泛化。在这些基线中,svm和RFC的表现相对较好,因为它们使用了额外的时间特征,但它们仍然明显低于不依赖特征工程的模型。DTR使用一组正则表达式来表示姿态。然而,在两个数据集中,只有19.6%和22.2%的推文中包含了这些正则表达式覆盖的字符串,效果并不理想。

实验结果略

6 总结

本文提出了一种基于递归神经网络的自底向上和自顶向下树状结构的推特谣言检测模型。递归模型的固有性质允许他们使用传播树来指导从推文内容中学习表示,例如在结构中嵌入隐藏的各种指示性信号,以更好地识别谣言。两个公共Twitter数据集的结果表明,与最先进的baselian相比,本文的方法提高了在非常大的漏洞中谣言检测的性能。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
谣言检测是指通过分析文本内容来判断该文本是否包含谣言或虚假信息。Transformer是一种基于注意力机制的神经网络模型,被广泛应用于自然语言处理任务中,包括谣言检测。 在谣言检测中,我们可以使用Transformer的编码器作为语义提取器。编码器将整个句子作为输入,并通过注意力机制和多层感知机(MLP)为每个字生成一个编码向量。这些编码向量包含了整个句子的语义信息。然后,我们可以将这些向量输入到全连接网络中进行分类,判断文本是否为谣言。 需要注意的是,由于Transformer的注意力机制可以同时处理整个句子,因此它具有较好的并行能力。然而,与循环神经网络(RNN)相比,Transformer缺少了上下文信息,即没有考虑到不同词之间的顺序。因此,在使用Transformer进行谣言检测时,需要注意这一点。 下面是一个基于PyTorch和Transformer实现谣言检测的示例代码: ```python import torch import torch.nn as nn import torch.optim as optim from torchtext.data import Field, TabularDataset, BucketIterator from torch.nn import TransformerEncoder, TransformerEncoderLayer # 定义模型 class RumorDetectionTransformer(nn.Module): def __init__(self, input_dim, hidden_dim, output_dim, n_layers, n_heads, dropout): super().__init__() self.embedding = nn.Embedding(input_dim, hidden_dim) self.encoder_layer = TransformerEncoderLayer(hidden_dim, n_heads) self.encoder = TransformerEncoder(self.encoder_layer, n_layers) self.fc = nn.Linear(hidden_dim, output_dim) self.dropout = nn.Dropout(dropout) def forward(self, text): embedded = self.embedding(text) embedded = embedded.permute(1, 0, 2) output = self.encoder(embedded) output = output.permute(1, 0, 2) pooled = torch.mean(output, dim=1) pooled = self.dropout(pooled) return self.fc(pooled) # 数据预处理 TEXT = Field(tokenize='spacy', lower=True) LABEL = Field(sequential=False, is_target=True) fields = [('text', TEXT), ('label', LABEL)] train_data, test_data = TabularDataset.splits( path='data', train='train.csv', test='test.csv', format='csv', fields=fields ) TEXT.build_vocab(train_data, vectors='glove.6B.100d') LABEL.build_vocab(train_data) # 模型训练 device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') BATCH_SIZE = 64 train_iterator, test_iterator = BucketIterator.splits( (train_data, test_data), batch_size=BATCH_SIZE, device=device ) INPUT_DIM = len(TEXT.vocab) HIDDEN_DIM = 100 OUTPUT_DIM = 1 N_LAYERS = 2 N_HEADS = 2 DROPOUT = 0.2 model = RumorDetectionTransformer(INPUT_DIM, HIDDEN_DIM, OUTPUT_DIM, N_LAYERS, N_HEADS, DROPOUT).to(device) optimizer = optim.Adam(model.parameters()) criterion = nn.BCEWithLogitsLoss().to(device) def train(model, iterator, optimizer, criterion): model.train() epoch_loss = 0 for batch in iterator: optimizer.zero_grad() text = batch.text label = batch.label.float() predictions = model(text).squeeze(1) loss = criterion(predictions, label) loss.backward() optimizer.step() epoch_loss += loss.item() return epoch_loss / len(iterator) def evaluate(model, iterator, criterion): model.eval() epoch_loss = 0 with torch.no_grad(): for batch in iterator: text = batch.text label = batch.label.float() predictions = model(text).squeeze(1) loss = criterion(predictions, label) epoch_loss += loss.item() return epoch_loss / len(iterator) N_EPOCHS = 10 best_valid_loss = float('inf') for epoch in range(N_EPOCHS): train_loss = train(model, train_iterator, optimizer, criterion) valid_loss = evaluate(model, test_iterator, criterion) if valid_loss < best_valid_loss: best_valid_loss = valid_loss torch.save(model.state_dict(), 'rumor_detection_transformer.pt') # 模型使用 model.load_state_dict(torch.load('rumor_detection_transformer.pt')) def predict_rumor(text): model.eval() tokenized = [tok.text for tok in TEXT.tokenizer(text)] indexed = [TEXT.vocab.stoi[t] for t in tokenized] tensor = torch.LongTensor(indexed).unsqueeze(1).to(device) prediction = torch.sigmoid(model(tensor)) return prediction.item() # 示例使用 text = "这是一条谣言" prediction = predict_rumor(text) print(f"谣言概率:{prediction}") ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_41964296

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值