I-Match算法 網頁去重-算法篇
網頁去重-算法篇
前一篇(網頁去重-比較文本的相似度-Near duplication detection )提到了5個解決網頁去重的算法,這裏我想討論下這些算法1. I-Match
2. Shingliing3. SimHashing( locality sensitive hash)
4. Random Projection5. SpotSig
6. combinedI-Match算法
I-Match算法有一個基本的假設說:不經常出現的詞和經常出現的詞不會影響文檔的語義,所以這些詞是可以去掉的。
算法的基本思想是:將文檔中有語義的單詞用hash的辦法表示成一個數字,數字的相似性既能表達文檔的相似性
算法的框架是:
1. 獲取文檔(或者是主體內容)
2. 將文檔分解成token流,移除格式化的標籤
3. 使用term的閾值(idf),保留有意義的tokens
4. 插入tokens到升序排列的排序樹中
5. 計算tokens的SHA1
6. 將元組(doc_id,SHA hash) 插入到某一詞典中,如果詞典有衝突,這兩個文檔相似。
算法有一個缺點是穩定性差。如果文檔的某個詞改變了,最終的hash值就會發生顯著的變化。對空文檔,算法是無效的。
有一個解決辦法是,用隨機化的方法,參考Lexicon randomization for near-duplicate detection with I-Match。具體細節這裏就不提了
Shingling算法
Shingling算法說,I-Match以詞爲單位做hash顯然是不準確的,因爲它忽略了文檔之間的順序。另,Shingle指的是連續的若干個單詞的串。
Shingling算法有個簡單的數學背景。如果一個shingle的長度爲k,那麼長度爲n的文檔就有n-k+1個shingle,每一個shingle可以用MD5或者其他算法表示成一個fingerprint,而兩個文檔的相似性Jacard相似性來表示,Jarcard公式是指兩個集合的相似性=集合之交/集合之並。爲了估計兩個文檔的相似性,有時候n-k+1個fingerprint還是太大了,所以取m個fingerprint函數,對每一個函數fi,都可以計算出n-k+1個fingerprint,取其中的最小的fingerprint,稱爲i-minvalue. 那麼一個文檔就有m個i-minvalue。數學上,Broder大師說:
平均來講,兩個文檔中相同的唯一single的比率和兩個文檔中相同的i-minvalue的比率是一樣的Shingling的算法框架是:
1. 獲取文檔(或者是主體內容)
2. 將文檔分解成n-k+1個shingle,取m個fingerprint函數,對每一個fingerpint函數計算i-minvalue值
3. 將m個i-minvalue值組合成更少m’個surpersingle
4.計算兩個文檔相同的surpergingle的個數a。
5. 如果a大於某一個值b(say:2),那麼兩個文檔Jarcard 相似
一般的參數設置爲:m=84,m’=6,b=2
SimHash 算法
locality sensitive hash算法博大精深。基本思想是,如果兩個東西相似,我可以用一個hash函數把他們投影到相近的空間中LSH。用到near duplication detection上,算法框架是:
1. 將文檔轉換爲特徵的集合,每一個特徵有一個權重
2. 利用LSH函數把特徵向量轉換爲f位的fingerprint,如:64
3. 查找fingerprint的海明距離haha,看,多麼簡單和明朗,這裏的幾個問題及時尋找正確的LSH
Random Projection算法
shingling關注了文檔順序,但是忽略了文檔單詞出現的頻率,random projection說我要討論文檔的頻率。Random Projection也是很有意思的一種算法,它是一種隨機算法。簡單描述爲:
1. 將每一個token映射到b位的空間。每一個維度是由{-1,1}組成。對所有頁面投影函數是一樣的
2. 每一個頁面的b維度向量,是所有token的投影的簡單加和
3. 最後把b維向量中的正數表示爲1,負數和0都寫成0
4. 比較兩個page的b維向量一致的個數
Charikar最牛的地方是,證明,兩個b位變量一致的位數的比率就是文檔向量的consine相似性。這裏的數學基礎還是很有意思的,如果感興趣,可以參考M.S. Charikar. Similarity Estimation Techniques for Rounding Algorithm(May 2002)
SpotSig算法
ref:SpotSigs:Robust and Efficient Near Duplicate Detection in Large Web Collection
SpotSig是個比較有意思的算法,它說,我爲什麼要關注所有的單詞啊,我要關注的單詞是有語義的詞,哪些是有語義的詞呢?哦,想 the a this an 的等虛詞後面的就是我要關注的東西羅。Spot就是指這些虛詞的後面的詞串。然後呢,每一個文檔我都有很多很多Spot了,現在一個文檔就是一個Spot的集合,兩個文檔是相似程度就是集合的Jaccard相似度。算法雖然簡單,但是我想重點是兩個比較有借鑑意義的工程上的性能考慮。
1. Optimal Partition
Sim(A,B) = | A B交集| / | A B 並集| <= min(A,B)/max(A,B) <= |A|/|B| say: |A|<|B|好了,這是一個很好的枝剪條件,如果文檔spot vector的個數比小於某個值(當然是,小 / 大),就可以完全不用求交,並了。Optimal Partition就是說,好啊,我把每一個文檔的spot vector的長度都投影到相應的從小到大的bucket中,保證|d1|/|d2| >=r if |d1| < |d2| . 且不存在這樣的反例。另一個保證是這個bucket是滿足條件的最小的。有了這個partition,我們最多隻用關心相鄰的三個bucket了
2. Inverted Index Pruning 說,兩個文檔,如果能相似,起碼有一個公共的spot。逆向索引說的就是把spot做爲index,包含它的所有文檔作爲其value。有了這兩個工具,計算複雜度可以明顯下降,因爲它不會計算不能是duplication的文檔。