安装:
直接pip install fasttext可能会安装失败,可使用pip install fasttext-wheel命令;
在v0.9.2版本中,预测是出现告警 Warning : `load_model` does not return WordVectorModel or SupervisedModel any more, but a `FastText`,非报错,提通过添加下述代码解决:
import fasttext
fasttext.FastText.eprint = lambda x: None
fasttext是一个单隐层的线性分类器,结构上是CBOW的一个简单改进,将输出由中心词改为了分类标签,输入改为整个句子的n-gram(分词)。
与CBOW的不同:输入层不再是滑动窗口的上下文单词,而是整个句字的分词(包括分字和字符层级的分词)输出层不再是中心词,而是分类标签,意味着输出矩阵不再是V ∗ D V* DV∗D,而是N ∗ D N * DN∗D,V是词库长度,D是词向量的维度,N是分类种类,
输入层包括正常的单词,n-grams和字符级的n-grams(subword)。n-grams可以保留部分语序信息。采用字符级别的n-grams是因为英语等语言中有词根的概念,将词拆分成字符n-grams也可以保留含义,同时可以解决部分OOV的问题。
如对于n=3的subword,对于“where”这个词会加上<>来进行单词间的划分,这个词可以被分为:
<wh, whe, her, ere, re>和<where>拆分的her和单词her的表示不同,单词her在subwords中为<her>。subword+n-grams之后,输入量是此前只输入单词的好几倍甚至几十倍,这里可以用哈希特征。Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一地确定输入值。
模型压缩
考虑上文subword采用的哈希特征,可以通过降低hash特征的长度(buckets)来减少内存,这样会增加哈希冲突。考虑到模型设计n-grams和字符级n-grams,所以最终模型较大(几百MB),采用product quanntizers和词表剪枝的方法来实现。
FastText有两个库:gensim:from gensim.models.fasttext import FastText
fasttext :from fasttext import FastText
训练时需要输入样本的路径,文件可以是txt、csv格式(暂时只用过这两种)
有监督的文本分类任务时,需要使用__label__XXX为样本做标注
使用predict方法时,model.predict(text, k=1, threshold=threshold),text为处理后的文本,k代表返回大于threshold的label数量。
无监督任务时,只需将分词好的样本使用空格连接即可。
在gensim的fasttext中查看词向量需要进入wv包,如FastText().wv["word"];而在fasttext中直接使用["word"]查询即可,在gensim的fasttext中,获取词与序号的方法。
AttributeError: The vocab attribute was removed from KeyedVector in Gensim 4.0.0. Use KeyedVector's .key_to_index dict, .index_to_key list, methods .get_vecattr(key, attr) and .set_vecattr(key, attr, new_val) instead.
使用gensim的fasttext线上增加词时,需要在训练时就加入build_vocab(),否则报错如下:
RuntimeError: You cannot do an online vocabulary-update of a model which has no prior vocabulary.
First build the vocabulary of your model with a corpus before doing an online update.
gensim的fasttext保存和加载词向量模型
# model.save("")
# model = FastText.load("")
# model.wv.save_word2vec_format('./data/test_fasttext.txt', binary=False) # 存有词及其对应的向量值
# model.wv.save_word2vec_format('./data/test_fasttext.bin', binary=True) # 文件以二进制流的方式保存
参数解释:
1. model: skip-gram,给定当前词汇预测上下文单词;CBOW 是通过上下文预测当前单词。官方建议是 skip-gram比较快,但是CBOW虽然比较慢,但是精度会高一点。
2. lr: 学习率,一般会在0.1左右,太高会报错,太低会训练的比较慢。
3. epoch: epoch 要与 lr 结合考虑,一般不需要超过50次。
4. dim: 得到的向量的维度,语料比较大的话,设置为300,一般语料相应的降低,具体的多大规模设置多少维度,可以尝试50到300,step=50 测试。
5. ws, window size, 表示当前词与预测词在一个句子中的最大距离。
6. wordNgrams,默认是使用 1-gram,就是单独的词,可以尝试 bi-gram(wordNgrams=2),就是每两个word作为一个unit,词数增加。如果英文的可以考虑,因为英文的每个word就是一个单词,而中文(建议是1)分好词的基础上训练,设置为1就好,当然可以测试 bi-gram 的情况。
7. loss 默认是 negtive sample, 含义是普通的softmax方法,再输出层每次再保留目标单词的同时,不采用所有的词,而是仅激活其中的一部分(比如100个)单词同 目标单词 作为输出层维度(总词数)。默认是 ns, 用hs的要更多一些,可以进行实验对比。
8. bucket, 基本没有介绍,应该是最多处理多少个词,一般默认就好了。
9. minCount, 词频处理,默认是5,词频小于5的词汇不考虑(直接删除掉),如果语料比较大,为1就好了,不用考虑,词频太低,基本学习不到。
FastText 与 Word2Vec
文本相似度分析时,可以用 gensim 中的 word2vec 来构建词向量以描述词语之间的矢量关系,实现相似度的计算。但 word2vec 无法推断出不熟悉的单词的向量(fast_text官网也有同样描述)。
单词的词法结构会携带有关单词含义的重要信息,传统的单词嵌入不考虑这些信息,二是为每个单词训练唯一的单词嵌入。FastText 通过将每个单词视为其子单词的集合来解决此问题,将子词视为该词的字符n-gram(n元)。一个单词的向量被简单地认为是其组成特征图的所有向量之和。
与原始Word2Vec相比,FastText在语法任务上的表现更好,当语料库较小时,在语义任务上,Word2Vec的性能略优于FastText。随着训练语料库大小的增加,差异变得越来越小。
如果训练数据中至少有一个字符,可以通过其组成部分字符的向量,获取词表外单词向量。
参考:
高效文本分类工具:fastText_Neways谭的博客-CSDN博客_文本分类工具
极简使用︱Gensim-FastText 词向量训练以及OOV(out-of-word)问题有效解决_悟乙己的博客-CSDN博客_gensim训练fasttext (FastText使用)
gensim-fast2vec改造、灵活使用大规模外部词向量(具备OOV查询能力)_悟乙己的博客-CSDN博客
解决安装fasttext 失败 ERROR: Command errored out with exit status 1:_lei_qi的博客-CSDN博客_fasttext 安装失败
GitHub - facebookresearch/fastText: Library for fast text representation and classification.
Text classification · fastText
Pytorch实现FastText模型对AG_news数据集进行四分类预测(torchtext实现数据预处理) - 灰信网(软件开发博客聚合)
中文版详解gensim中的FastText模块(官方文档翻译)_越来越胖的GuanRunwei的博客-CSDN博客_gensim fasttext