Python 为什么我得到的余弦相似性结果与库中的结果不同
我尝试使用余弦距离()计算两个单词的相似性。 代码如下:Python 为什么我得到的余弦相似性结果与库中的结果不同,python,nlp,cosine-similarity,edit-distance,Python,Nlp,Cosine Similarity,Edit Distance,我尝试使用余弦距离()计算两个单词的相似性。 代码如下: def word2vec(word): from collections import Counter from math import sqrt # count the characters in word cw = Counter(word) # precomputes a set of the different characters sw = set(cw) # preco
def word2vec(word):
from collections import Counter
from math import sqrt
# count the characters in word
cw = Counter(word)
# precomputes a set of the different characters
sw = set(cw)
# precomputes the "length" of the word vector
lw = sqrt(sum(c*c for c in cw.values()))
# return a tuple
return cw, sw, lw
def cosdis(v1, v2):
# which characters are common to the two words?
common = v1[1].intersection(v2[1])
# by definition of cosine distance we have
return sum(v1[0][ch]*v2[0][ch] for ch in common)/v1[2]/v2[2]
当我调用时,相似性为0.1889822365046136:
cosdis(word2vec('tahu') , word2vec('tempe'))
当尝试使用库(gensim word2vec)与相似性结果进行比较时,结果不同(例如,差异为0.2)。为什么呢?
这是我使用库获得相似性的方式:
from gensim.models import Word2Vec
modelword2vec = Word2Vec.load("/idwiki_word2vec_300.model")
modelword2vec.similarity('tahu' , 'tempe')
相似性为0.21785985没有理由期望它们是相同的。它们的内部结构没有什么相似之处 您展示的
word2vec()
函数是从其他答案复制而来的,它不是人们通常所说的“word2vec”。它计算一个单词中的一些字符数——这对我来说似乎没什么用处,但不管怎样
cosdis();也许这影响了一个单词的实际余弦距离计算,其中每个维度都是一个字符数。(请注意,任何此类“向量”的最大维数为26维,每个字母对应一个维度。)但更好的方法是将cw
计数转换为实际的array
类型,如流行的numpy
库中所示,然后使用明确可靠的余弦距离库实现
另一方面,您的gensim
代码显示加载一个真实的Word2Vec
模型,该模型可能是在真实文本上训练的。因此,它将为每个单词提供密集的、经过学习的语义向量——通常每个词都有100个或更多维度,这与每个单词中的字符数完全无关
当您向该模型询问相似性()
时,它将对这些完整向量执行余弦相似性计算。请注意,余弦相似性和余弦距离不是一回事
基于字符的“向量”在构造/形状/内部值方面与另一个模型中的单词向量不同:因此,即使cosdis()
实际上是余弦相似性的精确实现,您仍然无法获得匹配值 这种基于字符的表示,虽然它是从“word”派生出来的“vector”,但实际上并不是“word2vec”算法的核心内容。但是,您能否在代码中更清楚地说明(1)您正在应用哪些库计算函数,以及它们对测试输入的结果;(2) 对于这些相同的测试输入,您的代码会返回什么?此外,不确定您的cosdis()
是否与“余弦距离”的常用定义相匹配,还请记住,“余弦距离”和“余弦相似性”是相关但不同的:“最近的”单词接近1.0
余弦相似性,但是0.0
cosine-distance.ok我已经编辑了我如何调用库来计算相似性的问题。