您的位置:首页 > 其它

SimHash

2017-03-29 16:21 323 查看
关键字:字符串降维,汉明匹配,顺序无关

基本原理

simhash是google用于解决海量数据去重的问题,通过降维到hash_code,在通过降维后的code进行两两匹配。

流程如下:

- 1、分词,把需要判断文本分词形成这个文章的特征单词。最后形成去掉噪音词的单词序列并为每个词加上权重。

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”。

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”。这里作为示例只算了两个单词的,真实计算需要把所有单词的序列串累加。

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

流程图如下:



性能比较

如果使用普通算法,新进入的文本需要与存储中的所有文本进行两两匹配,时间复杂度为n∗log(n)∗N

n为字符串长度,N为字符串个数

通过simhash,时间复杂度为m∗N

m为降维后的hashcode长度

对于长文本来说,n∗log(n)>>m,通过这种方式能有效降维。

分桶simhash

通过hash,我们把字符降维,并通过汉明距离两两匹配。但是如果字符串个数N为主要的瓶颈是,这种方式依然有较高的时间复杂度。

由于simhash的思路是,相似的文本,得到的hash_code大部分位是相同的。我们可以把hash_code再次分块,进行完全匹配,如下:



我们假定3bit一下差异的文本,是相似的,那么分为四块,至少有一块是完全相同的,于是通过完全匹配即可。

simhash的短文本可行性

simhash在短文本中效果并不好。

- 1.(相关blog)

此blog的结论是,效果不好

- 2.地址相似度实验



实验结论是,短文本效果不好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  海量数据 simhash