simhash算法实现步骤
1、分词
1)、把需要判断的文本进行分词,形成这个文章的特征单词。
2)、最后形成去掉噪音词的单词序列,并为每个单词加上权重。
2、生成传统hash值
通过传统hash算法,对文章的每个特征单词产生一个f位的签名b。
3、降维过程
1)、加权
通过步骤2中生成的hash值,需要按照单词的权重形成加权数字串。
2)、合并
把步骤3中第一步各个单词算出来的序列值对应位累加,变成只有一个序列串。
3)、降维
把步骤2中第三步算出来的序列串变成0 1串,形成我们最终的simhash签名。
通过以上操作的转换,我们把库里的文本都转换为simhash代码,并转换为string类型存储,空间大大减少。接下来我们通过海明距离(Hamming distance)计算两个simhash到底相不相似。
海明距离简介
两个码字的对应比特取值不同的比特数称为这两个码字的海明距离。
举例如下: 10101 和 00110 从第一位开始依次有第一位、第四、第五位不同,则海明距离为3。
计算海明距离的普遍算法为:
对于二进制字符串的a和b,海明距离为a,b做异或操作(a XOR b)后,结果中1的个数。
异或: 只有在两个比较的位不同时其结果是1 ,否则结果为 0
到此,我们完成了simhash算法的所有步骤。
总结simhash算法的步骤:
1、生成每个文件的simhash值
2、计算两个文件的Hamming distance
五、Simhash适用情境
simhash用于比较大文本,比如500字以上效果都还蛮好,距离小于3的基本都是相似,误判率也比较低。但是如果我们处理的是微博信息,最多也就140个字,使用simhash的效果并不那么理想。看如下图,在距离为3时是一个比较折中的点,在距离为10时效果已经很差了,不过我们测试短文本很多看起来相似的距离确实为10。如果使用距离为3,短文本大量重复信息不会被过滤,如果使用距离为10,长文本的错误率也非常高,如何解决?