如何使用 gensim KeyedVectors 减去和添加向量?

How do I subtract and add vectors with gensim KeyedVectors?

对于我使用 gensim.models.KeyedVectors 的项目(来自 word2vec-google-news-300型号)

不幸的是,我已经尝试过但无法正确完成。

让我们看一下典型的例子queen ~= king - man + woman.
当我想从 king 中减去 man 并添加 woman,
我可以通过

使用 gensim 做到这一点
# model is loaded using gensim.models.KeyedVectors.load()
model.wv.most_similar(positive=["king", "woman"], negative=["man"])[0]

正如预期的那样,returns ('queen', 0.7118192911148071) 对于我使用的模型。

现在,为了通过添加和减去向量(它们都是单位范数)实现相同的效果,我尝试了以下代码:

 vec1, vec2, vec3 = model.wv["king"], model.wv["man"], model.wv["woman"]
 result = model.similar_by_vector(vec1 - vec2 + vec3)[0]
上面代码中的

result('king', 0.7992597222328186),这不是我所期望的。

我的错误是什么?

您的做法通常是正确的,但请注意:

  • most_similar() 方法也取消了其结果中提供的任何命名词的资格 - 所以即使 'king' 是(仍然)最接近结果的词,它将被忽略。在忽略输入词之后,您的公式很可能将 'queen' 作为下一个最接近的词 - 这就是 'analogy' 测试所需要的。

  • most_similar() 方法还对 归一化为单位长度 的向量版本进行向量运算,这可能会导致稍微不同的答案。如果您将 model.wv['king'] 的用途更改为 model.get_vector('king', norm=True),您将获得单位赋范向量。

另见类似的早期回答: