给定一个词向量(而不是单词本身),获取最相似的单词。

24

使用 gensim.models.Word2Vec 库,您可以提供一个模型和一个“单词”,以便查找最相似的单词列表:

model = gensim.models.Word2Vec.load_word2vec_format(model_file, binary=True)
model.most_similar(positive=[WORD], topn=N)

我想知道是否有可能将模型和“向量”作为输入提供给系统,然后要求系统返回与给定向量非常接近的前几个相似单词。类似于:

model.most_similar(positive=[VECTOR], topn=N)

我需要在双语环境中使用此功能,其中我有两种模型(英语和德语),以及一些英语单词,我需要找到它们最相似的德语候选者。 我的目标是从英语模型中获取每个英语单词的向量:

model_EN = gensim.models.Word2Vec.load_word2vec_format(model_file_EN, binary=True)
vector_w_en=model_EN[WORD_EN]

然后使用这些向量查询德语模型。

model_DE = gensim.models.Word2Vec.load_word2vec_format(model_file_DE, binary=True)
model_DE.most_similar(positive=[vector_w_en], topn=N)

我已经使用word2vec包中的原始距离函数在C语言中实现了这个功能。但是,现在我需要将它转换为Python语言,以便能够与我的其他脚本集成。

您是否知道是否已经有gensim.models.Word2Vec库或其他类似的库来完成此操作?还是我需要自己实现它?


most_similar(..) 会返回分数吗?我想象中你会编写一个自定义函数,对向量中的每个单词调用 most_similar,将所有结果添加到同一个列表中,然后按分数排序并返回。 - nbryans
感谢nbryans。如果没有现成的方法可以实现这个功能,我必须按照以下步骤进行实现:对于词汇表中的每个单词,从模型中获取其相应的向量。计算输入向量和返回向量之间的余弦相似度。然后返回最相似的前几个。但是,我认为可能存在这样的方法;但事实并非如此。 - amin
1
嗨阿明,你实现了你的方法吗?如果是这样,我很想知道为什么你使用余弦相似度而不是欧几里得距离? - N. F.
嗨@MiNdFrEaK,我自己实现了它。其实那并不是什么大不了的事情,但当时我只是想知道是否已经有人实现过,我可以直接使用。不幸的是,就在那之后不久,我停止了对该主题的研究。我需要查看我的代码以找到我的实现。一旦我找到它,我会让你知道的。 - amin
2个回答

30

方法similar_by_vector通过向量返回相似度最高的前N个单词:

similar_by_vector(vector, topn=10, restrict_vocab=None)

0

我认为你试图实现的东西不可能给出精确的答案。因为两个模型是分开训练的。尽管英语模型和德语模型之间的词向量距离相似,但是没有保证“House”的词向量方向与“Haus”的词向量方向相同。

简单来说,如果您使用vector size = 3训练了两个模型。举个例子,如果“House”有一个[0.5,0.2,0.9]的向量,就不能保证“Haus”会有一个[0.5,0.2,0.9]或者接近于它的向量。

为了解决这个问题,您可以先将英语单词翻译成德语,然后使用该单词的向量在德语模型中查找类似的单词。

简而言之,您不能仅仅将一个语言模型的向量插入到另一个模型中并期望获得准确的结果。


如果嵌入是分别训练的并且在两个不同的空间中,那么你说得对。当时我尝试的是联合训练双语词嵌入或通过可训练的映射函数和一些词汇表或平行语料库将两种语言的嵌入映射到共享空间中。 - amin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接