Simhash算法介绍和应用内容
很长时间没有更新文章了,自从工作以后,人就变得有些松散了。一个是没有明确的目标了,经常是被工作推着走;一个是刚进入工作,确实没有适应这种节奏。现在发现不可以了,从今天开始,恢复写文章,督促自己,总结自己的学习内容。
第一篇就从刚进入工作后的第一个任务开始……
Simhash算法概述
Simhash算法最早出现在2002年。但是真正出名是在2007年的Google的《Detecting Near-duplicates for web crawling》论文中,实现了一种亿万级别的网页去重算法,从此名声四起,至今,很多的搜索中依然使用这种算法进行网页的去重。
Simhash和一般的hash不同,它有两个重要的特征:
- 一个文档的指纹是所有属性的某种hash;
- 相似文档的hash应该是相似的;
其中第二条至关重要,因为对一般的hash,对于两个相似的语句,会有很大的hash值差别,这就造成对相似语句的去重效果不好,而simhash对相似的语句,只会有部分位数的不同,如一个64位的hash值只会有几位的变化,这种hash也被称作是局部敏感hash。
- 证明了simhash算法对网页进行相似性判定的实用性;
- 实现了快速检测一个给出的f-bit的指纹和已经存在的f-bit指纹集中是否存在最大差别的k个bit-position的算法;
- 对重复检索的算法和技术进行了一些结果的总结研究
当然论文中的一些正确性的证明对实际的应用没有太大的作用,今天的重点是对simhash算法的实现方式和其实际应用中的一些关键点的说明。论文中有两个重点内容,一个是simhash算法的生成算法,一个是simhash的相似指纹的查找算法。
simhash的生成算法
Simhash生成算法的主要分为四步:
- 得到网页的分词的二进制和权重:众所周知网页是由很多的分词组成的,在不同的分词方法中,每一个分词都对应着一个权重,最常见的权重就是TF-IDF方法得到的权重,而通过不同的方式,可以得到一个分词的hash,具体方法可以根据不同的方法获得;
- 将权重和二进制“相乘”(不完全是相乘,下面会讲),得到每一个分词的“权重hash”(瞎编的词,不要纠结,懂就行);
- 将得到的所有分词“权重hash”相加;
- 使用一个类似于符号函数降维的方法得到网页的simhash;
如下所示:
1,得到不同分词的hash和权重(怎么得到文章分词,并且得到分词的hash和权重方法