海量數據去重之SimHash算法簡介和應用

SimHash是什麼

SimHash是Google在2007年發表的論文《Detecting Near-Duplicates for Web Crawling 》中提到的一種指紋生成算法或者叫指紋提取算法,被Google普遍應用在億級的網頁去重的Job中,做爲locality sensitive hash(局部敏感哈希)的一種,其主要思想是降維,什麼是降維? 舉個通俗點的例子,一篇若干數量的文本內容,通過simhash降維後,可能僅僅獲得一個長度爲32或64位的二進制由01組成的字符串,這一點很是類似咱們的身份證,試想一下,若是你要在中國13億+的茫茫人海中尋找一我的,若是你不知道這我的的身份證,你可能要提供姓名 ,住址, 身高,體重,性別,等等維度的因素來肯定是否爲某我的,從這個例子已經能看出來,若是有一個一維的核心條件身份證,那麼查詢則是很是快速的,若是沒有一維的身份證條件,可能綜合其餘幾個非核心的維度,也能肯定一我的,可是這種查詢則就比較慢了,而經過咱們的SimHash算法,則就像是給每一個人生成了一個身份證,使複雜的事物,可以經過降維來簡化。html

SimHash的工做原理

SimHash算法工做流程圖:
 
解釋下上圖:
(1)準備一篇文本
(2)過濾清洗,提取n個特徵關鍵詞,這步通常用分詞的方法實現,關於分詞,比較經常使用的有IK,mmseg4j,ansj
(3)特徵加權,這一步若是有本身針對某個行業的定義的語料庫時候可使用,沒有的話,就用分詞後的詞頻便可
(4)對關鍵詞進行hash降維01組成的簽名(上述是6位)
(5)而後向量加權,對於每個6位的簽名的每一位,若是是1,hash和權重正相乘,若是爲0,則hash和權重負相乘,至此就能獲得每一個特徵值的向量。
(6)合併全部的特徵向量相加,獲得一個最終的向量,而後降維,對於最終的向量的每一位若是大於0則爲1,不然爲0,這樣就能獲得最終的simhash的指紋簽名
 
一個例子以下:
 

SimHash的應用

經過上面的步驟,咱們能夠利用SimHash算法爲每個網頁生成一個向量指紋,那麼問題來了,如何判斷2篇文本的類似性?
這裏面主要應用到是海明距離。
 
(1)什麼是海明距離
兩個碼字的對應比特取值不一樣的比特數稱爲這兩個碼字的海明距離。在一個有效編碼集中,任意兩個碼字的海明距離的最小值稱爲該編碼集的海明距離。舉例以下:10101和00110從第一位開始依次有第一位、第4、第五位不一樣,則海明距離爲3。
 
(2)海明距離的幾何意義
n位的碼字能夠用 n維空間的超立方體的一個頂點來表示。兩個碼字之間的海明距離就是超立方體兩個頂點之間的一條邊,並且是這兩個頂點之間的最短距離。
 
(3)海明距離的應用場景
用於編碼的檢錯和糾錯 
 
通過SimHash算法提取來的指紋(Simhash對長文本500字+比較適用,短文本可能誤差較大,具體須要根據實際場景測試),最後使用海明距離,求類似,在google的論文給出的數據中,64位的簽名,在海明距離爲3的狀況下,可認爲兩篇文檔是類似的或者是重複的,固然這個值只是參考值,針對本身的應用可能又不一樣的測試取值
 
到這裏類似度問題基本解決,可是按這個思路,在海量數據幾百億的數量下,效率問題仍是沒有解決的,由於數據是不斷添加進來的,不可能每來一條數據,都要和全庫的數據作一次比較,按照這種思路,處理速度會愈來愈慢,線性增加。
 
針對這個問題在Google的論文中也提出了對應的思路,根據鴿巢原理(也稱抽屜原理):
 
桌上有十個蘋果,要把這十個蘋果放到九個抽屜裏,不管怎樣放,咱們會發現至少會有一個抽屜裏面至少放兩個蘋果。這一現象就是咱們所說的「抽屜原理」。 抽屜原理的通常含義爲:「若是每一個抽屜表明一個集合,每個蘋果就能夠表明一個元素,假若有n+1個元素放到n個集合中去,其中一定有一個集合裏至少有兩個元素。」 抽屜原理有時也被稱爲鴿巢原理。它是組合數學中一個重要的原理。 [1]  
 
 
 
道理很簡單,但在把這應用到現實問題中,但是能發揮巨大做用的,這也就是數學的奧妙之處。
 
針對海量數據的去重效率,咱們能夠將64位指紋,切分爲4份16位的數據塊,根據抽屜原理在海明距離爲3的狀況,若是兩個文檔類似,那麼它必有一個塊的數據是相等的,如圖:
而後將4份數據經過K-V數據庫或倒排索引存儲起來K爲16位截斷指紋,V爲K相等時剩餘的48位指紋集合,查詢時候,精確匹配這個指紋的4個16位截斷,如圖所示:
 
如此,假設樣本庫,有2^34條數據(171億數據),假設數據均勻分佈,則每一個16位(16個01數字隨機組成的組合爲2^16個)倒排返回的最大數量爲
2^34/2^16=2^(34-16)=262144個候選結果,4個16位截斷索引,總的結果爲:4*262144=1048576,約爲100多萬,經過
這樣一來的降維處理,原來須要比較171億次,如今只須要比較100萬次便可獲得結果,這樣以來大大提高了計算效率。
 
 
參考文章:
相關文章
相關標籤/搜索