近期不是项目遇到对比代码的相似度,来判断代码是否存在抄袭嘛。通过研究采用了余弦相似度来对比。既然接触的一个新的东西,怎么也得研究下吧。
一、什么是余弦相似度
利用余弦相似度对比文章相似度的原理,主要基于向量空间模型,通过计算文本向量之间的夹角余弦值来评估内容相似性。
二、数学原理
余弦相似度通过向量夹角衡量两个非零向量的相似程度,计算公式为:
- 分子(点积):反映两个向量在相同维度上的乘积之和,方向一致时值最大。
- 分母(模长乘积):标准化处理,消除向量长度对结果的影响,仅保留方向差异。
当余弦值接近 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),降低常见词的权重,突出关键词的重要性。
四、实际应用步骤
- 预处理
对文章进行分词(如中文使用jieba)、去除停用词(如“的”“了”)等。 - 构建词向量
合并两篇文章的词汇表,统计每篇文章中各词的词频或TF-IDF值,形成高维向量。 - 计算余弦值
将两篇文章的向量代入公式,计算结果。值越接近1,相似度越高
五、优缺点分析
优点:
- 忽略文本长度:适用于长文本和短文本对比(如新闻与微博)
- 高效处理高维数据:适合文本特征(数千维度)的场景。
- 计算简便:仅需向量点积和模长,易于编程实现
缺点:
- 无法捕捉语义:对同义词(如“电脑”与“计算机”)和多义词(如“苹果”公司 vs. 水果)处理不足。。
- 依赖分词质量:分词错误会直接影响向量准确性
六、应用场景
- 搜索引擎:匹配用户查询与网页内容。
- 推荐系统:计算用户偏好或商品特征的相似度(如新闻推荐)。
- 抄袭检测:对比学术论文或代码的相似性