1. 使用simhash计算文本相似度
2. 使用余弦相似度计算文本相似度
3. 使用编辑距离计算文本相似度
4. jaccard系数计算文本相似度


2.向量余弦计算文本相似度

2.1 原理

余弦相似性:两个向量的夹角越接近于0,其余弦值越接近于1,表面两个向量越相似。

向量夹角余弦计算:

cosα=x1⋅x2+y1⋅y2x12+y12×x22+y22cos α = \frac{x_1·x_2 + y_1·y_2}{\sqrt{x_1^2+y_1^2}×\sqrt{x_2^2+y_2^2}}cosα=x12​+y12​​×x22​+y22​​x1​⋅x2​+y1​⋅y2​​

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

  • 分词
  • 合并
  • 计算特征值
  • 向量化
  • 计算向量夹角余弦值

对于两段文本A和B,对其进行分词,得到两个词列表:

A=[t1,t2,⋯,ti]A=[t_1, t_2, \cdots, t_i]A=[t1​,t2​,⋯,ti​]

B=[t1,t2,⋯,tj]B=[t_1, t_2, \cdots, t_j]B=[t1​,t2​,⋯,tj​]

对两个词列表进行合并去重,得到输入样本中的所有词:

T(A,B)=T(A)+T(B)=[t1,t2,⋯,tk]T(A,B)=T(A)+T(B)=[t_1,t_2, \cdots , t_k]T(A,B)=T(A)+T(B)=[t1​,t2​,⋯,tk​]

计算特征值:

选取词频作为特征值。

F(A)=[fA1,fA2,⋯,fAk]F(A)=[f_{A_1},f_{A_2},\cdots,f_{A_k}]F(A)=[fA1​​,fA2​​,⋯,fAk​​]
F(B)=[fB1,fB1,⋯,fBk]F(B)=[f_{B_1},f_{B_1},\cdots,f_{B_k}]F(B)=[fB1​​,fB1​​,⋯,fBk​​]

向量化
A⃗=(fA1,fA2,⋯,fAk)\vec{A}=(f_{A_1},f_{A_2},\cdots,f_{A_k})A=(fA1​​,fA2​​,⋯,fAk​​)
B⃗=(fB1,fB2,⋯,fBk)\vec{B}=(f_{B_1},f_{B_2},\cdots,f_{B_k})B=(fB1​​,fB2​​,⋯,fBk​​)

计算余弦值:

cosα=∑i=1kfAi⋅fBi∑i=1k(fAi)2⋅∑i=1k(fBi)2cos α = \frac{\sum_{i=1}^{k}f_{A_i}·f_{B_i}}{\sqrt{\sum_{i=1}^{k}(f_{A_i})^2}·\sqrt{\sum_{i=1}^{k}(f_{B_i})^2}}cosα=∑i=1k​(fAi​​)2​⋅∑i=1k​(fBi​​)2​∑i=1k​fAi​​⋅fBi​​​

2.2举例

样本1( A ):今天天气真好,适合去逛街,也适合晒太阳。

样本2( B ):今天天气不错,适合去玩,也适合去晒太阳。

样本3( C ):小明不喜欢和小红玩,因为小明不喜欢太阳。

分词:

A=[今天, 天气, 真好, 适合, 去, 逛街, 也, 适合, 晒太阳]
B=[今天, 天气, 不错, 适合, 去, 玩, 也, 适合, 去, 晒太阳]
C=[小明, 不, 喜欢, 和, 小, 红, 玩, 因为, 小明, 不, 喜欢, 太阳]

合并并去重:

[今天, 天气, 真好, 适合, 去, 逛街, 也, 晒太阳, 小明, 不, 喜欢, 和, 小, 红, 玩, 因为, 太阳, 不错]

特征值(词频)计算:

