Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我得到的余弦相似性结果与库中的结果不同_Python_Nlp_Cosine Similarity_Edit Distance - Fatal编程技术网

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我已经编辑了我如何调用库来计算相似性的问题。