Simhash算法又被SEO站长们成为关键词匹配算法,当用户搜索一个关键词的时候,会出现相关的网站进行展现,但是前些年有个别站长发现关键词密度越高排名越好,这是搜索引擎前期的漏洞,Simhash算法(也成分词匹配算法)对关键词堆砌起到了决定性的打击,尤其是新站一旦有关键词堆砌的嫌疑,将会在好几个月内无法获得排名。
说到文本相似性计算,大家首先想到的应该是使用向量空间模型VSM(Vector Space Model)。使用VSM计算相似度,先对文本进行分词,然后建立文本向量,把相似度的计算转换成某种特征向量距离的计算,比如余弦角、欧式距离、Jaccard相似系数等。这种方法存在很大一个问题:需要对文本两两进行相似度比较,无法扩展到海量文本的处理。想想像Google这种全网搜索引擎,收录了上百亿的网页,爬虫每天爬取的网页数都是百万千万级别的。为了防止重复收录网页,爬虫需要对网页进行判重处理。如果采用VSM方法,计算量是相当可观的。
这里介绍的SimHash算法很好的解决了VSM方法的缺陷,该方法最初由Google提出,用于网页去重。在介绍SimHash前,先大概说下传统的Hash算法。我们知道,衡量一个Hash算法好坏的一个指标是随机性。也被称作简单一致散列假设:每个关键字都等可能地散列到m个槽位中的任何一个中去,并与其他的关键字已被散列到哪一个槽位中无关。说白了,就是让散列的分布尽量均匀,哪怕内容发生很小的变化,hash值也会发生很大的变化。因此,根据传统的hash值无法得知被散列内容的相似程度。
simhash可以计算文本间的相似度,我们可以通过simhash算法计算出文档的simhash值,通过比较各个文本的simhash值之间的汉明距离的大小来判断其相似度,汉明距离越小,则相似度越大。一般大文本去重,大小<=3的即可判断为重复。
simhash算法分为5个步骤:1、分词、2、hash、3、加权、4、合并、5、降维
1、分词:
选择适合自己的分词库进行分词即可。
如“欢迎来到随迹”->(分词后)“欢迎”、“来到”、“随迹”
2、hash:
对每个词计算其hash值,hash值为二进制数01组成的n-bit签名。
设“欢迎“(100101)、“来到”(101011)、“随迹”(101011)
3、加权:
对于给定的文本,权值即为分词后对应词出现的数量。给所有特征向量进行加权,即W = Hash * weight;这里我们假设三个词权值分别为4、5、9;
根据计算规则遇到1则hash值和权值正相乘,遇到0则hash值和权值负相乘
例如给“欢迎”的hash值“100101”加权得 到:W(欢迎) = 1001014 = 4 -4 -4 4 -4 4,给“来到”的hash值“101011”加权得到:W(来到)=1010115 = 5 -5 5 -5 5 5,剩下的按此规则计算
4、合并
将上述各个特征向量的加权结果累加,变成只有一个序列串。拿前两个特征向量举例,例如“欢迎”的“4 -4 -4 4 -4 4”和“来到”的“5 -5 5 -5 5 5”进行累加,得到“4+5 -4+-5 -4+5 4+-5 -4+5 4+5”,得到“9 -9 1 -1 1”。
5、降维
对于n-bit签名的累加结果,如果大于0则置1,否则置0,从而得到该语句的simhash值,最后我们便可以根据不同语句simhash的海 明距离来判断它们的相似度。例如把上面计算出来的“9 -9 1 -1 1 9”降维(某位大于0记为1,小于0记为0),得到的01串为:“1 0 1 0 1 1”,从而形成它们的simhash签名。