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

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

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

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

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

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

〇. 基本思想

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

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

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

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

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

和酱婶儿的:

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

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

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

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

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

一. 数据来源

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

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

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

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

二. 前期准备

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

1.谩骂词分类

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

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

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

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

2.评论预处理

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

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

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

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

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

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

三. 模型选择

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

1.网络结构

采用 Yoon Kim 提出的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.

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

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

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏积累沉淀

数据挖掘算法之深入朴素贝叶斯分类

写在前面的话:   我现在大四,毕业设计是做一个基于大数据的用户画像研究分析。所以开始学习数据挖掘的相关技术。这是我学习的一个新技术领域,学习难度比我以往学过的...

36480
来自专栏marsggbo

DeepLearning.ai学习笔记(三)结构化机器学习项目--week1 机器学习策略

一、为什么是ML策略 ? 如上图示,假如我们在构建一个喵咪分类器,数据集就是上面几个图,训练之后准确率达到90%。虽然看起来挺高的,但是这显然并不具一般性,...

23050
来自专栏华章科技

2017年深度学习必读31篇论文

一如既往,首先,标准免责声明适用,因为今年仅与GAN有关的论文就超过1660篇。我肯定会有疏漏,试图缩减到每两周一篇论文,包含了Imperial Deep Le...

10530
来自专栏CreateAMind

【前沿跟进】Google, OpenAI提出层次强化学习新思路

13810
来自专栏机器学习之旅

Kaggle&TianChi分类问题相关算法快速实现导读理论解析如何设计一个Stacking|Ensemble的模型?案例复现

17/12/30-update :很多朋友私密我想要代码,甚至利用金钱诱惑我,好吧,我沦陷了。因为原始代码涉及到公司的特征工程及一些利益trick,所以我构造了...

24920
来自专栏新智元

【AI玩跳一跳终极奥义】首个端到端神经网络,看AI在玩游戏时注意什么

作者:Flood Sung 编辑:费欣欣 【新智元导读】不用传统外挂,训练纯深度学习AI来玩跳一跳,结果会如何?本文作者使用模仿学习,训练了一个端到端的神经网络...

41270
来自专栏机器之心

教程 | 如何使用TensorFlow构建、训练和改进循环神经网络

选自SVDS 作者:Matthew Rubashkin、Matt Mollison 机器之心编译 参与:李泽南、吴攀 来自 Silicon Valley Dat...

34390
来自专栏钱塘大数据

【干货】2018年深度学习必读的31篇论文,赶紧收藏!

Kloud Strife在其博客上盘点了今年最值得关注的有关深度学习的论文,包括架构/模型、生成模型、强化学习、SGD & 优化及理论等各个方面,有些论文名扬四...

39430
来自专栏数据派THU

教你用PyTorch实现“看图说话”(附代码、学习资源)

72360
来自专栏量子位

轻叩次元壁——谈谈真人头像的漫画化

在这篇自带萌点的文章中,作者提出了一种新型模型TwinGAN,可以将真人头像转化成漫画风的卡通头像。打通二次元和三次元的世界的方法,都在这里面了~

19320

扫码关注云+社区

领取腾讯云代金券