基于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的聚类方法。

原文地址:https://www.cnblogs.com/nocml/p/3543778.html