zoukankan      html  css  js  c++  java
  • 基于SimHash的微博去重

    基于SimHash的微博去重 - 吕新建 - 博客园

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

  • 相关阅读:
    LeetCode 842. Split Array into Fibonacci Sequence
    LeetCode 1087. Brace Expansion
    LeetCode 1219. Path with Maximum Gold
    LeetCode 1079. Letter Tile Possibilities
    LeetCode 1049. Last Stone Weight II
    LeetCode 1046. Last Stone Weight
    LeetCode 1139. Largest 1-Bordered Square
    LeetCode 764. Largest Plus Sign
    LeetCode 1105. Filling Bookcase Shelves
    LeetCode 1027. Longest Arithmetic Sequence
  • 原文地址:https://www.cnblogs.com/lexus/p/3772381.html
Copyright © 2011-2022 走看看