F(A) = [今天:1, 天气:1, 真好:1, 适合:2, 去:1, 逛街:1, 也:1, 晒太阳:1, 小明:0, 不:0, 喜欢:0, 和:0, 小:0, 红:0, 玩:0, 因为:0, 太阳:0, 不错:0]F(B) = [今天:1, 天气:1, 真好:0, 适合:2, 去:2, 逛街:0, 也:1, 晒太阳:1, 小明:0, 不:0, 喜欢:0, 和:0, 小:0, 红:0, 玩:1, 因为:0, 太阳:0, 不错:1]F(C) = [今天:1, 天气:1, 真好:0, 适合:2, 去:2, 逛街:0, 也:1, 晒太阳:1, 小明:2, 不:2, 喜欢:2, 和:1, 小:1, 红:1, 玩:2, 因为:1, 太阳:1, 不错:1]

向量化:

A⃗=(1,1,1,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0)\vec{A}=(1, 1, 1, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)A=(1,1,1,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0)

B⃗=(1,1,0,2,2,0,1,1,0,0,0,0,0,0,1,0,0,1)\vec{B}=(1, 1, 0, 2, 2, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1)B=(1,1,0,2,2,0,1,1,0,0,0,0,0,0,1,0,0,1)

C⃗=(1,1,0,2,2,0,1,1,2,2,2,1,1,1,2,1,1,1)\vec{C}=(1, 1, 0, 2, 2, 0, 1, 1, 2, 2, 2, 1, 1, 1, 2, 1, 1, 1)C=(1,1,0,2,2,0,1,1,2,2,2,1,1,1,2,1,1,1)

计算余弦:

cosA⃗B⃗=0.8058229640253802cos \vec{A}\vec{B}=0.8058229640253802cosAB=0.8058229640253802

cosA⃗C⃗=0.0cos \vec{A}\vec{C}=0.0cosAC=0.0

cosB⃗C⃗=0.06299407883487121cos \vec{B}\vec{C}=0.06299407883487121cosBC=0.06299407883487121

A⃗B⃗\vec{A}\vec{B}AB的夹角的余弦更趋近于1,所以相似度更高。

2.3 总结

余弦相似度对于短文本的相似度计算还是比较准确的,但是对于大文本计算时,速度不如simhash快。

以下测试分别通过simhash和余弦相似度计算相似度的时间:

字符数 simhash耗时/ms 余弦相似度耗时/ms
20 1.7 0.4
200 4.2 1.8
2000 20.0 10.7
20000 24.1 34.0
200000 176.7 668.5

另外测试了10000个字符,步长100的线性数据,绘制结果如下:

当字符数量大约大于3000时,simhash的效率高于余弦相似度的相率。(中间有段时间突增是因为启动了其他程序,占用了CPU导致的)

所以短文本使用余弦相似度来计算文本相似度还是比较适合的。而对于准确度来说,这两种方法的准确度差不多,最主要的还是取决于特征值或者的计算方式。通过简单的词频计算作为特征值,虽然简单,但是仅仅只能通过词语本身来衡量其特性,而没有语境(即上下文)来更准确的确定一个词的特征。因此也演变出了一些新的优化方法或者模型,例如TD-IDF等等,后面再陆续总结下。


All efforts, only for myself, no longer for others

