SimHash

关键字:字符串降维,汉明匹配,顺序无关

基本原理

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

流程图如下:
SimHash_第1张图片

性能比较

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

nlog(n)N

nN

通过simhash,时间复杂度为
mN

mhashcode

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

分桶simhash

通过hash,我们把字符降维,并通过汉明距离两两匹配。但是如果字符串个数

N
为主要的瓶颈是,这种方式依然有较高的时间复杂度。
由于simhash的思路是,相似的文本,得到的hash_code大部分位是相同的。我们可以把hash_code再次分块,进行完全匹配,如下:
SimHash_第2张图片
我们假定3bit一下差异的文本,是相似的,那么分为四块,至少有一块是完全相同的,于是通过完全匹配即可。

simhash的短文本可行性

simhash在短文本中效果并不好。
- 1.(相关blog)
此blog的结论是,效果不好
- 2.地址相似度实验
SimHash_第3张图片

实验结论是,短文本效果不好。

你可能感兴趣的:(机器学习)