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流程图

性能比较

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

nlog(n)N

nN

通过simhash,时间复杂度为
mN

mhashcode

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

分桶simhash

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

N
<script type="math/tex; mode=display" id="MathJax-Element-12">N</script>为主要的瓶颈是,这种方式依然有较高的时间复杂度。
由于simhash的思路是,相似的文本,得到的hash_code大部分位是相同的。我们可以把hash_code再次分块,进行完全匹配,如下:
分桶simhash
我们假定3bit一下差异的文本,是相似的,那么分为四块,至少有一块是完全相同的,于是通过完全匹配即可。

simhash的短文本可行性

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值