首页 > 解决方案 > 用 gensim 的 fasttext 的 wrapper 训练词嵌入后,如何嵌入新句子?

问题描述

在阅读了 gensim's 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我以前训练过的东西来获得它们?

标签: machine-learningnlpgensimembedding

解决方案


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

wordvecs_obama = [model_gensim[word] for word in sentence_obama]

对于您的 7 字输入句子,您将在wordvecs_obama.

就其固有功能而言,所有 FastText 模型都不会将较长的文本转换为单个向量。(具体来说,您训练的模型没有默认的执行方式。)

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

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

import numpy as np
meanvec_obama = np.array(wordvecs_obama).mean(axis=0)

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


推荐阅读