文本分类

来源:互联网 发布:淘宝网营业执照 编辑:程序博客网 时间:2024/04/28 18:06

FastText 文本分类使用心得

最近在一个项目里使用了fasttext[1], 这是facebook今年开源的一个词向量与文本分类工具,在学术上没有什么创新点,但是好处就是模型简单,训练速度又非常快。我在最近的一个项目里尝试了一下,发现用起来真的很顺手,做出来的结果也可以达到上线使用的标准。

其实fasttext使用的模型与word2vec的CBOW模型在结构上是一样的,不同的在于,word2vec CBOW的目标是通过当前词的前后N个词来预测当前词,在使用层次softmax的时候,huffman树叶子节点处是训练语料里所有词的向量。

而fasttext在进行文本分类时,huffmax树叶子节点处是每一个类别标签的词向量,在训练的过程中,训练语料的每一个词也会得到对应的词向量,输入为一个window内的词对应的词向量,hidden layer为这几个词的线性相加,相加的结果作为该文档的向量,再通过层次softmax得到预测标签,结合文档的真实标签计算loss,梯度与迭代更新词向量。

fasttext还有使用的一个trick就是ngram切分,将长词再通过ngram切分为几个短词,这样对于未登录词也可以通过切出来的ngram词向量合并为一个词。由于中文的词大多比较短,这对英文语料的用处会比中文语料更大。

fasttext还有一个优点是训练速度极快。我们目前使用fasttext来进行客户填写的订单地址到镇这一级别的分类。每一个省份建立一个模型,每个模型要分的类别都有1000多类,200万左右的训练数据,12个线程1分钟不到就可以训练完成,最终的分类准确率与模型鲁棒性都比较高(区县级别分类正确准确率高于99.5%, 镇级别高于98%),尤其是对缩写地名,或者漏写了市级行政区、区县级行政区的情况也都可以正确处理。

参数方面 
1. loss function选用hs(hierarchical softmax)要比ns(negative sampling) 训练速度要快很多倍,并且准确率也更高。

  1. wordNgrams 默认为1,设置为2以上可以明显提高准确率。

  2. 如果词数不是很多,可以把bucket设置的小一点,否则预留会预留太多bucket使模型太大。

因为facebook提供的只是C++版本的代码,原本还以为要自己封装一个Python接口,结果上github一搜已经有封装的python接口了[2]。用起来特别方便,觉得还不能满足自己的使用要求,修改源码也非常方便。

对于同样的文本分类问题,后来还用LSTM+MLP做了一遍,输入同样是embedding 后的词向量, 与fasttext对比,即使使用了GTX 980的GPU,训练速度还是要慢很多,并且怎么调参,最后准确率还是比fasttext的结果略低。看来fasttext在这类问题上确实是简单又实用。

[1]https://github.com/facebookresearch/fastText 
[2]https://github.com/salestock/fastText.py



0 0
原创粉丝点击