作者:刘智静 | 腾讯内容安全平台中心工程师
“网络喷子”群体的出现,使新闻文章中的谩骂评论屡见不鲜。为了净化平台和保证用户体验,如何自动拦截谩骂评论是亟待解决的问题。本文旨在利用卷积神经网络构建谩骂评论的自动识别模型,用机器对抗喷子。
新闻文章的评论中,经常会出现谩骂评论,包括对新闻当事人的辱骂、对小编的问候以及评论回复中对楼主的攻击等,不仅会影响平台的品质和逼格,更主要的是会影响用户体验。所以如何减少谩骂评论的出现是一个值得解决的问题。但由于评论数量的量级较大,依靠人工审核并不现实。我们的目的是建立谩骂评论的自动识别算法,用模型拦截脏言脏语。
下面总结了建模的一些思路和流程,纯属拙见,欢迎大家拍砖斧正。
(高能预警:前方大量谩骂语句出没。)
首先,聊一下建模过程中的心路历程和解题思路。
提到识别谩骂评论,如果你下意识地想到直接用关键词过滤,毕竟谩骂词汇是有限的,那么说明你对网友的创造力一无所知。我们想象中的评论是这样子的(用词分明,尊重每一个谩骂词的价值,让它们存在即谩骂):
但其实它们也可以是酱紫的:
和酱婶儿的:
也就是说设置关键词确实可以拦截掉部分谩骂评论,但会出现两个大问题。首先,如果选取关键词时追求准确率(也就是减少误伤),那么必然会导致关键词的覆盖度不够;反之,如果选取关键词时追求召回率(也就是减少误放),那么很多和谩骂沾边的词都必须选进来,但是如果对命中这些词的评论一棍子干掉,可想而知精确率会有多么得惨不忍睹。比如上面例子中的包含“他*的”、“垃圾”、“*痹”等词语的评论,不能一概而论地全判成谩骂或全判为非谩骂。
所以纯策略这条路是走不通的,必须召唤算法了。因为这是一个二分类问题,可以考虑很多的分类算法,这里决定采用神经网络(因为平时主要研究深度学习方面的算法,才不是因为惧怕特征工程的支配)。对于这种短文本分类,最先想到的就是经典的 TextCNN模型。实验证明,它的表现确实也优于其他的网络模型。
训练好网络模型后,发现测试效果差强人意,所以纯算法的效果也有待提升。 鲁迅曾经说过,团结就是力量。当我们采用“策略+算法”的模型时,就发现效果确实比单用算法好,达到了期望值。
以上就是整个建模过程中的思路。接下来将在一二部分简单介绍数据来源和前期准备,第三部分介绍网络模型的选择和调参优化,最后一部分介绍最终的模型流程。
样本数据主要来自于人工标注。
首先要做的是确定标注标准,每个人对谩骂的容忍度是不一样的,需要统一标准。比如地域黑类型、人格型(“智*”、“*类”)等等是否要被打击。
然后就要进行一言难尽的标注工作。在这个过程中,可以 学习 总结各式各样的谩骂词汇和句式,为之后建模做准备。(上面列举出的谩骂评论例子都是轻量入门级的,还有更多的不堪入耳辣眼睛的评论,标注完之后世界都不一样了。)
最后将样本集划分成训练集、验证集和测试集。
前期准备主要包括两部分。第一部分是建立谩骂词表,为后续分类算法做准备;第二部分是对每条样本评论做预处理,包括分词、特殊字符的处理等。
首先,建立一份谩骂词表,包含常用的谩骂词(这个时候标注时积累的知识就派上用场了)。
然后把谩骂词分成两大类,一类属于黑名单词,评论中出现该词则基本可视为谩骂;另一类属于疑似谩骂词,评论中出现该词很可能是谩骂,但在具体语境或者断句中也许并不是。这样分类的目的是提高模型准确率(后面会提到)。
具体分类方法是,针对每个谩骂词,统计它的命中准确率(包含该词的谩骂评论数/包含该词的评论数)。根据命中准确率排序,划分黑名单词和疑似谩骂词。
在输入网络模型之前,需要对每条评论进行预处理。
首先,英文转成小写。去掉特殊字符。设置最大长度进行截断(根据标注经验,谩骂一般出现在文末总结部分,因此这里是从右向左截取)。
然后,为了对比不同分割粒度下模型的效果,分别对评论进行以下三种处理:
jieba
库对评论进行分词。注:分词后不去停用词。原因是谩骂中经常涉及到常用的停用词,比如“你”“他”“我”等等,去掉停用词反而会损失很多信息。
模型选择包括对网络结构的选取、文本划分粒度的选取以及网络中参数的设置。
采用 Yoon Kim 提出的TextCNN。网络结构如下图:
具体结构是:
在选取网络结构的时候,有尝试采用 Char-CNN、LSTM 等其他网络,但最终结果显示 TextCNN 的表现最好。
对于句子的划分单元,最开始是采用常规做法,将句子分词处理。后面受到 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,4,5 的 filter 各 100 个。考虑到按字拆分时,不同窗口大小选取的字段的有效性不同,因此配置不同的 filter 个数。多次实验后,最终将 filter 的长度选取为 1/2/3/4/5/6/8,个数分别为 50,100,150,150,200,150,100。
最后,为了防止训练过程中的梯度弥散问题,在卷积层中加入了 batch normalization。
如上文所述,最终模型采用的是“策略+算法”的组合方式。具体的流程图如下:
加入策略后,可以进一步提高模型的准确率。优点是让模型聚焦在命中疑似谩骂词的评论上,同时不会误伤正常评论(否则经常出现莫名其妙的误判);缺点则是损失召回率,使其依赖于谩骂词的选取。
所以之后需要进一步跟踪谩骂词的表现:
下表是加入策略前后,模型在测试集上的效果:
模型 | 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 删除。