垃圾评论识别

1.目的:主要是识别广告、黄反、脏话这几种类型的评论,如果评论里包含这些,那我们就认为他是垃圾评论。

2.输入数据:用户评论。 输出数据:是否为垃圾评论的标签,是为1,否为0,其实就是一个二分类的问题。

3.所用方法:策略 + 算法。

训练数据:因为在进行训练的时候,我们是有标注数据的。我们先制定了垃圾评论的一个标注标准,然后把数据给mark去标注。后来在mark试标的时候,发现标注的质量不高,因为每个人对垃圾评论的容忍度不同,虽然制定了标准,但是还是有每个人的主观性在里面。所以我们想了一下,就采用我们自己先提供个标签给mark,就是说一条评论,我们给出“是/否”的标签,让用户判断对不对。发现这样子不仅质量提高了,标注速度也变快了。最后总共标注了4w的垃圾评论,4w的正常评论。

我们怎么提供标签:因为我们主要判断的垃圾评论是含有广告、黄反、脏话这类的,广告的话是比较好判断的,一般有广告的评论里面含有url、电话、qq号等,然后黄反和脏话我们有一个很大的词表,所以使用匹配的方法,先给评论初步打个标签。

为什么不直接用策略?因为首先广告的话有硬广有软广,硬广就是刚才说的那些有url、电话之类的,软广是那种“过年吃得太多了,不过我有小脂音,一点都不怕怕”,这种就无法通过之前的识别方法来判断。词表匹配,设置关键词确实可以拦截掉部分谩骂评论,但会出现两个大问题。首先,如果选取关键词时追求准确率(也就是减少误伤),那么必然会导致关键词的覆盖度不够;反之,如果选取关键词时追求召回率(也就是减少误放),那么很多和谩骂沾边的词都必须选进来,但是如果对命中这些词的评论一棍子干掉,可想而知精确率会有多么得惨不忍睹。比如上面例子中的包含“他*的”、“垃圾”、“*痹”等词语的评论,不能一概而论地全判成谩骂或全判为非谩骂。还有就是有的网友会用各种错别字,首字母,火星文等来替代敏感词,这种使用词表的话是添加不完的。

算法我们采用的是fasttext,刚开始的时候就是直接把数据喂给fasttext来训练,因为fasttext训练速度很快,并且最后的识别的精度也能达到90%以上,可以作为一个baseline。但是我们只用fasttext的时候发现,在我们划分的测试集上,精度能达到有96%,准召也都在90%以上。但是在我们从评论库中随机抽的2000条评论的验证集上,表现却不是很好,因为这2000条评论中,垃圾评论还是占少数,也就是数据集是不平衡的。所以我们后期就想用策略+算法的方法来进行优化。

策略的话,其实就是做了一些特征工程。

增加的特征有:评论中是否存在url、电话(固定长度)、qq号。这些基本上是只要一出现,我们就认为是广告评论,就是垃圾评论。

还有就是我们之前有一个很大的词表,我们给mark去标注的时候,也是看如果命中了这个词表中的词,我们就认为是黄反、脏话之类的,就是垃圾评论。但是因为这个表中有些词是有歧义的,就比如说“性服务”,有的评论是“这个餐厅里有个男性服务员”,很正常的一句话,如果单纯按照匹配就标为垃圾的话,就不太合适了。所以我们在做策略的时候,是统计了一些这个大词表中的词,如果评论中出现了这个词,那这条评论被mark标记为垃圾评论的概率,然后按照从大到小的顺序排列。如果这个词出现了,90%的概率为垃圾,那么这个评论我们就直接认为是垃圾评论。

这样先用策略输出了一部分垃圾评论,最后给模型输入的,就是疑似广告和黄反脏话等的垃圾言论,这样模型就更聚焦,不会误伤过多的正常评论。

4. 做了哪些预处理:

采用的预处理:过滤了表情,颜文字、和特殊符号。设置了评论文本的最大长度,这里我们设定的是200个字,如果超过的话,截断的时候是从右往左截断,这里是因为标注的时候我们发现,一般广告啊,黄反、脏话之类的,广告词和这些黄反、脏话词都很大概率会在后边出现,比如一个小说下的评论,前面会说“写得真精彩”之类的,然后到最后几句了,会说“谁谁谁写得xxx也不错,欢迎回访”之类的。

5. 使用fasttext的时候,我们尝试了三种粒度的输入,一种是字粒度,一种是词粒度,一种是拼音粒度。

字粒度就是逐字进行拆分,词粒度是用了百度NLP部门提供的分词工具进行分词(这边我们还使用了自定义的词表,因为发现有的词切分的不太准确),还有一种拼音粒度,是当拆分成字或词后,转化成拼音,然后作为输入。

这里我们没有去除停用词,一个是因为发现垃圾评论经常很短,这种评论分完词去除停用词之后,往往就只剩下一个词了,反而去掉了很多有用的信息,因为很多骂人是 动词+代词 这样的结构。

最后尝试下来  字粒度的召回最好,拼音的虽然召回也不错,但是准确率太低了。因为我们使用的是一个python的转为pinyin的包,这样是增加了脏话的拼音词出现的概率,但是也会对正常的造成误判。加了策略之后的模型在不平衡的测试集上,有原来的准确率64%,召回86%,提升到了准确率有85%,召回有93%。已经达到了上线要求。

6.为什么选择Fasttext?

因为评论大多数都是短文本,所以当时选模型的时候就先排除了LSTM这些RNN的模型。

因为RNN的一个好处是考虑了整个文本,而像垃圾评论这种,只需要考虑有广告的,有脏话/黄反的这一部分。

因此我们就对比尝试了一下Fasttext 和 textcnn,比较下来的结果textcnn要优于fasttext,但textcnn训练起来太慢了,要训练十几个小时,而使用fasttext半小时之内就能得到结果。

因为这个模型我们之后还想通过上线后,积累一些正样本来继续训练优化我们的模型,所以使用了fasttext。

之后需要收集更多训练样本,优化网络结构,进一步提高模型的表现效果。

猜你喜欢

转载自blog.csdn.net/baidu_33718858/article/details/81210914
今日推荐