基于SimHash的微博去重
一、需求:对微博数据进行去重,数据量比较小,几十万条左右。
二、解决方案
1、采用SimHash的指纹信息去重方法。
三、实现方案
1、对每一条微博使用tf-idf与特征词
2、使用每条微博的特征词,通过SimHash方法生成信息指纹。
3、对生成的信息指纹统计计算海明距离,距离小于等于1和判为相似文档。(由于使用的是tf-idf关键词,所以此处的阈值比较小)
四、具体细节
1、SimHash的计算
a) 对一条微博的每个关键词通过Hash函数取hash值(此处hash函数用的32位的,一般情况下,hash值最少也要64位,位数越多,能够保留的信息相对较多一些)
b) 生成一个包含32个元素,且元素均为0的数组(记做simhashValue)
c) 取上述Hash值中的一个Hash值转化成二进制,使之各位与simhashValue的各元素对应(对应到数据下标),如果此hash值的某一位为1/0,则在simHashValue的对应位上加/减 此hash值对应的tf-idf关键词的权重。
d)对此条微博生成的所有关键词的hash值进行c)步骤的操作
e)取simhashValue,把32个数组元素有序的映射成一个32位数。如果数组元素的值天于0,则映射为1,否则映射为0。从而得到了一个32位SimHash值。
2、计算simHash的海明距离
此处计算参考《编程之美》中“求二进制中1的个数”小节中给出的方法,有效提高计算效率。
五、小结
1、simhash是谷歌开源的一个算法,用来网页去重。用在短文本去重中,效果也不错。
2、minHash也是个不错的去重、聚类的好方法。在这里由于数据量本身比较小,所以采用了simHash这个比较简单的方法。如果数据量较大的话,可以写成mapreduce的。另,mahout提供了minHash的聚类方法。