我已经训练了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
答案 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('动力系统'))