当前位置: 首页 > news >正文

对比文章相似度的余弦相似度算法的原理

        近期不是项目遇到对比代码的相似度,来判断代码是否存在抄袭嘛。通过研究采用了余弦相似度来对比。既然接触的一个新的东西,怎么也得研究下吧。

 一、什么是余弦相似度

        利用余弦相似度对比文章相似度的原理,主要基于向量空间模型,通过计算文本向量之间的夹角余弦值来评估内容相似性。

二、数学原理

        余弦相似度通过向量夹角衡量两个非零向量的相似程度,计算公式为:

        

  • 分子(点积):反映两个向量在相同维度上的乘积之和,方向一致时值最大。
  • 分母(模长乘积):标准化处理,消除向量长度对结果的影响,仅保留方向差异。

当余弦值接近 1,表示两向量方向高度一致(文本高度相似);接近 0 表示无关;接近 -1 表示方向相反(极少出现在文本场景)

 三、文本向量化方法

1. 词频向量(TF)
  • 步骤:分词 → 去停用词 → 统计词频 → 生成向量。
  • 示例
  • 举一个例子来说明,用上述理论计算文本的相似性。
  • 句子A:“这只皮靴号码大了。那只号码合适”
  • 句子B:“这只皮靴号码不小,那只更合适”。

怎样计算上面两句话的相似程度

基本思路是:如果这两句话的用词越相似,它们的内容就应该越相似。因此,可以从词频入手,计算它们的相似程度。

第一步,分词。

句子A:这只/皮靴/号码/大了。那只/号码/合适。

句子B:这只/皮靴/号码/不/小,那只/更/合适。

第二步,列出所有的词。

这只,皮靴,号码,大了。那只,合适,不,小,很

第三步,计算词频。

句子A:这只1,皮靴1,号码2,大了1。那只1,合适1,不0,小0,更0

句子B:这只1,皮靴1,号码1,大了0。那只1,合适1,不1,小1,更1

第四步,写出词频向量。

  句子A:(1,1,2,1,1,1,0,0,0)

  句子B:(1,1,1,0,1,1,1,1,1)

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

        计算过程如下

计算结果中夹角的余弦值为0.81非常接近于1,所以,上面的句子A和句子B是基本相似的

2. TF-IDF加权向量
  • 在词频基础上引入逆文档频率(IDF),降低常见词的权重,突出关键词的重要性。

四、实际应用步骤

  1. 预处理
    对文章进行分词(如中文使用jieba)、去除停用词(如“的”“了”)等。
  2. 构建词向量
    合并两篇文章的词汇表,统计每篇文章中各词的词频或TF-IDF值,形成高维向量。
  3. 计算余弦值
    将两篇文章的向量代入公式,计算结果。值越接近1,相似度越高

五、优缺点分析

优点
  1. 忽略文本长度:适用于长文本和短文本对比(如新闻与微博)
  2. 高效处理高维数据:适合文本特征(数千维度)的场景。
  3. 计算简便:仅需向量点积和模长,易于编程实现
缺点
  1. 无法捕捉语义:对同义词(如“电脑”与“计算机”)和多义词(如“苹果”公司 vs. 水果)处理不足。。
  2. 依赖分词质量:分词错误会直接影响向量准确性

六、应用场景

  1. 搜索引擎:匹配用户查询与网页内容。
  2. 推荐系统:计算用户偏好或商品特征的相似度(如新闻推荐)。
  3. 抄袭检测:对比学术论文或代码的相似性

相关文章:

  • Redis持久化深度解析:RDB与AOF双剑合璧
  • 【已解决】docker: Error response from daemon: Get “https://registry-1.docker.io/v2/“: net/http: request c
  • 【eNSP实战】将路由器配置为DHCP服务器
  • 3、数据库的基础学习 下
  • Vue.js常见问题及解决方案
  • JVM并发编程AQSsync锁ReentrantLock线程池ThreadLocal
  • 利用Java爬虫根据关键词获取商品列表:实战指南
  • 人工智能与网络信息技术的深度融合
  • ⭐算法OJ⭐汉明距离【位操作】(C++ 实现)Total Hamming Distance
  • 【Python】Linux 升级 Python 版本(源码安装)
  • nginx中忽略已.开头的文件
  • 解锁 vue-property-decorator 的秘密:Vue 2 到 Vue 3 的 TypeScript 之旅!✨
  • 汇编语言 | 王爽 | 学习笔记
  • MambaTab:表格数据处理的新利器
  • linux Centos7 遗忘root用户密码
  • 计算机网络基础:NAT 网络地址转换
  • Java中队列(Queue)和列表(List)的区别
  • DICT领域有哪些重要的技术标准和规范?
  • MySQL开发陷阱与最佳实践:第1章:MySQL开发基础概述-1.2 MySQL开发环境搭建
  • C语言_数据结构总结9:树的基础知识介绍
  • 央媒评网红质疑胖东来玉石定价暴利:对碰瓷式维权不能姑息
  • 持续8年仍难终了的纠纷:败诉方因拒执罪被立案,胜诉方银行账户遭冻结
  • 学习教育期间违规吃喝,李献林、叶金广等人被通报
  • 时隔4年多,这一次普京和泽连斯基能见面吗?
  • 牟海松任国家信访局副局长
  • 消费维权周报|上周涉手机投诉较多,涉拍照模糊、屏幕漏液等