fastText
fastText是一个用于高效学习词表示和句子分类的库。
目录
资源
模型
- 最新的最先进英语词向量。
- 在维基百科和网络爬虫上训练的157种语言的词向量。
- 语言识别和各种监督任务的模型。
补充数据
- [2]中使用的预处理YFCC100M数据。
常见问题
速查表
我们还提供了一个包含有用的单行命令的速查表。
要求
我们使用circleci在各种Docker镜像下持续构建和测试我们的库、CLI和Python绑定。
通常,fastText可以在现代Mac OS和Linux发行版上构建。 由于它使用了一些C++11特性,因此需要支持C++11的编译器。 这些包括:
- (g++-4.7.2或更新版本)或(clang-3.3或更新版本)
编译使用Makefile进行,所以你需要有一个可用的make。 如果你想使用cmake,你需要至少2.8.9版本。
我们成功构建和测试CLI的最老的发行版之一是Debian jessie。
对于词相似度评估脚本,你需要:
- Python 2.6或更新版本
- NumPy & SciPy
对于Python绑定(参见python子目录),你需要:
- Python 2.7或>=3.4版本
- NumPy & SciPy
- pybind11
我们成功构建和测试Python绑定的最老的发行版之一是Debian jessie。
如果这些要求使你无法使用fastText,请开一个issue,我们会尽力满足你的需求。
构建fastText
我们讨论构建fastText的最新稳定版本。
获取源代码
你可以在常规位置找到我们的最新稳定版本。
还有master分支,其中包含我们最新的所有工作,但伴随着不稳定分支的所有常见警告。如果你是开发者或高级用户,可能会想使用这个。
使用make构建fastText(推荐)
$ wget https://github.com/facebookresearch/fastText/archive/v0.9.2.zip
$ unzip v0.9.2.zip
$ cd fastText-0.9.2
$ make
这将为所有类以及主二进制文件fasttext
生成对象文件。
如果你不打算使用默认的系统级编译器,请更新Makefile开头定义的两个宏(CC和INCLUDES)。
使用cmake构建fastText
目前这不是发布版本的一部分,所以你需要克隆master分支。
$ git clone https://github.com/facebookresearch/fastText.git
$ cd fastText
$ mkdir build && cd build && cmake ..
$ make && make install
这将创建fasttext二进制文件以及所有相关库(共享、静态、PIC)。
构建Python版fastText
目前这不是发布版本的一部分,所以你需要克隆master分支。
$ git clone https://github.com/facebookresearch/fastText.git
$ cd fastText
$ pip install .
有关更多信息和介绍,请参见python/README.md
使用示例
这个库有两个主要用例:词表示学习和文本分类。 这些在1和2两篇论文中有描述。
词表示学习
为了学习词向量,如1中所述,执行:
$ ./fasttext skipgram -input data.txt -output model
其中data.txt
是包含UTF-8
编码文本的训练文件。
默认情况下,词向量将考虑3到6个字符的字符n-gram。
优化结束时,程序将保存两个文件:model.bin
和model.vec
。
model.vec
是一个文本文件,每行包含一个词向量。
model.bin
是一个二进制文件,包含模型参数以及字典和所有超参数。
二进制文件可以在以后用于计算词向量或重新开始优化。
获取词表外单词的词向量
之前训练的模型可以用来计算词表外单词的词向量。
如果你有一个文本文件queries.txt
,包含你想计算向量的单词,使用以下命令:
$ ./fasttext print-word-vectors model.bin < queries.txt
这将输出词向量到标准输出,每行一个向量。 这也可以与管道一起使用:
$ cat queries.txt | ./fasttext print-word-vectors model.bin
查看提供的脚本以获取示例。例如,运行:
$ ./word-vector-example.sh
将编译代码、下载数据、计算词向量并在罕见词相似度数据集RW [Thang et al. 2013]上评估它们。
文本分类
这个库也可以用来训练监督文本分类器,例如用于情感分析。 为了使用2中描述的方法训练文本分类器,使用:
$ ./fasttext supervised -input train.txt -output model
其中train.txt
是一个文本文件,每行包含一个训练句子和标签。
默认情况下,我们假设标签是以字符串__label__
为前缀的单词。
这将输出两个文件:model.bin
和model.vec
。
模型训练完成后,你可以通过在测试集上计算k的精确率和召回率(P@k和R@k)来评估它:
$ ./fasttext test model.bin test.txt k
参数k
是可选的,默认为1
。
为了获取一段文本的k个最可能的标签,使用:
$ ./fasttext predict model.bin test.txt k
或使用predict-prob
来同时获取每个标签的概率
$ ./fasttext predict-prob model.bin test.txt k
其中test.txt
包含每行一个要分类的文本片段。
这样做会将每行k个最可能的标签打印到标准输出。
参数k
是可选的,默认为1
。
查看classification-example.sh
以获取使用示例。
为了重现2论文中的结果,运行classification-results.sh
,这将下载所有数据集并重现表1中的结果。
如果你想计算句子或段落的向量表示,请使用:
$ ./fasttext print-sentence-vectors model.bin < text.txt
这假设text.txt
文件包含你想获取向量的段落。
程序将在文件中每行输出一个向量表示。
你也可以使用以下命令量化监督模型以减少其内存使用:
$ ./fasttext quantize -output model
这将创建一个内存占用更小的.ftz
文件。所有标准功能,如test
或predict
,在量化模型上的工作方式相同:
$ ./fasttext test model.ftz test.txt
量化过程遵循3中描述的步骤。你可以运行脚本quantization-example.sh
作为示例。
完整文档
不带参数调用命令以列出可用参数及其默认值:
$ ./fasttext supervised
输入或输出路径为空。
以下参数是必需的:
-input 训练文件路径
-output 输出文件路径
以下参数为可选项:
-verbose 详细程度级别 [2]
以下字典相关参数为可选项:
-minCount 词语最少出现次数 [1]
-minCountLabel 标签最少出现次数 [0]
-wordNgrams 词语n元组最大长度 [1]
-bucket 桶的数量 [2000000]
-minn 字符n元组最小长度 [0]
-maxn 字符n元组最大长度 [0]
-t 采样阈值 [0.0001]
-label 标签前缀 [__label__]
以下训练相关参数为可选项:
-lr 学习率 [0.1]
-lrUpdateRate 学习率更新频率 [100]
-dim 词向量维度 [100]
-ws 上下文窗口大小 [5]
-epoch 训练轮数 [5]
-neg 负采样数量 [5]
-loss 损失函数 {ns, hs, softmax} [softmax]
-thread 线程数 [12]
-pretrainedVectors 用于监督学习的预训练词向量 []
-saveOutput 是否保存输出参数 [0]
以下量化相关参数为可选项:
-cutoff 保留的词语和n元组数量 [0]
-retrain 应用截断时是否微调嵌入 [0]
-qnorm 是否单独量化范数 [0]
-qout 是否量化分类器 [0]
-dsub 每个子向量的大小 [2]
默认值可能因模式而异。(词表示模式 `skipgram` 和 `cbow` 使用默认的 `-minCount` 值为 5。)
## 参考文献
如果使用此代码学习词表示,请引用 [1](#enriching-word-vectors-with-subword-information);如果用于文本分类,请引用 [2](#bag-of-tricks-for-efficient-text-classification)。
### 用子词信息丰富词向量
[1] P. Bojanowski\*, E. Grave\*, A. Joulin, T. Mikolov, [*用子词信息丰富词向量*](https://arxiv.org/abs/1607.04606)
@article{bojanowski2017enriching, title={Enriching Word Vectors with Subword Information}, author={Bojanowski, Piotr and Grave, Edouard and Joulin, Armand and Mikolov, Tomas}, journal={Transactions of the Association for Computational Linguistics}, volume={5}, year={2017}, issn={2307-387X}, pages={135--146} }
### 高效文本分类的技巧包
[2] A. Joulin, E. Grave, P. Bojanowski, T. Mikolov, [*高效文本分类的技巧包*](https://arxiv.org/abs/1607.01759)
@InProceedings{joulin2017bag, title={Bag of Tricks for Efficient Text Classification}, author={Joulin, Armand and Grave, Edouard and Bojanowski, Piotr and Mikolov, Tomas}, booktitle={Proceedings of the 15th Conference of the European Chapter of the Association for Computational Linguistics: Volume 2, Short Papers}, month={April}, year={2017}, publisher={Association for Computational Linguistics}, pages={427--431}, }
### FastText.zip: 压缩文本分类模型
[3] A. Joulin, E. Grave, P. Bojanowski, M. Douze, H. Jégou, T. Mikolov, [*FastText.zip: 压缩文本分类模型*](https://arxiv.org/abs/1612.03651)
@article{joulin2016fasttext, title={FastText.zip: Compressing text classification models}, author={Joulin, Armand and Grave, Edouard and Bojanowski, Piotr and Douze, Matthijs and J{'e}gou, H{'e}rve and Mikolov, Tomas}, journal={arXiv preprint arXiv:1612.03651}, year={2016} }
(\* 这些作者贡献相同。)
## 加入 fastText 社区
* Facebook 页面:https://www.facebook.com/groups/1174547215919768
* Google 群组:https://groups.google.com/forum/#!forum/fasttext-library
* 联系方式:[egrave@fb.com](mailto:egrave@fb.com), [bojanowski@fb.com](mailto:bojanowski@fb.com), [ajoulin@fb.com](mailto:ajoulin@fb.com), [tmikolov@fb.com](mailto:tmikolov@fb.com)
查看 CONTRIBUTING 文件了解如何提供帮助。
## 许可证
fastText 采用 MIT 许可证。