首页 > 解决方案 > 词向量相似精度

问题描述

我正在尝试most_similar手动实现 Gensim 的功能,但计算查询词与另一个词之间的相似度(避免为查询词与所有其他词计算它的时间)。到目前为止,我使用

cossim = (np.dot(a, b)
                   / np.linalg.norm(a)
                   / np.linalg.norm(b))

a这与和之间的相似性结果相同b。我发现这几乎可以正常工作,但是会丢失一些精度,例如

from gensim.models.word2vec import Word2Vec
import gensim.downloader as api

model_gigaword = api.load("glove-wiki-gigaword-300")

a = 'france'
b = 'chirac'

cossim1 = model_gigaword.most_similar(a)
import numpy as np
cossim2 = (np.dot(model_gigaword[a], model_gigaword[b])
                   / np.linalg.norm(model_gigaword[a])
                   / np.linalg.norm(model_gigaword[b]))
print(cossim1)
print(cossim2)

输出:

[('french', 0.7344760894775391), ('paris', 0.6580672264099121), ('belgium', 0.620672345161438), ('spain', 0.573593258857727), ('italy', 0.5643460154533386), ('germany', 0.5567398071289062), ('prohertrib', 0.5564222931861877), ('britain', 0.5553334355354309), ('chirac', 0.5362644195556641), ('switzerland', 0.5320892333984375)]
0.53626436

所以 most_similar 函数给出 0.53626441955...(四舍五入为 0.53626442),用 numpy 计算得到 0.53626436。同样,您可以看到“巴黎”和“意大利”的值之间的差异(与“法国”相比相似)。这些差异表明计算没有完全精确(但它在 Gensim 中)。我该如何修复它并获得单个相似性的输出,以获得更高的精度,就像它来自 most_similar 一样?

TL/DR - 我想使用 function('france', 'chirac') 并获得 0.536264 4195556641,而不是 0.536264 36

知道发生了什么吗?


更新:我应该澄清一下,我想知道并复制 most_similar 如何进行计算,但仅适用于一对 (a,b)。这是我的首要任务,而不是找出如何提高上面我的 cossim 计算的精度。我只是假设两者是等价的。

标签: pythonnumpynlpprecisiongensim

解决方案


为了提高准确性,您可以尝试以下操作:

a = np.array(model_gigaword[a]).astype('float128')
b = np.array(model_gigaword[b]).astype('float128')
cossim = (np.dot(a, b)
                   / np.linalg.norm(a)
                   / np.linalg.norm(b))

向量可能使用较低精度的浮点数,因此在计算中会损失精度。

但是,我得到的结果与为您提供的结果有些不同model_gigaword.most_similar

model_gigaword.similarity: 0.5362644
float64:  0.5362644263010196
float128: 0.53626442630101950744

您可能想检查您的机器上的内容以及您的 Python 版本和gensim.


推荐阅读