日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

simhash原理及使用

發布時間:2024/3/26 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 simhash原理及使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

    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

    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

    (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)


    Ref

    http://yanyiwu.com/work/2014/01/30/simhash-shi-xian-xiang-jie.html
    http://blog.csdn.net/madujin/article/details/53152619
    http://leons.im/posts/a-python-implementation-of-simhash-algorithm/

    總結

    以上是生活随笔為你收集整理的simhash原理及使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。