Kaggle 恶意评论分类 top 1 %方案

toxic comment分类赛题题解

DataScience Club@BUAA

https://www.kaggle.com/c/jigsaw-toxic-comment-classification-challenge

赛题描述:给定指定的评论完成6个类别的多标签分类(每条样本可能属于多个类别),大概就是toxic(恶意),severe_toxic(穷凶极恶),obscene(猥琐),threat(恐吓),insult(侮辱),identity_hate(种族歧视)其中几个,评论数据来自于维基百科,数据比较脏,有近百种语言,一般的网站都会做一些敏感词的过滤,所以很多样本就是类似FFFFCCCCKKKK这样的话,甚至还有竖中指的字符画。所以这又不同宇一般的情感分类,如何解决OOV(out of vocab)也是本题一个关键。这篇文章夹杂了比较多的私货,欢迎大家拍砖。

赛题分析

做这个题的时候我自始至终保持的思路是,模型不是重点。如何解决OOV,数据不同源,外文分布差异,不规范词的归一化或者词义单元抽取才是关键。

所以重大突破点主要在以下几点:

1.细致的数据预处理,这部分比较烦杂而且针对数据非常严重。大概就是大量重复字母的剔除 fucccccck -> 去掉很多c。爬虫带来的html痕迹去除。使用词典做词的归一化等等。

2.跨领域的增量式词向量。如何解决把细分领域(toxic 空间)的词向量放入一个已经预训练好的向量空间中,保持其聚类性质,线性性质。对于这部分感兴趣的可以参考论文。

Incrementally Learning the Hierarchical Softmax Function for Neural Language Models(H peng AAAI 2017)

3.pseudo-labelling

这是一种对于有分布差异的数据进行半监督学习增强的方法。具体的原理和操作方法这篇博客讲的很熟悉。

https://www.analyticsvidhya.com/blog/2017/09/pseudo-labelling-semi-supervised-learning-technique/

4.将正常的单词拆分成BPE单位。很对类似于fucker这样的单词,是可以拆分成更细碎的词义单元。使用 BPE(字节对编码)的方式分离单词能达到削减参数,解决不规范词的词义,增加泛化能力的目的。

BPE在翻译中用的很多。大家可以看一下这篇论文。 Transfer Learning across Low-Resource, Related Languages for Neural Machine Translation

5.翻译外文。把俄美中日法蒙等乱七八糟的语言都变成英语。

大概提交的分数的走势如下。短期暴涨是阶段性的融合测试。持续性的上分都是有些技巧,主要是在下面几个位置达到了分数突破。

模型和集成方法

模型主要有以下几个:

GRU based: 单层,双层,average/max/k-max/attention pooling

CNN based: TextCNN, 2DCNN, deliated CNN

capsule based: BiGRU + capsule net

tfidf/hash/count feature based:FM LGB

集成方法:一些比较弱的模型之间做了stacking,复杂模型之间做了blending

总结和思考

在模型上想说一下几点:

1.没有一种模型是万能的,方法 = 模型 + 数据。 之前在我的公众号的一篇文章里讲过, 一般性的认为,数据量小的时候,简单模型和LSTM更适合文本分类。 长文本(文档级别)数据更适合层次结构的模型。

LSTM比CNN更适合情感分类。具体的原因是LSTM能capture一些顺序性的信息,而CNN的卷积核+pooling的结构,对于语序的损失很大。很显然,我今天出去玩很不开心和我今天不出玩很开心明显有不同的感情色彩,这种句子是字典方法和CNN based model的杀手。

2.几个比较有意思的地方,这次我们的模型中使用了最新的capsule net的结构,还有借鉴了图像语义的分割模型中的空洞卷积,取得了不错的效果。这也是从差异性的角度考量做的一些工作,其实我是最不喜欢干这样的事情,个人喜欢追求单模型的极致,追求对数据的充分理解。喜欢简单干净有效的东西,复杂的东西无异于把路做绝,在数据上充分拟合,不能说不好,只能说欣赏不来。

失败的尝试:1.情感词典的使用。一些文本层次的人工特征等。

数据量不足以支撑模型复杂度的时候,不要轻易增加模型的参数规模,包括Embedding层也最好不要trainable.

2. 标签信息的使用,这6个标签是有隐含的关系的,比如server_toxic 的一定属于toxic, 这部分做了lable chain最后也没有啥效果。

一点感受:大家在比赛之中多尝试思考存在于数据和模型上的一些本质的东西,瞎怼和调参是没啥用的,浪费电。多看看论文,也不可全信论文。做比赛9个月来,最大的收获就是习惯性用批判性的眼光看论文,很多论文都是在讲故事,方法是数据上的过拟合。真正强大的东西,是可以直接当特征提取器的,比如resnet, 一篇论文养活了多少家创业公司。

比赛到最后,还是拼融合,也是最无聊和实际中最没有价值的一部分,我们单模型挺高的,不过N人行必有TOP K,基本的融合方法也要谙熟于心。

附上我队友砍手豪大佬对本次比赛所有解答方案的一些总结,https://zhuanlan.zhihu.com/p/34899693?group_id=961190993937268736

他的知乎专栏很精彩,欢迎关注。

欢迎留言指正,回复文本分类获取之前文本分类综述ppt。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180325G0P91S00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券