用gensim的fasttext的wrapper训练词嵌入后,如何嵌入新的句子?

ano*_*non 1 nlp machine-learning embedding gensim

阅读 gensim文档中的教程后,我不明白从训练模型生成新嵌入的正确方法是什么。到目前为止,我已经训练了 gensim 的快速文本嵌入,如下所示:

from gensim.models.fasttext import FastText as FT_gensim

model_gensim = FT_gensim(size=100)

# build the vocabulary
model_gensim.build_vocab(corpus_file=corpus_file)

# train the model
model_gensim.train(
    corpus_file=corpus_file, epochs=model_gensim.epochs,
    total_examples=model_gensim.corpus_count, total_words=model_gensim.corpus_total_words
)
Run Code Online (Sandbox Code Playgroud)

然后,假设我想获得与这些句子相关的嵌入向量:

sentence_obama = 'Obama speaks to the media in Illinois'.lower().split()
sentence_president = 'The president greets the press in Chicago'.lower().split()
Run Code Online (Sandbox Code Playgroud)

我怎样才能让他们得到model_gensim我以前训练过的东西?

goj*_*omo 5

您可以依次查找每个单词的向量:

wordvecs_obama = [model_gensim[word] for word in sentence_obama]
Run Code Online (Sandbox Code Playgroud)

对于 7 个单词的输入句子,您将在wordvecs_obama.

由于其固有功能,所有 FastText 模型都不会将较长的文本转换为单个向量。(特别是,您训练的模型没有默认的执行方式。)

原始 Facebook FastText 代码中有一个“分类模式”,它涉及不同的训练风格,其中文本在训练时与已知标签相关联,并且在训练期间将句子的所有词向量组合在一起,当模型后来要求对新文本进行分类。但是,gensimFastText的实现目前不支持这种模式,因为它gensim的目标是提供无监督而不是有监督的算法。

您可以通过将这些词向量平均在一起来近似 FastText 模式的作用:

import numpy as np
meanvec_obama = np.array(wordvecs_obama).mean(axis=0)
Run Code Online (Sandbox Code Playgroud)

根据您的最终目的,类似的东西可能仍然有用。(但是,该平均值对于分类没有那么有用,就好像词向量最初是在 FastText 模式下针对该目标训练的那样有用,具有已知的标签。)