使用余弦相似度计算文本相似度
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+y22x1⋅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=1kfAi⋅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
使用余弦相似度计算文本相似度相关推荐
- 使用simhash计算文本相似度
1. 使用simhash计算文本相似度 2. 使用余弦相似度计算文本相似度 3. 使用编辑距离计算文本相似度 4. jaccard系数计算文本相似度 文本相似度计算常用于网页去重以及NLP里文本分析等 ...
- 使用编辑距离计算文本相似度
1. 使用simhash计算文本相似度 2. 使用余弦相似度计算文本相似度 3. 使用编辑距离计算文本相似度 4. jaccard系数计算文本相似度 3. 最小编辑距离计算文本相似度 3.1 编辑距离 ...
- 使用gensim计算文本相似度
使用gensim计算文本相似度 计算文本相似度步骤逻辑 1.将文本数据,通过jieba分词进行处理,形成一个二维数组 2.将二维数组生成词典 3.将二维数组通过doc2bow稀疏向量,形成语料库 4. ...
- 使用余弦相似度算法计算文本相似度-数学
20211201 也就是效果 皮尔逊>余弦>欧式 余弦相似度的局限 皮尔逊的优势,相当于是改进版余弦相似度 欧式与 余弦 欧式侧重于直线距离 归一化之后的欧式和余弦的效果也不同 比如 0, ...
- python中文相似度_python文本相似度计算
步骤分词.去停用词 词袋模型向量化文本 TF-IDF模型向量化文本 LSI模型向量化文本 计算相似度 理论知识 两篇中文文本,如何计算相似度?相似度是数学上的概念,自然语言肯定无法完成,所有要把文本转 ...
- python词语匹配相似度_python文本相似度计算
步骤分词.去停用词 词袋模型向量化文本 TF-IDF模型向量化文本 LSI模型向量化文本 计算相似度 理论知识 两篇中文文本,如何计算相似度?相似度是数学上的概念,自然语言肯定无法完成,所有要把文本转 ...
- 七种方法计算文本相似度方法
简单讲解 基于关键词的空间向量模型的算法,将用户的喜好以文档描述并转换成向量模型,对商品也是这么处理,然后再通过计算商品文档和用户偏好文档的余弦相似度. 文本相似度计算在信息检索.数据挖掘.机器翻译. ...
- 【BABY夜谈大数据】计算文本相似度
简单讲解 上一章有提到过[基于关键词的空间向量模型]的算法,将用户的喜好以文档描述并转换成向量模型,对商品也是这么处理,然后再通过计算商品文档和用户偏好文档的余弦相似度. 文本相似度计算在信息检索.数 ...
- 计算文本相似度方法大全-简单说(汇总)
原文:https://blog.csdn.net/chinafire525/article/details/78686876 本编文章是方法论-主要给大家介绍原理思路 简单讲解 基于关键词的空间向量模 ...
最新文章
- Open3D KdTree建立、3种近邻搜索及结果可视化
- 生成彩条的MATLAB代码
- 使用DeflateStream压缩与解压
- 小米手机安装https证书报错:无法安装该证书 因为无法读取该证书文件
- RabbitMQ负载均衡(3)——Keepalived+HAProxy实现高可用的负载均衡
- 四年从P7到P9,这个阿里小二的秘诀是给自己挖坑
- Java 异常练习
- 周末给女友讲了遍加密算法,没想到...
- 交换机接口用了那几根线_【网工必知】图集:交换机接口知识大全
- tuning 02 Diagnostic and Tuning Tools
- 模糊PID控制在自动光电整纬装置中的应用
- 【ACL 2019】预训练语言模型的最新探索
- maven 基本常识以及命令
- 「数据集」一文道尽人脸数据集
- 双链路是什么意思_双链路DVI是什么意思 工作原理是什么
- 获取计算机用户名,java获取计算机用户名
- 手机点击出现蓝色区域方块
- win10不能设置ip地址
- entity命名规则
- 王者荣耀清明节维护服务器,王者荣耀4.4清明节_2017王者荣耀清明节活动大全_快吧手游...
热门文章
- 【信息系统项目管理师】23年05月27日软考高级备考记录1——考试内容及重点
- Oracle12C安装
- redis详细介绍附实例代码--看一篇就够了
- python全栈开发-再谈编码 python_day_6
- 高纳德( Knuth)随机置乱算法,洗牌算法,等概率打乱顺序
- 大学毕业后很迷茫不知道干什么?看完这几点你就知道了
- flask引用bootstrap4框架
- 总结Java反射面试题(附答案)
- js获取classname值_用原生JS获取CLASS对象(很简单实用)
- shell怎么把负数变成正数_【硬核】年化收益率(复利)怎么算