为什么 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)
其中w1
和w2
是您输入的单词,model
是您训练的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
直接从模型中使用相似性方法已被弃用。它有一些额外的逻辑,可以在评估结果之前执行向量归一化。 你应该直接使用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)
其中w1
和w2
是您输入的单词,model
是您训练的Word2Vec模型。