句子的相似度有非常广泛的应用,比如文本搜索、问答系统等。今天我们来看下如何计算两个句子之间的相似度。
我们可以通过计算两个句子之间的欧式距离来判断句子之间的相似度。距离越小则相似度越大。
欧式距离公式为:
d ( X , Y ) = ∣ X − Y ∣ = ∑ i = 1 n ( X i − Y i ) 2 d(X,Y) = | X - Y| = \sqrt{\sum_{i=1}^n (X_i - Y_i)^2} d(X,Y)=∣X−Y∣=i=1∑n(Xi−Yi)2
即两个向量对应元素只差的平方和。
d d d就是两个句子的距离, X X X和 Y Y Y是两个句子的向量。
S 1 S_1 S1:“我们/今天/去/爬山” = (1,0,1,1,0,0,0,0)
S 2 S_2 S2:“你们/昨天/跑步” = (0,0,0,0,0,1,1,1)
S 3 S_3 S3:“你们/又/去/爬山/又/去/跑步” = (0,2,2,1,0,1,0,1)
在上篇文章中我们已经得到这样的句子表示。
那如何计算它们之间的距离呢,比如我们要计算 S 1 S_1 S1和 S 2 S_2 S2的距离。
d ( S 1 , S 2 ) = 1 2 + 0 2 + 1 2 + 1 2 + 0 2 + 1 2 + 1 2 + 1 2 = 6 d(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,S2)=12+02+12+12+02+12+12+12=6
d ( S 1 , S 3 ) = 1 2 + 2 2 + 1 2 + 0 2 + 0 2 + 1 2 + 0 2 + 1 2 = 8 d(S_1,S_3) = \sqrt{1^2 + 2^2 + 1^2 + 0^2 + 0^2 + 1^2 + 0^2 + 1^2} = \sqrt{8} d(S1,S3)=12+22+12+02+02+12+02+12=8
d ( S 2 , S 3 ) = 0 2 + 2 2 + 2 2 + 1 2 + 0 2 + 0 2 + 1 2 + 0 2 = 10 d(S_2,S_3) = \sqrt{0^2 + 2^2 + 2^2 + 1^2 + 0^2 + 0^2 + 1^2 + 0^2} = \sqrt{10} d(S2,S3)=02+22+22+12+02+02+12+02=10
从上面的计算,我们可以看出来, S 1 S_1 S1和 S 2 S_2 S2是最相似的。
我们知道,向量是有方向的,但是欧式距离没有考虑向量的方向。我们下面看的方法可以同时考虑向量的大小和方向。
余弦相似度公式为:
d ( X , Y ) = X ⋅ Y ∣ ∣ X ∣ ∣ × ∣ ∣ Y ∣ ∣ = ∑ i = 1 n X i × Y i ∑ i = 1 n X i 2 × ∑ i = 1 n Y i 2 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}} d(X,Y)=∣∣X∣∣×∣∣Y∣∣X⋅Y=∑i=1nXi2×∑i=1nYi2∑i=1nXi×Yi
就是两个向量的内积除以两个向量模的乘积。计算出来的值越大,则相似度越大。
S 1 S_1 S1:“我们/今天/去/爬山” = (1,0,1,1,0,0,0,0)
S 2 S_2 S2:“你们/昨天/跑步” = (0,0,0,0,0,1,1,1)
S 3 S_3 S3:“你们/又/去/爬山/又/去/跑步” = (0,2,2,1,0,1,0,1)
下面计算它们之间的余弦相似度:
d ( S 1 , S 2 ) = 0 / ? = 0 d(S_1,S_2) = 0/? = 0 d(S1,S2)=0/?=0因为 S 1 ⋅ S 2 = 0 S_1 \cdot S_2=0 S1⋅S2=0,所以它们的余弦相似度就是0,分母不需要计算了。
d ( S 1 , S 3 ) = 0 + 0 + 2 + 1 + 0 + 0 + 0 + 0 1 + 1 + 1 × 2 2 + 2 2 + 1 + 1 + 1 = 3 33 d(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(S1,S3)=1+1+1×22+22+1+1+10+0+2+1+0+0+0+0=333
d ( S 2 , S 3 ) = 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 1 + 1 + 1 × 2 2 + 2 2 + 1 + 1 + 1 = 2 33 d(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}} d(S2,S3)=1+1+1×22+22+1+1+10+0+0+0+0+1+0+1=332
从中我们可以得到,句子 S 1 S_1 S1和 S 3 S_3 S3的相似度是最大的。
和欧式距离计算的结果不同,但是我们看两个句子的话,可以感觉得到这里余弦相似度计算的结果更加正确。