这种相似度计算方式相对简单,原理也易于理解,就是计算单词集合之间的交集和并集大小的比例,该值越大,表示两个文本越相似。在涉及到大规模并行计算时,该方法效率上有一定的优势。Jaccard 相似度公式:
举例:
比如两个标题:“30岁至40岁女装连衣裙” 和 “大码女装连衣裙”。分词去噪后:
A = (30, 40, 女装, 连衣裙 ) B = (大码, 女装, 连衣裙 )
那么 J(A,B) = (女装,连衣裙) / (30,40,大码, 女装, 连衣裙 ) = 2/5 = 0.4。
扩展阅读:
余弦相似度是利用计算两个向量之间的夹角,夹角越小相似度越高,其公式为:
还是上面的例子,分词之后整个词集为:(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
出处:https://www.coderxing.com/some-text-similarity-method.html
本文为原创文章,采用署名-相同方式共享 3.0 中国大陆(CC BY-SA 3.0 CN))进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。