美文网首页
局部敏感的散列算法(hash)

局部敏感的散列算法(hash)

作者: ebayboy | 来源:发表于2019-01-17 12:58 被阅读0次

    1. 简介

    simhash是一种局部敏感hash。那什么叫局部敏感呢,假定两个字符串具有一定的相似性,在hash之后,仍然能保持这种相似性,就称之为局部敏感hash。普通的hash是不具有这种属性的。simhash被Google用来在海量文本中去重。

    2. 原理

    算法过程大概如下:

    将Doc进行关键词抽取(其中包括分词和计算权重),抽取出n个(关键词,权重)对, 即图中的多个(feature, weight)。 记为 feature_weight_pairs = [fw1, fw2 … fwn],其中 fwn = (feature_n,weight_n)。

    对每个feature_weight_pairs中的feature进行hash。 图中假设hash生成的位数bits_count = 6。

    然后对hash_weight_pairs进行位的纵向累加,如果该位是1,则+weight,如果是0,则-weight,最后生成bits_count个数字,如图所示是[13, 108, -22, -5, -32, 55], 这里产生的值和hash函数所用的算法相关。

    [13,108,-22,-5,-32,55] -> 110001这个就很简单啦,正1负0。

    3. 距离计算

    通过simhash,我们要度量两个文档的相似度就可以通过度量它们的simhash值相似度。度量两个simhash值相似度一般使用海明距离。

    二进制串A和二进制串B的海明距离 就是A异或B后二进制中1的个数。

    举例如下:

    A = 100111;

    B = 101010;

    hamming_distance(A, B) = count_1(A xor B) = count_1(001101) = 3

    1

    2

    3

    A和B的海明距离是否小于等于n,这个n值根据经验一般取值为3。

    4. Python使用

    使用simhash。

    (1) 查看simhash值

    >>> from simhash import Simhash

    >>> print '%x' % Simhash(u'I am very happy'.split()).value

    9f8fd7efdb1ded7f

    1

    2

    3

    Simhash()接收一个token序列,或者叫特征序列。

    (2)计算两个simhash值距离

    >>> hash1 = Simhash(u'I am very happy'.split())

    >>> hash2 = Simhash(u'I am very sad'.split())

    >>> print hash1.distance(hash2)

    5

    1

    2

    3

    4

    (3)建立索引

    simhash被用来去重。如果两两分别计算simhash值,数据量较大的情况下肯定hold不住。有专门的数据结构,参考:http://www.cnblogs.com/maybe2030/p/5203186.html#_label4

    from simhash import Simhash, SimhashIndex

    # 建立索引

    data = {

        u'1': u'How are you I Am fine . blar blar blar blar blar Thanks .'.lower().split(),

        u'2': u'How are you i am fine .'.lower().split(),

        u'3': u'This is simhash test .'.lower().split(),

    }

    objs = [(id, Simhash(sent)) for id, sent in data.items()]

    index = SimhashIndex(objs, k=10)  # k是容忍度;k越大,检索出的相似文本就越多

    # 检索

    s1 = Simhash(u'How are you . blar blar blar blar blar Thanks'.lower().split())

    print index.get_near_dups(s1)

    # 增加新索引

    index.add(u'4', s1)

    ---------------------

    作者:BrownWong

    来源:CSDN

    原文:https://blog.csdn.net/qq_16912257/article/details/72156277

    版权声明:本文为博主原创文章,转载请附上博文链接!

    相关文章

      网友评论

          本文标题:局部敏感的散列算法(hash)

          本文链接:https://www.haomeiwen.com/subject/zvqidqtx.html