1. 为什么要学习FastText
Fext是Facebook公司2016年开源的项目,主要用于构建词向量和文本分类。FastText最大的优点是又快又好,因为本身结构非常简单,只有一层浅层网络,所以模型训练和线上预测的速度非常快,在普通的CPU上也能达到分钟级别的训练速度。不仅如此,在很多分类任务的标准数据集上模型效果也很不错。正因为速度非常快,并且模型效果还不错,所以在工业界应用范围很广。
2. FastText两个功能
FastText主要用于训练词向量和文本分类任务
2.1 训练词向量
FastText一个主要功能是训练词向量,这和word2vec非常相似,有趣的是FastText的主要作者之一就是word2vec的作者,所以说它俩是一脉相承。相比于word2vec来说,FastText主要添加了subwords特性。这里详细介绍下subwords特性,subwords是字母粒度的n-gram。以英文举例,I love NLP。英文会根据空格进行分词,这里会切分成i、love和NLP三个词,词粒度的n-gram(这里假如n为2)则会得到i-love和love-NLP,对于单词love来说字母粒度的n-gram则可以得到I-o、o-v、v-e。字母粒度的n-gram特征可以很好丰富词表示的层次,对于一些未知词可以根据字母粒度的n-gram特征进行更好的表示。
2.2 文本分类
FastText还可以用于文本分类任务,模型结构和word2vec的CBOW非常类似。FastText和word2vec的CBOW模型结构基本上是一样的,区别于word2vec的CBOW模型是根据w3周围的w1、w2、w4和w5来预测w3,属于无监督学习模型,而FastText则根据整句的词w1-w5来预测标签,属于有监督学习任务。FastText将得到的词向量和其他特征相加后取均值作为句向量特征,还会加入n-gram特征。
如上图所示,FastText模型的输入主要包括两部分特征,第一块是词向量特征w1、w2和w3,第二块是n-gram特征w12和w23(这里n设置为2)。将这两部分特征相加之后取均值就得到这句话的语义向量特征,也就是h=(w1+w2+w3+w12+w23)/5。拿到语义向量特征之后就可以通过softmax函数进行分类。因为n-gram特征量级比词向量级大,所以不会全部存储n-gram特征,这里主要通过Hash桶的方式进行存储。将所有的n-gram特征分配到对用的Hash桶中,不仅可以使查询的效率为O(1),而且可以控制内存消耗,但是可能存在不同的n-gram特征分配在同一个桶中,引起hash冲突,但是当分桶的数量设置较大可以有效降低hash冲突。
3. FastText优化项
FastText采用了word2vec的优化流程,基于层次的softmax和负采样。当文本分类的类别很多时通过层次softmax可以有效提升模型的训练速度。
4.源码实战
!pip install fasttext # 豆瓣源
import fasttext.FastText as fasttext
classifier = fasttext.train_supervised(
input = train_cut_path, # 训练文件路径,中文需要进行分词
lable = '__label__', # 标签前缀
lr = 0.01, # 学习率
dim = 300 # 词向量维度
ws = 5, # 内容窗口大小
epoch = 5, # 训练轮数
loss = 'softmax', # 使用的损失函数
minCount = 2, # 最小词频数
wordNgrams = 4, # 词n-gram的长度
)
classifier.save_model(model_path)
# 对于中文来说cut_text是经过分词的文本,k是topk概率的类别,设置-1时返回所有类别
predict_result = classifier.predict(cut_text, k=-1)