前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于TextCNN的谩骂评论识别模型

基于TextCNN的谩骂评论识别模型

原创
作者头像
Techeek
修改2018-03-21 16:50:29
3.7K3
修改2018-03-21 16:50:29
举报
文章被收录于专栏:人工智能

作者:刘智静 | 腾讯内容安全平台中心工程师

“网络喷子”群体的出现,使新闻文章中的谩骂评论屡见不鲜。为了净化平台和保证用户体验,如何自动拦截谩骂评论是亟待解决的问题。本文旨在利用卷积神经网络构建谩骂评论的自动识别模型,用机器对抗喷子。

新闻文章的评论中,经常会出现谩骂评论,包括对新闻当事人的辱骂、对小编的问候以及评论回复中对楼主的攻击等,不仅会影响平台的品质和逼格,更主要的是会影响用户体验。所以如何减少谩骂评论的出现是一个值得解决的问题。但由于评论数量的量级较大,依靠人工审核并不现实。我们的目的是建立谩骂评论的自动识别算法,用模型拦截脏言脏语。

下面总结了建模的一些思路和流程,纯属拙见,欢迎大家拍砖斧正。

(高能预警:前方大量谩骂语句出没。)

〇. 基本思想

首先,聊一下建模过程中的心路历程和解题思路。

提到识别谩骂评论,如果你下意识地想到直接用关键词过滤,毕竟谩骂词汇是有限的,那么说明你对网友的创造力一无所知。我们想象中的评论是这样子的(用词分明,尊重每一个谩骂词的价值,让它们存在即谩骂):

  • 我就想知道有关部门到底是哪个部门(非谩骂)
  • 为了满足自己那卑微的虚荣心,把你祖宗的脸丢到腾讯这里来!*逼!(谩骂)
  • 不**脸的东西!(谩骂)

但其实它们也可以是酱紫的:

  • 他*的多少,反正中国片都是脑*片,我从来不看,喜欢看的人都是s*。(谩骂)
  • 他*的!总结的太好了!佩服!(非谩骂)

和酱婶儿的:

  • *痹!中国人的脸被这垃圾丢到国际上了。(谩骂)
  • 成天抵制………真感觉自己有多强一样……井底之蛙 自己的强不是靠抵制换来的 除了能麻痹自己 能浪费税收 还能干什么(非谩骂)

也就是说设置关键词确实可以拦截掉部分谩骂评论,但会出现两个大问题。首先,如果选取关键词时追求准确率(也就是减少误伤),那么必然会导致关键词的覆盖度不够;反之,如果选取关键词时追求召回率(也就是减少误放),那么很多和谩骂沾边的词都必须选进来,但是如果对命中这些词的评论一棍子干掉,可想而知精确率会有多么得惨不忍睹。比如上面例子中的包含“他*的”、“垃圾”、“*痹”等词语的评论,不能一概而论地全判成谩骂或全判为非谩骂。

所以纯策略这条路是走不通的,必须召唤算法了。因为这是一个二分类问题,可以考虑很多的分类算法,这里决定采用神经网络(因为平时主要研究深度学习方面的算法,才不是因为惧怕特征工程的支配)。对于这种短文本分类,最先想到的就是经典的 TextCNN模型。实验证明,它的表现确实也优于其他的网络模型。

训练好网络模型后,发现测试效果差强人意,所以纯算法的效果也有待提升。 鲁迅曾经说过,团结就是力量。当我们采用“策略+算法”的模型时,就发现效果确实比单用算法好,达到了期望值。

以上就是整个建模过程中的思路。接下来将在一二部分简单介绍数据来源和前期准备,第三部分介绍网络模型的选择和调参优化,最后一部分介绍最终的模型流程。

一. 数据来源

样本数据主要来自于人工标注。

首先要做的是确定标注标准,每个人对谩骂的容忍度是不一样的,需要统一标准。比如地域黑类型人格型(“智*”、“*类”)等等是否要被打击。

然后就要进行一言难尽的标注工作。在这个过程中,可以 学习 总结各式各样的谩骂词汇和句式,为之后建模做准备。(上面列举出的谩骂评论例子都是轻量入门级的,还有更多的不堪入耳辣眼睛的评论,标注完之后世界都不一样了。)

最后将样本集划分成训练集、验证集和测试集。

二. 前期准备

前期准备主要包括两部分。第一部分是建立谩骂词表,为后续分类算法做准备;第二部分是对每条样本评论做预处理,包括分词、特殊字符的处理等。

1.谩骂词分类

首先,建立一份谩骂词表,包含常用的谩骂词(这个时候标注时积累的知识就派上用场了)。

然后把谩骂词分成两大类,一类属于黑名单词,评论中出现该词则基本可视为谩骂;另一类属于疑似谩骂词,评论中出现该词很可能是谩骂,但在具体语境或者断句中也许并不是。这样分类的目的是提高模型准确率(后面会提到)。

  • 黑名单词:二*、妈*、*mp 等。
  • 疑似谩骂词:上面提到的“他*的”、“垃圾”、“*痹”等词,以及“贱”、“操”这种高危字等。

具体分类方法是,针对每个谩骂词,统计它的命中准确率(包含该词的谩骂评论数/包含该词的评论数)。根据命中准确率排序,划分黑名单词和疑似谩骂词。

2.评论预处理

在输入网络模型之前,需要对每条评论进行预处理。

首先,英文转成小写。去掉特殊字符。设置最大长度进行截断(根据标注经验,谩骂一般出现在文末总结部分,因此这里是从右向左截取)。

