simhash算法实现--查找文件类似度

1、Simhash简介

SimHash是用来网页去重最经常使用的hash方法,速度很快。Google采用这种算法来解决万亿级别的网页去重任务。html

SimHash算法的主要思想是降维。将高维的特征向量映射成一个低维的特征向量,经过两个向量的Hamming Distance来肯定文章是否重复或者高度近似。java

simhash的发明人Charikar的论文中并无给出具体的simhash算法和证实,量子图灵得出的证实simhash是由随机超平面hash算法演变而来的算法

参考文献:《Detecting Near-Duplicates for Web Crawling 函数

2、Simhash和传统hash的区别

传统hash函数解决的是生成惟一值,好比md5hashmap等。Md5是用于生成惟一签名串,只要稍微多加一个字符,md5的两个数字看起来相差甚远。而咱们的目的是解决文本类似度计算,要比较的是两个文章是否类似。而simhash对类似文本的哈希映射结果也类似。测试

传统的hash算法只负责将原始内容尽可能均匀随机地映射为一个签名值,原理上至关于伪随机数产生算法。产生的两个签名,若是相等,说明原始内容在必定几率下是相等的;若是不相等,除了说明原始内容不相等外,再也不提供任何信息,由于即便原始内容只相差一个字节,所产生的签名也极可能差异极大。从这个意义上来讲,要设计一个hash算法,对类似的内容产生的签名也相近,是更为艰难的任务,由于它的签名值除了提供原始内容是否相等的信息外,还能额外提供不相等的原始内容的差别程度的信息。spa

Googlesimhash算法产生的签名,能够用来比较原始内容的类似度。设计

3、简单应用场景

从文件夹res1366x768x565中,查找与OSDTbl_ATV_c.inl文件类似的全部文件。htm

4、simhash算法实现步骤

1、分词

1)、把须要判断的文本进行分词,造成这个文章的特征单词。md5

2)、最后造成去掉噪音词的单词序列,并为每一个单词加上权重。字符串

2、生成传统hash

经过传统hash算法,对文章的每一个特征单词产生一个f位的签名b

3、降维过程

1)、加权

经过步骤2中生成的hash值,须要按照单词的权重造成加权数字串。

2)、合并

把步骤3中第一步各个单词算出来的序列值对应位累加,变成只有一个序列串。

3)、降维

把步骤2中第三步算出来的序列串变成0 1串,造成咱们最终的simhash签名。

经过以上操做的转换,咱们把库里的文本都转换为simhash代码,并转换为string类型存储,空间大大减小。接下来咱们经过海明距离(Hamming distance)计算两个simhash到底相不类似。

海明距离简介

两个码字的对应比特取值不一样的比特数称为这两个码字的海明距离。

举例以下: 10101 00110 从第一位开始依次有第一位、第4、第五位不一样,则海明距离为3

计算海明距离的广泛算法为:

对于二进制字符串的ab,海明距离为a,b作异或操做(a XOR b)后,结果中1的个数。

异或: 只有在两个比较的位不一样时其结果是1 ,不然结果为

到此,咱们完成了simhash算法的全部步骤。

总结simhash算法的步骤:

一、生成每一个文件的simhash

二、计算两个文件的Hamming distance

5、Simhash适用情境

simhash用于比较大文本,好比500字以上效果都还蛮好,距离小于3的基本都是类似,误判率也比较低。可是若是咱们处理的是微博信息,最多也就140个字,使用simhash的效果并不那么理想。看以下图,在距离为3时是一个比较折中的点,在距离为10时效果已经不好了,不过咱们测试短文本不少看起来类似的距离确实为10。若是使用距离为3,短文本大量重复信息不会被过滤,若是使用距离为10,长文本的错误率也很是高,如何解决?

 

参考资料:《simHash 简介以及 java 实现》http://www.open-open.com/lib/view/open1375690611500.html

相关文章
相关标签/搜索