Simhash 网页重复
Simhash
傳統IR領域內文本相似度比較所采用的經典方法是文本相似度的向量夾角余弦,其主要思想是根據一個文章中出現詞的詞頻構成一個向量,然后計算兩篇文章對應向量的向量夾角。但由于有可能一個文章的特征向量詞特別多導致整個向量維度很高,使得計算的代價太大,對于Google這種處理萬億級別的網頁的搜索引擎而言是不可接受的,simhash算法的主要思想是降維,將高維的特征向量映射成一個f-bit的指紋(fingerprint),通過比較兩篇文章的f-bit指紋的Hamming Distance來確定文章是否重復或者高度近似。
simhash算法很精巧,但卻十分容易理解和實現,具體的simhash過程如下:
1. 首先基于傳統的IR方法,將文章轉換為一組加權的特征值構成的向量。
2.初始化一個f維的向量V,其中每一個元素初始值為0。
3.對于文章的特征向量集中的每一個特征,做如下計算:
利用傳統的hash算法映射到一個f-bit的簽名。對于這個f- bit的簽名,如果簽名的第i位上為1,則對向量V中第i維加上這個特征的權值,否則對向量的第i維減去該特征的權值。
4.對整個特征向量集合迭代上述運算后,根據V中每一維向量的符號來確定生成的f-bit指紋的值,如果V的第i維為正數,則生成f-bit指紋的第i維為1,否則為0。
simhash和普通hash最大的不同在于傳統的hash函數雖然也可以用于映射來比較文本的重復,但是對于可能差距只有一個字節的文檔也會映射成兩個完全不同的哈希結果,而simhash對相似的文本的哈希映射結果也相似。Google的論文中取了f=64,即將整個網頁的加權特征集合映射到一個64-bit的fingerprint上。
比起simhash,整片文章中Google所采用的查找與給定f-bit的fingerprint的海明距離(Hamming Distance)小于k的算法相對還稍微難理解點。
fingerprint的Hamming Distance
問題:一個80億的64-bit指紋組成的集合Q,對于一個給定64-bit的指紋F,如何在a few millionseconds中找到Q中和f至多只有k(k=3)位差別的指紋。
思想:1. 對于一個具有2^d個記錄的集合,只需要考慮d-bit hash。2. 選取一個d’使得|d’-d|十分小,因此如果兩fingerprint在d’-bits上都相同,那么在d-bits也很可能相同。然后在這些d-bit match的結果中尋找整個f-bit的Hamming Distance小于k的fingerprint。 簡單的說,就是利用fingerprint少量特征位數比較從而首先縮小范圍,然后再去確定是否差異小于k個bit。
算法:
1. 首先對于集合Q構建多個表T1,T2…Tt,每一個表都是采用對應的置換函數π(i)將64-bit的fingerprint中的某p(i)位序列置換換到整個序列的最前面。即每個表存儲都是整個Q的fingerprint的復制置換。
2.對于給定的F,在每個Ti中進行匹配,尋找所有前pi位與F經過π(i)置換后的前pi位相同的fingerprint。
3.對于所有在上一步中匹配到的置換后的fingerprint,計算其是否與π(i)(F)至多有k-bit不同。
算法的重點在于對于集合Q的分表以及每個表所對應的置換函數,假設對于64-bit的fingerprint,k=3,存儲16個table,劃分參考下圖:
將64-bit按照16位劃分為4個區間,每個區間剩余的48-bit再按照每個12-bit劃分為4個區間,因此總共16個table并行查找,即使三個不同的k-bit落在A、B、C、D中三個不同的區塊,此劃分方法也不會導致遺漏。
以上方法是對于online的query,即一個給定的F在集合中查找相似的fingerprint。如果爬蟲每天爬取了100w個網頁,快速的查找這些新抓取的網頁是否在原集合中有Near-duplication,對于這種batch-query的情況,Map-Reduce就發揮它的威力了。
不同的是,在batch-query的處理中,是對待查集合B(1M個fingerprint)進行復制置換構建Table而非8B的目標集合,而在每一個chunkserver上對Fi(F為整個8B的fingerprint)在整個Table(B)中進行探測,每一個chunkserver上的的該Map過程輸出該Fi中與整個B的near-duplicates,Reduces過程則將所有的結果收集、去重、然后輸出為一個sorted file。
Haffman編碼壓縮
上述的查詢過程,特別是針對online-version的算法,可以看出需要對8B的fingerprint進行多表復制和構建,其占據的容量是非常大的,不過由于構建的每一個置換Table都是sorted的,因此可以利用每一個fingerprint與其前一個的開始不同的bit-position h(h∈[0,f-1]) 來進行數據壓縮,即如果前一個編碼是11011011,而自身是11011001,則后一個可以編碼為(6)1,即h=6,其中6表示從第6位(從0開始編號)開始和上一個fingerprint不相同(上一個為1,這個必然為0),然后再保存不相同位置右側的編碼,依次生成整個table。
Google首先計算整個排序的fingerprint表中h的分布情況,即不同的h出現次數,依據此對[0,f-1]上出現的h建立Haffman code,再根據上述規則生成table(例如上面的6就表示成對應的Haffman code)。其中table分為多個block,每一個block中的第一個fingerprint保存原數據,后面的依次按照編碼生成。
將每一個block中所對應的最后一個fingerprint保存在內存中,因此在比對的時候就可以直接根據內存中的fingerprint來確定是哪一個block需要被decompress進行比較。
8B個64-bit的fingerprint原占據空間大約為64GB,利用上述Haffman code壓縮后幾乎會減少一般,而內存中又只對每一個block保存了一個fingerprint。
?
每次看Google的論文都會讓人眼前一亮,而且與很多(特別是國內)的論文是對未來進行設想不同,Google的東西都是已經運行了2,3年了再到WWW,OSDI這種頂級會議上灌個水。再次各種羨慕能去這個Dream Company工作的人,你們懂得。
參考:
Detecting Near-Duplicates for Web Crawling(Paper)
Detecting Near-Duplicates for Web Crawling(PPT)
轉載請注明來源:Leoncom-《simhash與Google的網頁去重》 duplication elinimation,?Google,?simhash Address:?http://leoncom.org/?p=650607 ??Dynamo,Cassandra,Hypertable的負載均衡策略 Amazon AWS的宕機事件與容錯?? 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Simhash 网页重复的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Text Mining Blog
- 下一篇: Command of SVN for l