Simhash算法:
Simhash算法由Google的Charikar提出,是将一篇文档转化为n位的签名,通过比较签名的相似度来计算原文档的相似度。签名越相近,则文档越相近。因此,整个过程就不会涉及到原文档文本内容的两两比较,就不需要存储这些海量文档的内容。
simhash算法的输入是一个向量,输出是一个 f 位的签名值。为了陈述方便,假设输入的是一个文档的特征集合,每个特征有一定的权重。比如特征可以是文档中的词,其权重可以是这个词出现的次数。 simhash 算法如下:1,将一个 f 维的向量 V 初始化为 0 ; f 位的二进制数 S 初始化为 0 ;2,对每一个特征:用传统的 hash 算法对该特征产生一个 f 位的签名 b 。对 i=1 到 f :如果b 的第 i 位为 1 ,则 V 的第 i 个元素加上该特征的权重;否则,V 的第 i 个元素减去该特征的权重。 3,如果 V 的第 i 个元素大于 0 ,则 S 的第 i 位为 1 ,否则为 0 ;4,输出 S 作为签名。
通过以上步骤,给文档生成n位的签名值,将计算文档的相似度问题转化为比较两个文档的签名值。这个可以通过计算两个签名的海明距离即可实现。
文档最终以64位签名的形式存储,可以用海明距离来度量。海明距离越小表明两篇文章越相似,对于位数相同的两个数相异或后的结果含有二进制1的个数。