9.6 fastText网络#

9.2节9.4节内容中我们分介绍了Word2Vec和GloVe这两种词向量模型的原理,可以发现它们有一个共同的特点就是都是以词为粒度来训练其对应的词向量。在接下来的这节内容中,我们将会介绍另外一种从此的形态学来训练词向量的模型。

9.6.1 fastText动机#

尽管同一个词根可以派生得到不同词,但是在Word2Vec和GloVe这两种模型中并没有从形态学的角度来考虑词向量的生成。例如对于interesting和interested这两个词来说,虽然它们都有共同的词根interest,但是在Word2Vec和GloVe中却将这三者看成了完全不同的3个词来对待,而这将导致如果某些词在语料中出现的频次过低,那么模型将难以准确学到这些词对应的词嵌入表示。

基于这样的动机,元宇宙公司研究院(Facebook AI Research, FAIR)博扬诺夫斯基(Bojanowski)等人[1]于2017年基于9.2.4节˙中的跳元模型提出了一种从形态学角度来考虑词向量的子词(Subword)嵌入模型——fastText。fastText模型的核心思想是将一个词以N-gram的形式分割成若干字词部分,然后利用跳元模型的思想为每个子词学习得到一个嵌入式表示,最后将每个词各个子词对应的向量累加起来作为该词的向量化表示。通过这样的方式让具有相似结构的词之间共享来自子词的向量表示,fastText便可以捕捉到更加细粒度的语义信息从而提高了词向量的表达能力,同时对于词表中未出现的词也可以通过子词间的组合得到该词的词向量表示。

9.6.2 fastText原理#

整体上来说fastText的原理是在跳元模型的基础上引入了字符级别的$N$-gram子词嵌入策略,即将一个词以$N$-gram($3\leq N \leq 6$)的方式划分成若干子词,然后采用模型为每个子词训练得到一个词向两,最后将该词所有子词的词向量求和得到最终的词向量表示。

对于语料中的每个词来说,首先需要在其首尾分别加上<>符以区分与其它单词的前后缀;然后再以不同取值$N$将其划分为$N$-gram子词并同该词本身构成整个语料对应的词表。以单词where为例,首先在首尾分别加上<><where>;然后分别构建当$N=3$时其对应的子词集<whwhehererere>,当$N=4$时的子词集<whewherhereere>,当$N=5$时的子词集<wherwherehere>,当$N=6$时的子词集<wherewhere>,以及特殊子词<where>。这样便得到了单词where的子词集。最后以同样的方式构造得到所有单词的子词集便形成了最终的词表。

在fastText中对于任意词$w$来说,用$\mathcal{G}_w$表示其对应的$N$-gram子词及其对应的特殊子词的合集,并假设$z_g$是词表中子词$g$对应的向量,则在跳元模型模型中,词$w$的词向量$v_w$是其所有子词向量的和[2]

$$ v_w=\sum_{g\in\mathcal{G_w}}z_g\tag{9-25} $$

对于其它部分的建模过程fastText与9.2.4节中介绍的跳元模型模型一致,这里就不再赘述。

同时,对于中文语料来说fastText模型会先使用斯坦福大学开源的斯坦福分词模型(Stanford Word Segmenter)[3] [4]进行普通的分词处理;然后同样也在每个词的首尾加上符号<> ;最后对于每个词来说以$N$-gram构建子词集,例如当$N=6$时,词<跟我一起学深度学习>的子词有<跟我一起学跟我一起学深我一起学深度一起学深度学起学深度学习学深度学习>

9.6.3 fastText库介绍#

对于fastText模型的使用有两种途径,第1种是借助Gensim库中的gensim.models.FastText模块,其包括预训练词向量的载入和训练等,使用方法同9.3节类似这里就不再赘述,各位读者可以直接查阅官方文档[5];第2种则是借助Facebook AI研究院开源的fastText库[6]。

图 9-14 fastText库

fastText是由FAIR开发的一个用于文本分类和词向量学习的开源库,支持多语言文本处理并且在低资源情况下的文本分类任务中有良好的性能。除此之外fastText库还提供了简单易用的API和命令行工具,使得模型的训练和预测非常方便。在大规模数据集上,fastText具有高效的训练和推理速度,使其成为处理大规模文本数据的强大工具。

9.6.4 词向量的使用与训练#

1. 词向量使用

在fastText官网[6]中一共开源了157种语言的预训练模型,且均包含txtbin两种格式,前者同9.3节中Word2Vec一样因此也可以通过Gensim库里的KeyedVectors.load_word2vec_format()函数载入,后者则只能通过fastText库中的fasttext.load_model()函数载入使用。在使用之前需要通过命令pip install --upgrade fasttext安装fastText库,然后便可以通过如下方式进行载入使用:

 1 def load_fasttext_model():
 2     path_to_model = os.path.join(DATA_HOME, 'Pretrained', 'fasttext', 'cc.zh.300.bin')
 3     ft = fasttext.load_model(path_to_model)
 4     logging.info(f"词向量的维度: {ft.get_dimension()}")
 5     logging.info(f"中国: {ft.get_word_vector('中国')}")
 6     logging.info(f"与中国最相似的5个词为: {ft.get_nearest_neighbors('中国', k=5)}")
 7     reduce_model(ft, 100) 
 8     logging.info(f"词向量的维度: {ft.get_dimension()}")
 9     path_to_model = os.path.join(DATA_HOME, 'Pretrained', 'fasttext', 'cc.zh.100.bin')
10     ft.save_model(path_to_model)

57