第一種是方案是查找待查詢文本的64位simhash code的全部3位之內變化的組合,大約須要四萬屢次的查詢,參考下圖:html
第二種方案是預生成庫中全部樣本simhash code的3位變化之內的組合,大約須要佔據4萬多倍的原始空間,參考下圖 git
上述兩種方法,或者時間複雜度,或者空間複雜度,其一沒法知足實際的需求。咱們須要一種方法,其時間複雜度優於前者,空間複雜度優於後者。 假設咱們要尋找海明距離3之內的數值,根據抽屜原理,只要咱們將整個64位的二進制串劃分爲4塊,不管如何,匹配的兩個simhash code之間至少有一塊區域是徹底相同的,如圖所示 github
因爲咱們沒法事先得知徹底相同的是哪一塊區域,所以咱們必須採用存儲多份table的方式。在本例的狀況下,咱們須要存儲4份table,並將64位的simhash code等分紅4份;對於每個輸入的code,咱們經過精確匹配的方式,查找前16位相同的記錄做爲候選記錄,如圖所示:算法
讓咱們來總結一下上述算法的實質:數組
一、將64位的二進制串等分紅四塊函數
二、調整上述64位二進制,將任意一塊做爲前16位,總共有四種組合,生成四份table post
三、採用精確匹配的方式查找前16位 性能
四、若是樣本庫中存有2^34(差很少10億)的哈希指紋,則每一個table返回2^(34-16)=262144個候選結果,大大減小了海明距離的計算成本測試
咱們能夠將這種方法拓展成多種配置,不過,請記住,table的數量與每一個table返回的結果呈此消彼長的關係,也就是說,時間效率與空間效率不可兼得! 這就是Google天天所作的,用來識別獲取的網頁是否與它龐大的、數以十億計的網頁庫是否重複。另外,simhash還能夠用於信息聚類、文件壓縮等。url
SimHash 算法原理
simhash用於比較大文本,好比500字以上效果都還蠻好,距離小於3的基本都是類似,誤判率也比較低。可是若是咱們處理的是微博信息,最多也就140個字,使用simhash的效果並不那麼理想。看以下圖,在距離爲3時是一個比較折中的點,在距離爲10時效果已經不好了,不過咱們測試短文本不少看起來類似的距離確實爲10。若是使用距離爲3,短文本大量重複信息不會被過濾,若是使用距離爲10,長文本的錯誤率也很是高,如何解決?——採用分段函數!
SimHash 算法原理——評估結果
一、dump 一天的新聞數據:
數據項要求:標題、內容、新聞原始地址。
二、評估指標
排重準確率(97%): 數據集:排從新聞集
方式:人工(研發先評估、產品評估)
召回率(75%):
數據集:訓練數據集-排從新聞集
方式:擴大海明距離,再進行人工評估
SimHash 算法原理——代碼片斷
高效計算二進制序列中1的個數:這個函數來計算的話,時間複雜度是 O(n); 這裏的n默認取值爲3。因而可知仍是蠻高效的。