标点符(钱魏 Way)

使用余弦定理计算文本相似度

什么是余弦定理

学过向量代数的人都知道,向量实际上是多维空间中有方向的线段。如果两个向量的方向一致,即夹角接近零,那么这两个向量就相近。而要确定两个向量方向是否一致,这就要用到余弦定理计算向量的夹角了。

余弦定理对我们每个人都不陌生,它描述了三角形中任何一个夹角和三个边的关系,换句话说,给定三角形的三条边,我们可以用余弦定理求出三角形各个角的角度。假定三角形的三条边为 a, b 和 c,对应的三个角为 A, B 和 C,那么角 A 的余弦:

cosA

如果我们将三角形的两边 b 和 c 看成是两个向量,那么上述公式等价于:

cosA2

其中分母表示两个向量 b 和 c 的长度,分子表示两个向量的内积。举一个具体的例子,假如文本X 和文本 Y 对应向量分别是

  • x1,x2,…,x64000
  • y1,y2,…,y64000

那么它们夹角的余弦等于:

cos

当两个文本向量夹角的余弦等于1时,这两个文本完全重复;当夹角的余弦接近于一时,两条新闻相似;夹角的余弦越小,两条文本越不相关。

计算文本相似度的大致流程

假设有下面两个句子:

  • A:我喜欢看电视,不喜欢看电影。
  • B:我不喜欢看电视,也不喜欢看电影。

第一步:分词

  • A:我/喜欢/看/电视,不/喜欢/看/电影。
  • B:我/不/喜欢/看/电视,也/不/喜欢/看/电影。

第二步:列出所有的词、字

我,喜欢,看,电视,电影,不,也

第三步:计算词频

  • A:我 1,喜欢 2,看 2,电视 1,电影 1,不 1,也 0。
  • B:我 1,喜欢 2,看 2,电视 1,电影 1,不 2,也 1。

第四步:描述词频向量

  • A:[1, 2, 2, 1, 1, 1, 0]
  • B:[1, 2, 2, 1, 1, 2, 1]

第五步:计算夹角余弦

使用这个公式,我们就可以得到,句子A与句子B的夹角的余弦。

余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫”余弦相似性”。所以,上面的句子A和句子B是很相似。

实际使用过程需要注意的事项

  • 实际使用中文本长度可能过长,如果采用分词,复杂度较高,可以采用TF-IDF的方式找出文章若干个关键词(比如20个),再进行比较。
  • 文章的长度可能不一致,所以关键词词频率可以使用相对词频率。
  • 由于计算中打乱了关键词出现的顺序,所以即使夹角余弦的值为1,也有可能文本并不重复。比如:
    • A:我喜欢看电视,不喜欢看电影。
    • B:我不喜欢看电视,喜欢看电影。

使用Python进行文本相似度计算

参考文章:

码字很辛苦,转载请注明来自标点符《使用余弦定理计算文本相似度》

评论