如何使用 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)
,您将获得单位赋范向量。
另见类似的早期回答:
对于我使用 gensim.models.KeyedVectors 的项目(来自 word2vec-google-news-300
型号)
不幸的是,我已经尝试过但无法正确完成。
让我们看一下典型的例子queen ~= king - man + woman.
当我想从 king 中减去 man 并添加 woman,
我可以通过
# 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)
,您将获得单位赋范向量。
另见类似的早期回答: