我已经训练了一个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发布于 2018-10-18 02:27:51
我编写了一个函数来替换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模型。
发布于 2018-10-17 15:11:46
从模型中直接使用相似方法是不可取的。它有一些额外的逻辑,在评估结果之前执行向量归一化。您应该直接使用vw,因为正如他们的文档中所述,对于单词向量来说,如何训练它们是不重要的,因此它们应该被看作是独立的结构,模型只是获得它的手段。
这是简短讨论,如果您想进一步研究的话,它应该给您提供起点。
发布于 2018-10-17 15:23:56
这可能是一个编码问题,您实际上不是在比较相同的令牌。
尝试下面的方法,看看它是否给出了更接近您预期的结果。
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]))如果是这样的话,您可以进一步了解为什么模型可能报告以动力系统 (etc)形式打印的字符串,但不匹配键入的代码字符串文本(如'动力系统' (etc) )。例如:
print(res[0][0]=='动力系统')
print(type(res[0][0]))
print(type('动力系统'))https://stackoverflow.com/questions/52848365
复制相似问题