simhash原理及使用

2021-08-20 10:41:46 字數 1601 閱讀 2890

simhash是一種區域性敏感hash。那什麼叫區域性敏感呢,假定兩個字串具有一定的相似性,在hash之後,仍然能保持這種相似性,就稱之為區域性敏感hash。普通的hash是不具有這種屬性的。simhash被google用來在海量文字中去重。

演算法過程大概如下:

對每個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。

通過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。

使用simhash。

>>> 

from simhash import simhash

>>>

print

9f8fd7efdb1ded7f

simhash()接收乙個token序列,或者叫特徵序列。

>>> hash2 = simhash(u'i am very sad'.split())

>>>

print hash1.distance(hash2)

5simhash被用來去重。如果兩兩分別計算simhash值,資料量較大的情況下肯定hold不住。有專門的資料結構,參考:

from simhash import simhash, simhashindex

# 建立索引

data =

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

SIMhash演算法原理

第一次聽說google的simhash演算法 1 時,我感到很神奇。傳統的hash演算法只負責將原始內容盡量均勻隨機地對映為乙個簽名值,原理上相當於偽隨機數產生演算法。傳統hash演算法產生的兩個簽名,如果相等,說明原始內容在一定概率下是相等的 如果不相等,除了說明原始內容不相等外,不再提供任何資訊...

simhash演算法的原理

第一次聽說google的simhash演算法 1 時,我感到很神奇。傳統的hash演算法只負責將原始內容盡量均勻隨機地對映為乙個簽名值,原理上相當於偽隨機數產生演算法。傳統hash演算法產生的兩個簽名,如果相等,說明原始內容在一定概率下是相等的 如果不相等,除了說明原始內容不相等外,不再提供任何資訊...

simhash演算法的原理

第一次聽說google的simhash演算法 1 時,我感到很神奇。傳統的hash演算法只負責將原始內容盡量均勻隨機地對映為乙個簽名值,原理上相當於偽隨機數產生演算法。傳統hash演算法產生的兩個簽名,如果相等,說明原始內容在一定概率下是相等的 如果不相等,除了說明原始內容不相等外,不再提供任何資訊...