引言

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

欧氏距离

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

欧式距离公式为:
自然语言处理——句子的相似度_自然语言处理

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

自然语言处理——句子的相似度_欧式距离相似度_02就是两个句子的距离,自然语言处理——句子的相似度_自然语言处理_03自然语言处理——句子的相似度_句子相似度_04是两个句子的向量。

自然语言处理——句子的相似度_余弦相似度_05:“我们/今天/去/爬山” ​​​= (1,0,1,1,0,0,0,0)​​​自然语言处理——句子的相似度_相似度_06:“你们/昨天/跑步” ​​= (0,0,0,0,0,1,1,1)​自然语言处理——句子的相似度_自然语言处理_07:“你们/又/去/爬山/又/去/跑步” ​​= (0,2,2,1,0,1,0,1)​

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

那如何计算它们之间的距离呢,比如我们要计算自然语言处理——句子的相似度_余弦相似度_05自然语言处理——句子的相似度_相似度_06的距离。

自然语言处理——句子的相似度_自然语言处理_10
自然语言处理——句子的相似度_余弦相似度_11
自然语言处理——句子的相似度_相似度_12

从上面的计算,我们可以看出来,自然语言处理——句子的相似度_余弦相似度_05自然语言处理——句子的相似度_相似度_06是最相似的。

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

余弦相似度

余弦相似度公式为:
自然语言处理——句子的相似度_欧式距离相似度_15

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

自然语言处理——句子的相似度_相似度_16


余弦相似度和欧式距离的区别见上图。

自然语言处理——句子的相似度_余弦相似度_05:“我们/今天/去/爬山” ​​​= (1,0,1,1,0,0,0,0)​​​自然语言处理——句子的相似度_相似度_06:“你们/昨天/跑步” ​​= (0,0,0,0,0,1,1,1)​自然语言处理——句子的相似度_自然语言处理_07:“你们/又/去/爬山/又/去/跑步” ​​= (0,2,2,1,0,1,0,1)​​ 下面计算它们之间的余弦相似度:
自然语言处理——句子的相似度_余弦相似度_20因为自然语言处理——句子的相似度_自然语言处理_21,所以它们的余弦相似度就是0,分母不需要计算了。
自然语言处理——句子的相似度_句子相似度_22
自然语言处理——句子的相似度_句子相似度_23

从中我们可以得到,句子自然语言处理——句子的相似度_余弦相似度_05自然语言处理——句子的相似度_自然语言处理_07的相似度是最大的。

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

参考

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