python - 词向量相似精度
问题描述
我正在尝试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 计算的精度。我只是假设两者是等价的。
解决方案
为了提高准确性,您可以尝试以下操作:
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
.
推荐阅读
- c# - 在 Word 中查找所有红色文本
- c++ - 从 dll 中调整向量大小时,为什么会出现堆损坏?
- php - 如何在PHP中字符串的特定位置插入破折号
- docker - 无法在 localhost:3000 访问 docker
- node.js - 从 GraphQL 中的 REST API 调用中获取 null
- c# - 如何分配通用 ObservableCollection
到已知 T 参数的 ObservableCollection? - reactjs - react native 中是否有类似于 android 的资源限定符?
- reactjs - 无法在 react-native 中发出网络请求
- ios - 如何将 xib 文件加载为自定义类?
- python - 如何替换子字符串,但前提是它恰好出现在两个单词之间