1

我使用向量来表示单词周围的上下文,我需要相互比较上下文。以下是我的问题的简化版本:

假设我有一个 vector a=[1,1,15,2,0]。然后我有一个向量b=[0,0,15,0,0]c=[1,1,11,0,1]。通过余弦相似度比较两个向量时b最接近a. 但是,由于向量代表上下文c在我的情况下更有意义,因为b它只是一个上下文,恰好有一个与原始单词相同的单词并且具有相同的分数。

我怎么能c以最相似的方式返回?另一个相似性度量?或者也许我的推理在某个地方有缺陷?

正如我所说,这是对我的问题的简化。我已经在对向量进行规范化,并且为了对上下文词进行评分,我正在使用对数似然。

谢谢!

4

1 回答 1

4

使用Jaccard 相似度。在下面的 Python 演示中,请记住函数cosinejaccard返回距离,这是相似度的“倒数”,并阅读评论:

# 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吗?你的任务是什么?如果您想了解更多关于该主题的信息,我强烈推荐这篇博士论文。警告:200 页长。

于 2013-03-16T23:08:38.900 回答