如何⽐较两篇⽂章的相似度
其实这个题⽬已经有很多⼈写过了,数学之美⾥就有,最近阮⼀峰的博客⾥也写了,本⽂基本上遵循的就是他的思路,只是让其看起来再⼩⽩⼀点点。其实说⽩了就是⽤⾃⼰的话,再把同样⼀件事描述⼀下,顺便扩扩句,把其中跳跃⽐较⼤的部分再补充补充。
当然虽然题⽬是⽐较两篇⽂章的相似性,但我们也不会傻到真拿两篇篇⽂章来说明,为了简单起见,我们从句⼦着⼿。
句⼦A:周杰伦是⼀个歌⼿,也是⼀个叉叉
句⼦B:周杰伦不是⼀个叉叉,但是是⼀个歌⼿
如何⽐较相似性呢?
第⼀步分词
句⼦A : 周杰伦/是/⼀个/歌⼿,也/是/⼀个/叉叉(注:假设分词也是个⽜叉叉,可以识别叉叉这个词)
句⼦B: 周杰伦/不/是/⼀个/叉叉 ,但是/是/⼀个/歌⼿
第⼆步去重复,列出识别的所有单词
周杰伦、是、不、⼀个、叉叉、歌⼿、但是、也
第三步计算词频(这⾥表⽰某个词在⼀个句⼦⾥出现的次数)
句⼦A: 周杰伦1、是2 、不 0 、⼀个2、叉叉1、歌⼿1、但是0、也1
句⼦B: 周杰伦1、是2 、不 1 、⼀个2、叉叉1、歌⼿1、但是1、也0
第四步构造词频向量
句⼦A [1 , 2 , 0 , 2 , 1 , 1 , 0 , 1]
句⼦B [1 , 2 , 1 , 2 , 1 , 1 , 0 , 1]
上⾯构造的是两个多维的向量,其中每个维度的值就是词频。
OKAY,构造出了上⾯的⼆个多维向量后,⽐较两句话的相似度就变成了⽐较这两个向量的相似度了。任何问题只要⼀变成数学问题,基本上就好解决了 :) ... ...
那么如何⽐较两个向量的相似度呢。先来点⾼中数学知识。
上图是⼀个⼆维向量的⼏何表⽰。其中有2个⼆维向量a和b 。θ就是这2个⼆维向量的夹⾓;如果夹⾓为0度,意味着⽅向相同、线段重合;如果夹⾓为90度,意味着形成直⾓,⽅向完全不相似;如果夹⾓为180度,意味着⽅向正好相反。因此,我们可以通过夹⾓的⼤⼩,来判断向量的相似程度。夹⾓越⼩,就代表越相似。
再复习⼀个初中的知识:余弦定理 (应该是初中吧)
假定a向量是[x1,y1] 。b向量是 [x2,y2]
那么可以将余弦定理改成下⾯的形式。
在原⽂中直接给了这个结果,这着实有点跳跃,给⼈以突兀感,主要是因为其中的推导过程给省略了,虽然推导过程确实有点⼩⽩,但我们的题⽬,就是将⼩⽩进⾏到底,所以还是在下⾯补出来这个过程。因为我不会画图所以直接使⽤计算机的表⽰法了。可能不太直观
Cosθ = (a^2+b^2-c^2)/2abc
a^2 = (x1^2+y1^2)
b^2 = (x2^2+y2^2)
c^2 = (x2-x1)^2 + (y2-y1)^2 (这个不难理解吧)
=>
Cosθ = ((x1^2+y1^2) + (x2^2+y2^2) + ((x2-x1)^2 + (y2-y1)^2))/(2sqrt(x1^2+y1^2)*sqrt(x2^2+y2^2))
=>
Cosθ = (x1^2+y1^2+x2^2+y2^2-x2^2-x1^2+2x1x2-y2^2-y1^2+2y1y2/(2sqrt(x1^2+y1^2)*sqrt(x2^2+y2^2))
=>
Cosθ = (2x1x2+y1y2 )/(2sqrt(x1^2+y1^2)*sqrt(x2^2+y2^2))
=>
Cosθ = (x1x2+y1y2 )/(sqrt(x1^2+y1^2)*sqrt(x2^2+y2^2))
这样结果就推出来了。
我们现在再来总结⼀下⼆维向量情况下余弦定理的规律
2个⼆维向量 [x1,y1] 、[x2,y2] 那么有
Cosθ = (x1x2+y1y2 )/(sqrt(x1^2+y1^2)*sqrt(x2^2+y2^2) )
我们把[x1,y1]、[x2,y2] 换成 [a1,a2] 、[b1,b2] 那么
有2个⼆维向量 [a1,a2] 、[b1,b2] 有
Cosθ = (a1b1+a2b2 )/(sqrt(a1^2+a2^2)*sqrt(b1^2+b2^2))
数学已经证明,余弦的这种计算扩展到多维向量也是成⽴的。
那么现在我们多⼀个维度,假设有2个3维向量,例如 [a1,a2,a3]、[b1,b2,b3] 会是什么样呢
Cosθ = (a1b1+a2b2 +a3b3)/(sqrt(a1^2+a2^2+a3^2)*sqrt(b1^2+b2^2+b3^2))
那么 n维是什么情况呢
Cosθ = (a1b1+a2b2 +a3b3 + .. anbn)/(sqrt(a1^2+a2^2+a3^2 + ... + an^2)*sqrt(b1^2+b2^2+b3^2 + .. + bn^2))歌手文章
下图的表⽰可能更直观和简洁⼀些
有了这个公式就好办了。我们的两个句⼦
句⼦A [1 , 2 , 0 , 2 , 1 , 1 , 0 , 1]
句⼦B [1 , 2 , 1 , 2 , 1 , 1 , 0 , 1]
那么他们夹⾓的余弦是多少呢
Cosθ = (1*1 + 2*2 + 0*1 + 2*2 + 1*1 + 1*1 + 0*0 + 1*1 )/(sqrt(1^2+2^2+0^2+2^2+1^2+1^2+0^2+1^2)*sqrt(1^2+2^2+1^2+2^2+1^2+1^2+1^2+0^2+1^2)) =>
Cosθ≈0.961
这个还算是⽐较⾼的
发布评论