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最相似。
实际应用中可能要过滤掉常见词、标点符号、出现一次的词(很可能是噪音),添加其他特征。