我使用向量来表示单词的上下文,我需要将上下文相互比较。以下是我的问题的简化版本:
假设我有一个向量a=[1,1,15,2,0]
。然后我有一个向量b=[0,0,15,0,0]
和c=[1,1,11,0,1]
。当通过余弦相似性比较两个向量时,b
最接近a
。但是,由于向量表示上下文c
在我的情况下更有意义,因为b
只是一个上下文,恰好有一个单词与原始单词相同并且具有相同的分数。
我如何以最相似的方式返回c
?另一个相似度量?或者也许我的推理在某处有缺陷?
正如我所说,这是我问题的简化。我已经对向量进行了规范化并对上下文单词进行评分,我正在使用对数似然。
谢谢!
答案 0 :(得分:4)
使用Jaccard similarity。在下面的Python演示中,请记住函数cosine
和jaccard
返回距离,这是相似性的“反向”,并阅读注释:
# Input all the data
In [19]: from scipy.spatial.distance import cosine, jaccard
In [24]: a
Out[24]: array([ 1, 1, 15, 2, 0])
In [25]: b
Out[25]: array([ 0, 0, 15, 0, 0])
In [26]: c
Out[26]: array([ 1, 1, 11, 0, 1])
# Calculate cosine similarity. I've scaled it by a factor of 100 for legibility
In [20]: 100*cosine(a,b)
Out[20]: 1.3072457560346473
In [21]: 100*cosine(c,a)
Out[21]: 1.3267032349480568
# Note c is slightly "further away" from a than b.
# Now let's see what Mr Jaccard has to say
In [28]: jaccard(a,b)
Out[28]: 0.75
In [29]: jaccard(a,c)
Out[29]: 0.59999999999999998
# Behold the desired effect- c is now considerably closer to a than b
# Sanity check- the distance between a and a is 0
In [30]: jaccard(a,a)
Out[30]: 0.0
PS存在更多的相似性度量,并且每种度量在不同情况下都是适当的。您是否有充分的理由相信c
应该与a
更相似而不是b
?你的任务是什么?如果您想详细了解该主题,我强烈推荐this PhD thesis。警告:长达200页。