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

时间:2018-10-17 06:16:28

标签: word2vec

我已经训练了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

3 个答案:

答案 0 :(得分:1)

我写了一个函数来替换select方法。

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) w1是您输入的单词,w2是您训练的Word2Vec模型。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

请尝试以下操作,以查看结果是否接近您的预期。

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]))

如果确实如此,您可以进一步研究模型为什么会报告打印为动力系统(等)但与'动力系统'这样的键入字符串文字不匹配的字符串(等等)。例如:

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