大家好,欢迎来到IT知识分享网。
1. 简介
simhash是一种局部敏感hash。那什么叫局部敏感呢,假定两个字符串具有一定的相似性,在hash之后,仍然能保持这种相似性,就称之为局部敏感hash。普通的hash是不具有这种属性的。simhash被Google用来在海量文本中去重。
2. 原理
算法过程大概如下:
- 将Doc进行关键词抽取(其中包括分词和计算权重),抽取出n个(关键词,权重)对, 即图中的多个
(feature, weight)
。 记为feature_weight_pairs = [fw1, fw2 … fwn]
,其中fwn = (feature_n,weight_n)
。 - 对每个
feature_weight_pairs
中的feature
进行hash。 图中假设hash生成的位数bits_count = 6。 - 然后对
hash_weight_pairs
进行位的纵向累加,如果该位是1,则+weight
,如果是0,则-weight
,最后生成bits_count个数字,如图所示是[13, 108, -22, -5, -32, 55]
, 这里产生的值和hash函数所用的算法相关。 [13,108,-22,-5,-32,55] ->
这个就很简单啦,正1负0。
3. 距离计算
通过simhash,我们要度量两个文档的相似度就可以通过度量它们的simhash值相似度。度量两个simhash值相似度一般使用海明距离。
二进制串A和二进制串B的海明距离 就是A异或B后二进制中1的个数。
举例如下:
A = ; B = ; hamming_distance(A, B) = count_1(A xor B) = count_1(001101) = 3
A和B的海明距离是否小于等于n,这个n值根据经验一般取值为3。
4. Python使用
使用simhash。
(1) 查看simhash值
>>> from simhash import Simhash >>> print '%x' % Simhash(u'I am very happy'.split()).value 9f8fd7efdb1ded7f
Simhash()
接收一个token序列,或者叫特征序列。
(2)计算两个simhash值距离
>>> hash1 = Simhash(u'I am very happy'.split()) >>> hash2 = Simhash(u'I am very sad'.split()) >>> print hash1.distance(hash2) 5
(3)建立索引
simhash被用来去重。如果两两分别计算simhash值,数据量较大的情况下肯定hold不住。有专门的数据结构,参考:http://www.cnblogs.com/maybe2030/p/5203186.html#_label4
from simhash import Simhash, SimhashIndex # 建立索引 data = { u'1': u'How are you I Am fine . blar blar blar blar blar Thanks .'.lower().split(), u'2': u'How are you i am fine .'.lower().split(), u'3': u'This is simhash test .'.lower().split(), } objs = [(id, Simhash(sent)) for id, sent in data.items()] index = SimhashIndex(objs, k=10) # k是容忍度;k越大,检索出的相似文本就越多 # 检索 s1 = Simhash(u'How are you . blar blar blar blar blar Thanks'.lower().split()) print index.get_near_dups(s1) # 增加新索引 index.add(u'4', s1)
Ref
http://yanyiwu.com/work/2014/01/30/simhash-shi-xian-xiang-jie.html
http://blog.csdn.net/madujin/article/details/
http://leons.im/posts/a-python-implementation-of-simhash-algorithm/
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/151935.html