业务背景
最近一段时间在今日头条国际化部门实习,做的文本质量工作。主要是文本分类,就是用一些机器学习或者深度学习的方法过滤掉低俗的新闻。因为做的是小语种,比如说法语,德语,意语,泰米尔语等,标注力量特别有限,有些语种甚至找不到标注人员。在这种情况下,要通过模型准确的识别出低俗新闻,难度可想而知。
解决办法:
- 前期在没有标注的情况下,对每个小语种, 通过googletrans得到的一批低俗词,然后利用pre-trained word2vec得到这批低俗词的相似词,用这些低俗词和相似词进行正则匹配,命中则说明低俗,否则认为正常
- 后期在线上积累了一批标注数据后,考虑采用模型进行文本分类。调研了很多文本分类算法,总结如下。
文本分类算法总结
文本预处理
- 分词
- 移除停留词
- 移除低频词
传统文本分类算法
特征工程 + 分类器
特征工程就是将文本转换成固定维度的向量,再送入分类器中进行分类。
特征抽取的方法:
特征工程:
- 向量空间模型
- 词带模型(bag of words,unigram):
- 没有考虑单词之间的顺序,和单词之间的相关性, 对于短文本效果很差
- bag of n-grams:
- 相比于bag of words,考虑了局部之间的顺序信息,但是向量的维度过大。如果单词总数是 |V| | V | ,那么bi-gram单词总数是 |V|2 | V | 2 ,参数过多难以训练
- tfidf
- 设置了特征的权重,即在bow的基础上,使用tfidf权重代替1,但是同样没有考虑单词之间的顺序和单词之间的相关性
- 语义模型
- 设置了特征的权重,即在bow的基础上,使用tfidf权重代替1,但是同样没有考虑单词之间的顺序和单词之间的相关性
- word2vec
- word2vec技术直观上就是将单词映射到向量空间中,可以用来计算单词之间的相似度,后续很多基于深度学习的文本分类算法都利用了word2vec
- fasttext(average word2vec):将所有词向量平均可以得到文本的向量表达,在输入分类器,使用softmax计算各个类别的概率。
http://blog.csdn.net/john_xyz/article/details/79421618 - word2vec * tfidf weight: 不同语fasttext将所有词向量平均,该方法是每个单词的词向量乘上该单词的tfidf权重,然后在求和,从而得到文本的特征表达。
- doc2vec
- LDA
- 计算文档的主题分布,对于长文本效果很好
- LSI
- 基于矩阵分解的思想,计算出文本的语义向量
- 词带模型(bag of words,unigram):
需要注意的是上述特征工程的方法都是无监督学习方法。计算出来的文本特征向量相当于把文本映射到向量空间,可以用来做文本相似度的计算。也就是在没有标签的情况下,可以做文本聚类。
分类器
分类器用的比较多的是LR,SVM,GBDT等,当然还有其他一些分类算法,这里不多赘述。
深度学习文本分类算法
使用深度学习,自动从文本中提取特征,省去了特征工程,实现端到端的训练,得益于深度学习强大的特征表征能力,使用深度学习进行文本分类其效果要往往要好于传统的方法。
- one-hot CNN
- textCNN
- textRNN
- textRNN + attention
- textRCNN