然后,为了对比不同分割粒度下模型的效果,分别对评论进行以下三种处理:

  • 字粒度:逐字拆分。
  • 词粒度:分词处理,利用分词工具 jieba 库对评论进行分词。
  • 拼音粒度:拆字或分词后,将字或词的拼音作为输入。

注:分词后不去停用词。原因是谩骂中经常涉及到常用的停用词,比如“你”“他”“我”等等,去掉停用词反而会损失很多信息。

  • 举个例子:“我看你还是*了她吧!”,去掉停用词后只剩下“*”。

三. 模型选择

模型选择包括对网络结构的选取、文本划分粒度的选取以及网络中参数的设置。

1.网络结构

采用 Yoon Kim 提出的TextCNN。网络结构如下图:

TextCNN网络结构
TextCNN网络结构

具体结构是:

  • 首先利用 embedding 层,将每个词转成相同长度的向量,这样就将文本转换成了矩阵的形式。
  • 然后接入卷积层,filter 的长度可自定义,宽度等于词向量的长度。这样处理,每次计算 n 个词向量的卷积,类似于 n-gram 模型,考虑了多个词之间的顺序信息。
  • 接着是池化层,使用 max pooling,取每个特征图的最大值作为输出。
  • 最后是 softmax 层,由于是两分类问题,输出层设为两个神经元。

在选取网络结构的时候,有尝试采用 Char-CNN、LSTM 等其他网络,但最终结果显示 TextCNN 的表现最好。

  • 一些思考(之一本正经地强行解释): Q1:为什么 CNN 的表现优于 RNN? A1: 原因可能是大部分评论都属于短文本,LSTM长时记忆的优势不明显。另一方面,RNN 的优点在于考虑了整个文本的语序,而在我们的场景中,只有谩骂部分的语序需要考虑,而 CNN 通过合理设置 filter 的大小恰好就做到了这一点。 Q2:为什么 TextCNN 的表现优于 Char-CNN? A2: TextCNN 的结构很简单,参数也较少。我们的场景相当于发现短文本中的谩骂片段,可能越简单的 CNN 模型反而越有效。另一方面,目前的训练样本数量不多,对比之下,Char-CNN 的参数数量太多就使得它容易出现过拟合的问题。

2.划分粒度的选取

对于句子的划分单元,最开始是采用常规做法,将句子分词处理。后面受到 Char-CNN的启发,决定尝试不同的划分粒度,将句子按字、词、拼音拆分,再灌入模型,择优选取

下表是按照三种划分单元训练TextCNN后,模型在测试集上的效果:

划分粒度

precision

recall

F-score

85.32%

86.18%

0.86

86.09%

73.01%

0.79

拼音

82.58%

68.89%

0.75

结论:

  • 按字拆分效果最佳;
  • 按词拆分效果不如按字拆分,原因可能是jieba对很多谩骂评论的切分不准确,再加上评论中常出现错别字,导致分词效果不佳;
  • 使用拼音虽然可以处理别字的情况,但带来的信息损失更大,所以效果不好。

3.调参

论文中,卷积层采用长度为 3,4,5 的 filter 各 100 个。考虑到按字拆分时,不同窗口大小选取的字段的有效性不同,因此配置不同的 filter 个数。多次实验后,最终将 filter 的长度选取为 1/2/3/4/5/6/8,个数分别为 50,100,150,150,200,150,100

最后,为了防止训练过程中的梯度弥散问题,在卷积层中加入了 batch normalization

四. 最终模型

如上文所述,最终模型采用的是“策略+算法”的组合方式。具体的流程图如下:

  • 第一步,判断评论是否命中黑名单词,命中则判为谩骂;
  • 第二步,判断评论是否命中疑似谩骂词,未命中则判为非谩骂;
  • 第三步,将评论输入TextCNN模型,输出模型预测结果。
模型流程图
模型流程图

加入策略后,可以进一步提高模型的准确率。优点是让模型聚焦在命中疑似谩骂词的评论上,同时不会误伤正常评论(否则经常出现莫名其妙的误判);缺点则是损失召回率,使其依赖于谩骂词的选取。

所以之后需要进一步跟踪谩骂词的表现:

  • 对于黑名单词,由于是命中即谩骂,所以要保证命中准确率。因此要跟踪它们的准确率表现,表现不佳则降为疑似谩骂词;
  • 对于疑似谩骂词,由于是未命中即非谩骂,所以要保证它们的覆盖度。但如果一味追求覆盖度,就必然使模型的准确率受到影响,这就涉及到两者之间的trade-off,目前的做法还是按照经验筛选。

下表是加入策略前后,模型在测试集上的效果:

模型

precision

recall

F-score

TextCNN

85.32%

86.18%

0.86

策略+TextCNN

89.03%

86.68%

0.88

实验表明,策略的加入确实能提升模型的效果。最终模型在测试集上的精确率为89.03%,召回率为86.68%。之后需要收集更多训练样本,优化网络结构,进一步提高模型的表现效果。

参考文献

[1] Kim Y. Convolutional neural networks for sentence classification[J]. arXiv preprint arXiv:1408.5882, 2014.

[2] Zhang X, Zhao J, LeCun Y. Character-level convolutional networks for text classification[C]//Advances in neural information processing systems. 2015: 649-657.

[3] Ioffe S, Szegedy C. Batch normalization: Accelerating deep network training by reducing internal covariate shift[C]//International conference on machine learning. 2015: 448-456.

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 〇. 基本思想
  • 一. 数据来源
  • 二. 前期准备
    • 1.谩骂词分类
      • 2.评论预处理
      • 三. 模型选择
        • 1.网络结构
          • 2.划分粒度的选取
            • 3.调参
              • 参考文献
          • 四. 最终模型
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档