当前位置:   article > 正文

【NLP】余弦定理计算文本相似度

余弦相似度计算文本相似度

881f7334c537894ed8b358aed952f9cb.png

一、 余弦相似概述

余弦相似性通过测量两个向量的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1。

从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。结果是与向量的长度无关的,仅仅与向量的指向方向相关。余弦相似度通常用于正空间,因此给出的值为-1到1之间。

例如在信息检索中,每个词项被赋予不同的维度,而一个维度由一个向量表示,其各个维度上的值对应于该词项在文档中出现的频率。余弦相似度因此可以给出两篇文档在其主题方面的相似度。另外,它通常用于文本挖掘中的文件比较,在数据挖掘领域中,会用到它来度量集群内部的凝聚力。

二、 余弦相似应用场景

原创文章检测:通过文本相似,可以检测公众号文章、论文等是否存在抄袭

垃圾邮件识别:如“诚聘淘宝兼职”、“诚聘打字员”、“文章代写”、“增值税发票”等这样的小广告满天飞,作为网站或者APP的风控,不可能简单的加几个关键字就能进行屏蔽的,一般常用的方法就是标注一部分典型的广告文本,与它相似度高的就进行屏蔽。

内容推荐系统:在腾讯新闻、微博、头条、知乎等,每一篇文章、帖子的下面都有一个推荐阅读,那就是根据一定算法计算出来的相似文章。

冗余新闻过滤:我们每天接触过量的信息,信息之间存在大量的重复,相似度可以帮我们删除这些重复内容,比如,大量相似新闻的过滤筛选。

可用于文本相似的方法非常多,比如基于字符的杰卡德相似、编辑距离相似、最长公共子串等,基于距离的相似也很多,比如汉明距离、欧几里得距离等。本文介绍的是余弦距离相似,比较简单,可以作为风控领域文本相似的入门。

废话不多说,先看一个案例,我们用三句话作为例子,我从自己的邮箱里面扒出来的垃圾邮件,具体步骤如下。

三、 计算文本余弦相似

第一步,分词。

A句子:有/发票/加/薇/45357

B句子:有/发票/加/微/45357

C句子:正规/ 增值税/ 发票

第二步,列出所有的词(所有词的长度作为向量长度)

有,发票,加,薇,微,45357,正规,增值税

第三步,计算词频

A句子:有 1,发票 1,加 1,薇 1,微 0,45357 1,正规 0,增值税 0

B句子:有 1,发票 1,加 1,薇 0,微 1,45357 1,正规 0,增值税 0

C句子:有 0,发票 1,加 0,薇 0,微 0,45357 0,正规 1,增值税 1

第四步,写出词频向量。

A句子:[1, 1, 1, 1, 0, 1, 0 ,0]

B句子:[1, 1, 1, 0, 1, 1, 0 ,0]

C句子:[0, 1, 0, 0, 0, 0, 1 ,1]

到这里,问题就变成了如何计算这两个向量的相似程度。我们可以把它们想象成空间中的两条线段,都是从原点(0, 0, ...)出发,指向不同的方向。两条线段之间形成一个夹角,如果夹角为0度,意味着方向相同、线段重合;如果夹角为90度,意味着形成直角,方向完全不相似;如果夹角为180度,意味着方向正好相反。因此,我们可以通过夹角的大小,来判断向量的相似程度。夹角越小,就代表越相似。

以二维空间为例,上图的a和b是两个向量,我们要计算它们的夹角θ。根据初中知识,余弦定理告诉我们,可以用下面的公式求得:

075b6778e03d61ca15e3953b91736f41.png

假定a向量是[x1, y1],b向量是[x2, y2],那么可以将余弦定理改写成下面的形式:

d2ea32309877c03a0a1046567ed4ec74.png

数学家已经证明,余弦的这种计算方法对n维向量也成立,假定A和B是两个n维向量,A是 [A1, A2, ..., An] ,B是 [B1, B2, ..., Bn] ,则A与B的夹角θ的余弦等于:

3f11e7e0de6f0878ece05787568a20e8.png

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

05bc5f2881021a9b08566bfe0fd350c3.png

下面我们用Python代码计算看看

  1. import numpy as np
  2. A = np.array([1, 1, 1, 1, 0, 1, 0 ,0])
  3. B = np.array([1, 1, 1, 0, 1, 1, 0 ,0])
  4. C = np.array([0, 1, 0, 0, 0, 0, 1 ,1])
  5. #定义相似计算函数
  6. def cos_simi(x,y):
  7.    num = x.dot(y.T)
  8.    denom = np.linalg.norm(x) * np.linalg.norm(y)
  9.    return num / denom
  10. cos_simi(A,B)
  11. 0.7999999999999998
  12. cos_simi(A,C)
  13. 0.2581988897471611
  14. cos_simi(B,C)
  15. 0.2581988897471611

[有/发票/加/薇/45357]  [有/发票/加/微/45357] 只有一个字的差异,相似度0.80

[有/发票/加/薇/45357]  [正规/ 增值税/ 发票] 只有一个词相同,相似度0.2581,结果符合我们的感知。到此,我们就学会了计算两个句子的相似度

 ···  END  ···

 
 
 
 
 
 
 
 
 
 
  1. 往期精彩回顾
  2. 适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
  3. AI基础下载黄海广老师《机器学习课程》视频课黄海广老师《机器学习课程》711页完整版课件

本站qq群955171419,加入微信群请扫码:

1d7b135fdd66db7a79849b7febc6cc02.png

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/950958
推荐阅读
相关标签
  

闽ICP备14008679号