引言

句子的相似度有非常广泛的应用,比如文本搜索、问答系统等。今天我们来看下如何计算两个句子之间的相似度。

欧氏距离

我们可以通过计算两个句子之间的欧式距离来判断句子之间的相似度。距离越小则相似度越大。

欧式距离公式为:
d(X,Y)=XY=i=1n(XiYi)2 d(X,Y) = | X - Y| = \sqrt{\sum_{i=1}^n (X_i - Y_i)^2}

即两个向量对应元素只差的平方和。

dd就是两个句子的距离,XXYY是两个句子的向量。

S1S_1:“我们/今天/去/爬山” = (1,0,1,1,0,0,0,0)
S2S_2:“你们/昨天/跑步” = (0,0,0,0,0,1,1,1)
S3S_3:“你们/又/去/爬山/又/去/跑步” = (0,2,2,1,0,1,0,1)

上篇文章中我们已经得到这样的句子表示。

那如何计算它们之间的距离呢,比如我们要计算S1S_1S2S_2的距离。

d(S1,S2)=12+02+12+12+02+12+12+12=6d(S_1,S_2) = \sqrt{1^2 + 0^2 + 1^2 + 1^2 + 0^2 + 1^2 + 1^2 + 1^2} = \sqrt{6}
d(S1,S3)=12+22+12+02+02+12+02+12=8d(S_1,S_3) = \sqrt{1^2 + 2^2 + 1^2 + 0^2 + 0^2 + 1^2 + 0^2 + 1^2} = \sqrt{8}
d(S2,S3)=02+22+22+12+02+02+12+02=10d(S_2,S_3) = \sqrt{0^2 + 2^2 + 2^2 + 1^2 + 0^2 + 0^2 + 1^2 + 0^2} = \sqrt{10}

从上面的计算,我们可以看出来,S1S_1S2S_2是最相似的。

我们知道,向量是有方向的,但是欧式距离没有考虑向量的方向。我们下面看的方法可以同时考虑向量的大小和方向。

余弦相似度

余弦相似度公式为:
d(X,Y)=XYX×Y=i=1nXi×Yii=1nXi2×i=1nYi2 d(X,Y) = \frac{X \cdot Y}{||X|| \times ||Y||} = \frac{\sum_{i=1}^n X_i \times Y_i}{\sqrt{\sum_{i=1}^n X_i^2} \times \sqrt{\sum_{i=1}^n Y_i^2}}

就是两个向量的内积除以两个向量模的乘积。计算出来的值越大,则相似度越大

自然语言处理——句子的相似度
余弦相似度和欧式距离的区别见上图。

S1S_1:“我们/今天/去/爬山” = (1,0,1,1,0,0,0,0)
S2S_2:“你们/昨天/跑步” = (0,0,0,0,0,1,1,1)
S3S_3:“你们/又/去/爬山/又/去/跑步” = (0,2,2,1,0,1,0,1)
下面计算它们之间的余弦相似度:
d(S1,S2)=0/?=0d(S_1,S_2) = 0/? = 0因为S1S2=0S_1 \cdot S_2=0,所以它们的余弦相似度就是0,分母不需要计算了。
d(S1,S3)=0+0+2+1+0+0+0+01+1+1×22+22+1+1+1=333d(S_1,S_3) = \frac{0+0+2+1+0+0+0+0}{\sqrt{1+1+1} \times \sqrt{2^2+2^2+1+1+1}} = \frac{3}{\sqrt{33}}
d(S2,S3)=0+0+0+0+0+1+0+11+1+1×22+22+1+1+1=233d(S_2,S_3) = \frac{0+0+0+0+0+1+0+1}{\sqrt{1+1+1} \times \sqrt{2^2+2^2+1+1+1}} = \frac{2}{\sqrt{33}}

从中我们可以得到,句子S1S_1S3S_3的相似度是最大的。

和欧式距离计算的结果不同,但是我们看两个句子的话,可以感觉得到这里余弦相似度计算的结果更加正确。

参考

  1. 贪心学院课程
  2. https://www.it610.com/article/3203002.htm

相关文章: