相似哈希simhash计算

simhash计算原理:

简单的将,一篇文档的simhash(64位)是这样计算的:定义一个长度为64的数组s[],初始化为0。针对文档中的每一个词,计算词的hash(64位),如果hash第i位为1,则将数组s[i]加1,否则s[i]减1。所有的词计算完毕后,将数组收缩:如果>0,置为1,否则置为0。得到64个0或1数字,组合成64位的数字,即为simhash。

注意:数组最好为64位,免得在位移操作时溢出(int溢出)导致不可预知的错误。


测试:

根据以上算法计算下面4篇文档的simhash(已手工分词):

doc1:simhash 算法 原理 和 代码 实现
doc2:simhash 算法 的 原理 ( 转 )
doc3:simhash 算法 的 原理
doc4:simhash 与 重复 信息 识别

计算结果为:

doc1的simhash:1416492156445077734

doc2的simhash:16134270046245056934

doc3的simhash:497754534934831522

doc4的simhash:12263517492683995739

他们之间的海明距离分别为:

  doc1 doc2 doc3 doc4
doc1        
doc2 17      
doc3 15 12    
doc4 33 34 32  

从表中可以看出doc2与doc3最相似,即"simhash 算法 的 原理 ( 转 )"与"simhash 算法 的 原理"最相似。

再添加一个doc5:simhash 的 原理 算法,由doc3调换词的顺序得来,发现doc3与doc5的simhash一样,二者最相似,与预期不一致。

这是由于考虑的特征太少所致,现在我们将词的顺序计算进来,简单的方法是将前后相邻的2个词拼接成一个组合词参与计算,这样就有了词的关联性。

重新计算的结果为:

doc1的simhash:15198202046059745510

doc2的simhash:14621043116870299878

doc3的simhash:9721126717995704674

doc4的simhash:10297596533213360614

doc5的simhash:12842524714518182744

他们之间的海明距离分别为:

  doc1 doc2 doc3 doc4 doc5
doc1          
doc2 21        
doc3 24 9      
doc4 22 11 12    
doc5 28 33 30 34  

从表中看doc2与doc3最相似。

实际应用中可能要过滤掉常见词、标点符号、出现一次的词(很可能是噪音),添加其他特征。

猜你喜欢

转载自blog.csdn.net/hbuxiaoshe/article/details/38583041