为什么 Word2Vec 中 model.wv.similarity() 的输出结果与 model.wv.similar() 不同?

Why the output of model.wv.similarity() in Word2Vec results different with model.wv.similar()?

我训练了一个 Word2Vec 模型,我正在尝试使用它。 当我输入'动力'最相似的词时,我得到这样的输出:

动力系统 0.6429724097251892
驱动力 0.5936785936355591
动能 0.5788494348526001
动力车 0.5579575300216675
引擎 0.5339343547821045
推动力 0.5152761936187744
扭力 0.501279354095459
新动力 0.5010953545570374
支撑力 0.48610919713974
精神力量 0.47970670461654663

但问题是,如果我输入 model.wv.similarity('动力','动力系统') 我得到的结果是 0.0,这不等于

0.6429724097251892

更让我困惑的是,当我得到单词'动力'和'驱动力'的下一个相似度时,它显示

3.689349e+19

那为什么呢?我对相似性有误解吗?我需要有人告诉我!! 代码是:

res = model.wv.most_similar('动力')
for r in res:
    print(r[0],r[1])
print(model.wv.similarity('动力','动力系统'))
print(model.wv.similarity('动力','驱动力'))
print(model.wv.similarity('动力','动能'))

输出:

动力系统 0.6429724097251892
驱动力 0.5936785936355591
动能 0.5788494348526001
动力车 0.5579575300216675
引擎 0.5339343547821045
推动力 0.5152761936187744
扭力 0.501279354095459
新动力 0.5010953545570374
支撑力 0.48610919713974
精神力量 0.47970670461654663
0.0
3.689349e+19
2.0

直接从模型中使用相似性方法已被弃用。它有一些额外的逻辑,可以在评估结果之前执行向量归一化。 你应该直接使用vw,因为正如他们的文档中所述,对于词向量来说,它们是如何训练的并不重要,因此它们应该被视为独立的结构,模型只是获得它的手段。

这里是short discussion,如果您想进一步调查,应该可以为您提供起点。

这可能是一个编码问题,您实际上没有在比较相同的标记。

尝试以下方法,看看它是否能提供更接近您预期的结果。

res = model.wv.most_similar('动力')
for r in res:
    print(r[0],r[1])
print(model.wv.similarity('动力', res[0][0]))
print(model.wv.similarity('动力', res[1][0]))
print(model.wv.similarity('动力', res[2][0]))

如果是这样,您可以进一步研究为什么模型可能会报告打印为 动力系统(等)的字符串,但与您输入的代码字符串文字不匹配,例如 [=13] =](等)。例如:

print(res[0][0]=='动力系统')
print(type(res[0][0]))
print(type('动力系统'))

我写了一个函数来替换model.wv.similarity方法。

def Similarity(w1,w2,model):
    A = model[w1]; B = model[w2]
    return sum(A*B)/(pow(sum(pow(A,2)),0.5)*pow(sum(pow(B,2)),0.5)

其中w1w2是您输入的单词,model是您训练的Word2Vec模型。