FastText
简介
FastText是Facebook研究团队创建的一个库,用于高效计算word representation和执行文本分类,可以在几秒内完成其他算法几天才可以完成的任务。
这个库在NLP社区获得了用户的大量支持,并且可能替代gensim包,它提供了像Word Vectors(词向量)功能。
区别
word2vec将每个词视为要找到向量表征的最小单位,但FastText假定一个词由n个字符组成。例如,阳光由[sun ,sunn,sunny],[sunny,unny,nny]等,其中n的范围是从1到词语的长度。
fastText的表示方法比word2vec或glove要多出以下几个优点。
- 找到罕见词的向量表示是有帮助的。由于罕见词仍然可以被分解成字符n-gram,所以它们可以与通用字共享这些n-gram。
- 它可以给出词典中不存在的字(OOV字)的向量表示,因为这些字也可以分解成字符n-gram。
- word2vec和glove都不能对词典中不存在的词提供字的向量。
- 字符n-gram在更小的数据集上比word2vec和glove更出色。
- 对于可能永远都不在任何语料库,gensim可能会去选择以下两个解决方案中的任意一个零向量 或具有低幅度的随机向量。FastText通过将该词分成数据块,并使用这些数据块的向量来创建这个词的最终向量,从而可以产生比随机向量更好的向量。
与word2vec
相同
- 图模型结构很像,都是采用embedding向量的形式,得到word的隐向量表达。
- 都采用很多相似的优化方法,比如使用Hierarchical softmax优化训练和预测中的打分速度。
不同
- word2vec是一个无监督算法,而fasttext是一个有监督算法。
- word2vec的学习目标是skip的word,而fasttext的学习目标是人工标注的分类结果。
- word2vec要求训练样本带有“序”的属性,而fasttext使用的是bag of words的思想,使用的是n-gram的无序属性。
与深度神经网络
- fasttext只有1层神经网络,属于所谓的shallow learning,但是fasttext的效果并不差,而且具备学习和预测速度快的优势,在工业界这点非常重要。
- 比一般的神经网络模型的精确度还要高。
- 训练和评估速度快几百倍。10分钟内就可以在一台多核CPU训练10亿词汇。1分种内完成100万句子在31万中类型中的分类。
训练
1 | ./fasttext skipgram -input file.txt -output model |
- 运行上述命令将创建两个名为model.bin和model.vec的文件。
- model.bin包含模型参数,字典和超参数,可用于计算词向量。
- model.vec是一个文本文件,其中每行包含一个词的词向量。
使用
根据创建的词向量,做一些常见的任务,比如寻找类似的词,类比等。
输出词向量
1 | ./fasttext print-word-vectors model.bin < queries.txt |
要检查一个词的词向量,而且不保存到一个文件中,可以这样做1
echo "word" | ./fasttext print-word-vectors model.bin
找到相似词
寻找最相似于给定词语的词,该功能由nn参数提供。1
./fasttext nn model.bin
键入上述命令后,终端将要求您输入查询词。1
2
3
4
5happy
$ ./fasttext nn model.bin
Query word? happy
with 0.211394
which 0.174745
上面的结果是和happy最相似的词。 此功能也可用于修正拼写错误。例如,当您输入错误的拼写时,它会显示在训练文件中出现的词的正确拼写。1
2
3
4
5
6wrd
Query word? wrd
words 0.186589
word 0.179257
skip-gram 0.173146
类比
FastText字向量也可以用于类别任务,A,B和C3个词,什么对于C等同于B对于A?
这里,A,B和C是词。1
2
3
4./fasttext analogies model.bin
$ ./fasttext analogies model.bin
Loading model model.bin
Query triplet (A - B + C)?
上述命令将要求输入A-B+C格式的字,但是我们只需要用空格分隔三个字。1
2
3
4
5Query triplet (A - B + C)? happy sad angry
and 0.217641
with 0.178739
which 0.114323
在一个非常大的语料库上进行训练会产生更好的结果。
文本分类
文本分类是使用特定的类标来标记文本中的每个文档。情感分析和电子邮件分类是文本分类的典型例子。
训练我们的模型的文本文件的默认格式应该是label
其中label是类的前缀,而
训练分类器
1 | ./fasttext supervised -input train.ft.txt -output model_kaggle-label |
这里,参数与创建word representation时所提到的参数相同。
如果不想使用默认参数来训练模型,则可以在训练时间内指定它们。例如,如果您明确要指定训练过程的学习率,则可以使用参数-lr 来指定学习速率。
1 | ./fasttext supervised-input train.ft.txt-output model_kaggle -lr0.5 |
可以调整的其他可用参数是:
-lr:学习速率[0.1]
-lrUpdateRate:更改学习率的更新速率[100]
-dim :字向量大小[100]
-ws:上下文窗口的大小[5]
-epoch:历元数[5]
-neg:抽样数量[5]
-loss:损失函数 {ns,hs,softmax} [ns]
-thread:线程数[12]
-pretrainedVectors:用于监督学习的预培训字向量
-saveOutput:输出参数是否应该保存[0]
方括号[]中的值表示传递的参数的默认值。
测试结果
1 | ./fasttext test model_kaggle.bin test.ft.txt |
N 400000
P@1 0.916
R@1 0.916
预测测试数据集
1 | ./fasttext predict model_kaggle.bin test.ft.txt |
预测前3名标签
1 | ./fasttext predict model_kaggle.bin test.ft.txt 3 |
计算句子向量(受监督)
1 | echo "this is a sample sentence" | ./fasttext print-sentence-vectors model_kaggle.bin |
优点和缺点
优点
- 与实现相同精度的其他方法相比,该库的速度惊人。
- 句子向量(被监督)可以很容易的计算。
- 与gensim相比,fastText在小数据集上的运行效果更好。
- 在语义性能上,fastText在语法表现和FAIR语言表现都优于gensim。
缺点
- 不是NLP的独立库,因为它将需要另一个库进行预处理步骤。
- 虽然,这个库有一个python实现,但它没有得到官方支持。