One - One Code All

Blog Content

simhash算法介绍

数据挖掘 算法   2016-10-29 19:16:05

simhash是google用来处理海量文本去重的算法。  将一个文档,最后转换成一个64位的字节,暂称之为特征字。

来自于Google Moses Charikar发表的一篇论文“detecting near-duplicates for web crawling”中提出了simhash算法,专门用来解决亿万级别的网页的去重任务。


simhash作为locality sensitive hash(局部敏感哈希)的一种:其主要思想是降维,将高维的特征向量映射成低维的特征向量,通过两个向量的Hamming Distance来确定文章是否重复或者高度近似。

其中,Hamming Distance,又称汉明距离,在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。也就是说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。例如:1011101 与 1001001 之间的汉明距离是 2。至于我们常说的字符串编辑距离则是一般形式的汉明距离。通过比较多个文档的simHash值的海明距离,可以获取它们的相似度。


流程

simhash算法分为5个步骤:分词、hash、加权、合并、降维。


分词:给定一段语句,进行分词,得到有效的特征向量,然后为每一个特征向量设置1-5等5个级别的权重。

hash:通过hash函数计算各个特征向量的hash值,hash值为二进制数01组成的n-bit签名。

加权:在hash值的基础上,给所有特征向量进行加权,即W = Hash * weight,且遇到1则hash值和权值正相乘,遇到0则hash值和权值负相乘。

合并:将上述各个特征向量的加权结果累加,变成只有一个序列串。

降维:对于n-bit签名的累加结果,如果大于0则置1,否则置0,从而得到该语句的simhash值,最后我们便可以根据不同语句simhash的海明距离来判断它们的相似度。


应用

每篇文档得到SimHash签名值后,接着计算两个签名的海明距离即可。根据经验值,对64位的 SimHash值,海明距离在3以内的可认为相似度比较高。

海明距离的求法:异或时,只有在两个比较的位不同时其结果是1 ,否则结果为0,两个二进制“异或”后得到1的个数即为海明距离的大小。


上一篇:数据预处理之归一化、标准化和正则化的关系

The minute you think of giving up, think of the reason why you held on so long.