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的個數。
舉例如下:
aa和b的海明距離是否小於等於n,這個n值根據經驗一般取值為3。= 100111;
b = 101010;
hamming_distance
(a, b) = count_1
(a xor b) = count_1
(001101) = 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演算法產生的兩個簽名,如果相等,說明原始內容在一定概率下是相等的 如果不相等,除了說明原始內容不相等外,不再提供任何資訊...