计算中文文本相似度的几种方法

发表于2016-12-03   8148次阅读

杰卡德(Jaccard)相似系数

这种相似度计算方式相对简单,原理也易于理解,就是计算单词集合之间的交集和并集大小的比例,该值越大,表示两个文本越相似。在涉及到大规模并行计算时,该方法效率上有一定的优势。Jaccard 相似度公式:

举例:

比如两个标题:“30岁至40岁女装连衣裙” 和 “大码女装连衣裙”。分词去噪后:

A = (30, 40, 女装, 连衣裙 ) B = (大码, 女装, 连衣裙 )

那么 J(A,B) = (女装,连衣裙) / (30,40,大码, 女装, 连衣裙 ) = 2/5 = 0.4。

扩展阅读:

余弦(Cosine)相似度

余弦相似度是利用计算两个向量之间的夹角,夹角越小相似度越高,其公式为:

还是上面的例子,分词之后整个词集为:(30,40,大码, 女装, 连衣裙),按照词是否出现,我们将A,B两个短句定义成两个向量,出现为1,不出现为0,则: A = (1,1,0,1,1),B = (0,0,1,1,1),那么他们的余弦举例为:

所以 A 和 B 两个短句的余弦相似度就是 0.577。

简单说下原理

余弦相似度来源于余弦定理(参见百度百科余弦定理),即三角形的各个夹角(余弦值)可以通过各边计算所得,公式为:

其中 a,b,c为各个边的长度。如果将边长映射为二维空间中的坐标(x1,y1),(x1,y1)则上面的边长可以通过坐标计算得到(推导过程略),最终余弦夹角公式可以转换为:

实际使用时,每个句子或者正文往往需要映射为多维向量,最终推导出的公式就是:

如果公式推导过程感兴趣可以自行google,检索关键词参考 “向量长度计算,向量点乘,欧式距离”。实际使用时拿来直接用就好了。

扩展阅读:

仅仅对标题、短句使用余弦相似度算法有些重了,余弦相似度算法更适合做正文相似度计算。

海量数据的相似度

海联数据的相似度计算直接使用上面两种办法效率未免有些太低了,可以参考 simhash 算法.其核心思路就是想办法缩小问题规模(计算指纹)之后再进行比对。

参考阅读: simhash