用gensim的fasttext的包装器训练单词嵌入后,如何嵌入新句子?

时间:2019-07-17 15:39:01

标签: machine-learning nlp gensim embedding

阅读gensim的docs上的教程后,我不明白从经过训练的模型生成新嵌入的正确方法是什么。到目前为止,我已经训练过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
)

然后,假设我要获取与此句子关联的嵌入向量:

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

如何用我以前训练过的model_gensim来获得他们?

1 个答案:

答案 0 :(得分:1)

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

<div class="container">
<div class="sub-container">Child</div>
</div>

对于7个单词的输入句子,您将在wordvecs_obama = [model_gensim[word] for word in sentence_obama] 中有7个单词向量的列表。

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

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

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

gensim

根据您的最终目的,类似的操作可能仍然有用。 (但是,该平均值对分类没有用,就好像单词向量最初是在那种FastText模式下使用已知标签针对该目标进行训练的。)