小姐姐如何利用TextCNN识别脏话

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

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

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

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

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

一、基本思想

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

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

我就想知道有关部门到底是哪个部门(非谩骂

为了满足自己那卑微的虚荣心,把你祖宗的脸丢到腾讯这里来!傻*!谩骂

不**脸的东西!(谩骂

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

管他*的多少,反正中国片都是脑*片,我从来不看,喜欢看的人都是s*。(谩骂

他*的!总结的太好了!佩服!(非谩骂

和酱婶儿的:

麻*!中国人的脸被这*圾丢到国际上了。(谩骂

成天抵制………真感觉自己有多强一样……井底之蛙 自己的强不是靠抵制换来的 除了能麻痹自己 能浪费税收 还能干什么(非谩骂

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

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

训练好网络模型后,发现测试效果差强人意,所以纯算法的效果也有待提升。

鲁迅曾经说过,团结就是力量。当我们采用“策略+算法”的模型时,就发现效果确实比单用算法好,达到了期望值。

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

二、数据来源

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

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

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

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

三. 前期准备

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

1、谩骂词分类

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

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

黑名单词:二*、妈*、*mp 等。

疑似谩骂词:上面提到的“他*的”、“垃圾”、“*痹”等词,以及“s*it”、“f*ck”这种高危字等。

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

2.评论预处理

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

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

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

字粒度:逐字拆分。

词粒度:分词处理,利用分词工具 jieba 库对评论进行分词。

拼音粒度:拆字或分词后,将字或词的拼音作为输入。

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

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

三. 模型选择

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

1.网络结构

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

结论:

按字拆分效果最佳;

按词拆分效果不如按字拆分,原因可能是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

实验表明,策略的加入确实能提升模型的效果。最终模型在测试集上的精确率为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.

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180321A1PFRU00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券