使用余弦相似度计算文本相似度相关推荐

  1. 使用simhash计算文本相似度

    1. 使用simhash计算文本相似度 2. 使用余弦相似度计算文本相似度 3. 使用编辑距离计算文本相似度 4. jaccard系数计算文本相似度 文本相似度计算常用于网页去重以及NLP里文本分析等 ...

  2. 使用编辑距离计算文本相似度

    1. 使用simhash计算文本相似度 2. 使用余弦相似度计算文本相似度 3. 使用编辑距离计算文本相似度 4. jaccard系数计算文本相似度 3. 最小编辑距离计算文本相似度 3.1 编辑距离 ...

  3. 使用gensim计算文本相似度

    使用gensim计算文本相似度 计算文本相似度步骤逻辑 1.将文本数据,通过jieba分词进行处理,形成一个二维数组 2.将二维数组生成词典 3.将二维数组通过doc2bow稀疏向量,形成语料库 4. ...

  4. 使用余弦相似度算法计算文本相似度-数学

    20211201 也就是效果 皮尔逊>余弦>欧式 余弦相似度的局限 皮尔逊的优势,相当于是改进版余弦相似度 欧式与 余弦 欧式侧重于直线距离 归一化之后的欧式和余弦的效果也不同 比如 0, ...

  5. python中文相似度_python文本相似度计算

    步骤分词.去停用词 词袋模型向量化文本 TF-IDF模型向量化文本 LSI模型向量化文本 计算相似度 理论知识 两篇中文文本,如何计算相似度?相似度是数学上的概念,自然语言肯定无法完成,所有要把文本转 ...

  6. python词语匹配相似度_python文本相似度计算

    步骤分词.去停用词 词袋模型向量化文本 TF-IDF模型向量化文本 LSI模型向量化文本 计算相似度 理论知识 两篇中文文本,如何计算相似度?相似度是数学上的概念,自然语言肯定无法完成,所有要把文本转 ...

  7. 七种方法计算文本相似度方法

    简单讲解 基于关键词的空间向量模型的算法,将用户的喜好以文档描述并转换成向量模型,对商品也是这么处理,然后再通过计算商品文档和用户偏好文档的余弦相似度. 文本相似度计算在信息检索.数据挖掘.机器翻译. ...

  8. 【BABY夜谈大数据】计算文本相似度

    简单讲解 上一章有提到过[基于关键词的空间向量模型]的算法,将用户的喜好以文档描述并转换成向量模型,对商品也是这么处理,然后再通过计算商品文档和用户偏好文档的余弦相似度. 文本相似度计算在信息检索.数 ...

  9. 计算文本相似度方法大全-简单说(汇总)

    原文:https://blog.csdn.net/chinafire525/article/details/78686876 本编文章是方法论-主要给大家介绍原理思路 简单讲解 基于关键词的空间向量模 ...

最新文章

  1. Open3D KdTree建立、3种近邻搜索及结果可视化
  2. 生成彩条的MATLAB代码
  3. 使用DeflateStream压缩与解压
  4. 小米手机安装https证书报错:无法安装该证书 因为无法读取该证书文件
  5. RabbitMQ负载均衡(3)——Keepalived+HAProxy实现高可用的负载均衡
  6. 四年从P7到P9,这个阿里小二的秘诀是给自己挖坑
  7. Java 异常练习
  8. 周末给女友讲了遍加密算法,没想到...
  9. 交换机接口用了那几根线_【网工必知】图集:交换机接口知识大全
  10. tuning 02 Diagnostic and Tuning Tools
  11. 模糊PID控制在自动光电整纬装置中的应用
  12. 【ACL 2019】预训练语言模型的最新探索
  13. maven 基本常识以及命令
  14. 「数据集」一文道尽人脸数据集
  15. 双链路是什么意思_双链路DVI是什么意思 工作原理是什么
  16. 获取计算机用户名,java获取计算机用户名
  17. 手机点击出现蓝色区域方块
  18. win10不能设置ip地址
  19. entity命名规则
  20. 王者荣耀清明节维护服务器,王者荣耀4.4清明节_2017王者荣耀清明节活动大全_快吧手游...

热门文章

  1. 【信息系统项目管理师】23年05月27日软考高级备考记录1——考试内容及重点
  2. Oracle12C安装
  3. redis详细介绍附实例代码--看一篇就够了
  4. python全栈开发-再谈编码 python_day_6
  5. 高纳德( Knuth)随机置乱算法,洗牌算法,等概率打乱顺序
  6. 大学毕业后很迷茫不知道干什么?看完这几点你就知道了
  7. flask引用bootstrap4框架
  8. 总结Java反射面试题(附答案)
  9. js获取classname值_用原生JS获取CLASS对象(很简单实用)
  10. shell怎么把负数变成正数_【硬核】年化收益率(复利)怎么算