2

对于我使用gensim.models.KeyedVectors(来自模型)的项目,我需要添加和减去词向量word2vec-google-news-300

不幸的是,我已经尝试过,但无法正确地做到这一点。

让我们看一下流行的例子Queen ~= 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)这不是我所期望的。

我的错误是什么?

4

1 回答 1

0

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

  • most_similar()方法还取消其结果中提供的任何命名单词的资格 - 因此即使'king'(仍然)是最接近结果的单词,它也会被忽略。在忽略输入词之后,你的公式很可能'queen'是下一个最接近的词——这就是“类比”测试所需要的。

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

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

于 2021-01-07T18:06:35.547 回答