如何使用 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]

正如预期的那样,它为我使用的模型返回 ('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),这不是我所期望的。

我的错误是什么?

解决方法

您通常在做正确的事情,但请注意:

  • arr 方法还会从其结果中排除任何提供的命名词 - 因此即使 most_similar() 是(仍然)与结果最接近的词,它也会被忽略。在忽略输入词之后,您的公式很可能将 'king' 作为下一个最接近的词 - 这就是“类比”测试所需要的。

  • 'queen' 方法还对归一化为单位长度的向量版本进行向量算术,这可能会导致略有不同的答案。如果您将 most_similar() 的使用更改为 model.wv['king'],您将获得单位规范向量。

另见类似的早期答案:https://stackoverflow.com/a/65065084/130288