simhash文本相似度计算

常见文本相似度计算方法:

1 向量空间模型VSM(Vector Space Model)。使用VSM计算相似度,先对文本进行分词,然后建立文本向量,把相似度的计算转换成某种特征向量距离的计算,比如余弦角、欧式距离、Jaccard相似系数等。这种方法存在很大一个问题:需要对文本两两进行相似度比较,无法扩展到海量文本的处理。
使用介绍可以参考 Corpora and Vector Spaces, 以及TF-IDF model

2 使用gensim的 doc2vec models.doc2vec 模型,doc2vec的设计原理是基于word2vec的原理进行改进。但是据大家使用的反馈,效果不是很好。

3 主题模型的近似计算。通过计算documents的主题模型,将主题模型近似高的documents进行k-means聚合。实际计算时可以使用 gensim的 LDA 模型 gensim中实践LDA

4, 使用simhash算法斤进行文本相似度计算

5,最新的有种基于深度学习的方法叫 Deep Averaging Network,效果据研究者说比以上好,但是网上相关资料目前只有作者的论文以及算法代码。(还没来得及研究)

gensim算法流程

这里写图片描述

1、分词,把需要判断文本分词形成这个文章的特征单词。最后形成去掉噪音词的单词序列并为每个词加上权重,我们假设权重分为5个级别(1~5)。比如:“ 美国“51区”雇员称内部有9架飞碟,曾看见灰色外星人 ” ==> 分词后为 “ 美国(4) 51区(5) 雇员(3) 称(1) 内部(2) 有(1) 9架(3) 飞碟(5) 曾(1) 看见(3) 灰色(4) 外星人(5)”,括号里是代表单词在整个句子里重要程度,数字越大越重要。

在上图中,feature表示分词后的词语,英文中以单个单词表示,并去掉词语中的stop words, wn 表示对应的feature(词语)的权重,这个权重可以是 tf-idf 或者 词频值。

2、hash,通过hash算法把每个词变成hash值,比如“美国”通过hash算法计算为 100101,“51区”通过hash算法计算为 101011。这样我们的字符串就变成了一串串数字,还记得文章开头说过的吗,要把文章变为数字计算才能提高相似度计算性能,现在是降维过程进行时。

3、加权,通过 2步骤的hash生成结果,需要按照单词的权重形成加权数字串,比如“美国”的hash值为“100101”,通过加权计算为“4 -4 -4 4 -4 4;“51区”的hash值为“101011”,通过加权计算为 “ 5 -5 5 -5 5 5”。
即相当于判断hash值的每位数值,若该位值为1,该位被 w补上,若为0,该位被 -w补上。

4、合并,把上面各个单词算出来的序列值累加,变成只有一个序列串。比如 “美国”的 “4 -4 -4 4 -4 4”,“51区”的 “ 5 -5 5 -5 5 5”, 把每一位进行累加, “4+5 -4+-5 -4+5 4+-5 -4+5 4+5” ==》 “9 -9 1 -1 1 9”。这里作为示例只算了两个单词的,真实计算需要把所有单词的序列串累加。
hash矩阵中,每列(如图中的1,2,3列)的数值分别进行加和,最终得到和值 12,108, -22, -5, -32,55

5、降维,把4步算出来的 “9 -9 1 -1 1 9” 变成 0 1 串,形成我们最终的simhash签名。 如果每一位大于0 记为 1,小于0 记为 0。最后算出结果为:“1 0 1 0 1 1”。

6 计算海明距离(Hamming distance),(在信息编码中,两个合法代码对应位上编码不同的位数称为码距,又称海明距离。)计算海明距就可以计算出两个simhash到底相似不相似。例如: 10101 和 00110 从第一位开始依次有第一位、第四、第五位不同,则海明距离为3。计算汉明距离的一种方法,就是对两个位串进行异或(xor)运算,并计算出异或运算结果中1的个数。

7 documents相似度
当我们算出所有doc的simhash值之后,需要计算doc A和doc B之间是否相似的条件是:A和B的海明距离是否小于等于n,这个n值根据经验一般取值为3。

参考文章
文本去重之SimHash算法
http://my.oschina.net/pathenon/blog/63747

海量数据相似度计算之simhash和海明距离
http://www.lanceyan.com/tech/arch/simhash_hamming_distance_similarity.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值