网页去重算法介绍
從“語義指紋算法”到“網頁去重算法”,最終在csdn blog上找到部分我想要的資料了。不能直接轉載,只好實施起“人工+智能”。
?
================================================================================================
以下內容來自csdn的"機器學習和我關注的技術"
================================================================================================
網頁去重-比較文本的相似度-Near duplication detection http://blog.csdn.net/beta2/article/details/4974221
Near duplicate detection 的任務是檢測重復的內容,這項工作在搜索引擎,版權保護,信息展示等方面都有很好的應用。在搜索引擎上,主要是去掉重復的頁面,圖片,文件,文檔等等。下面就指討論網頁的deduplication。
?
問題是什么?
? ? 據統計,網頁上的大部分相同的頁面占29%,而主體內容完全相同的占22%,這些重復網頁有的是沒有一點改動的拷貝,有的在內容上稍作修改,比如同一文章的不同版本,一個新一點,一個老一點,有的則僅僅是網頁的格式不同(如 HTML, Postscript),文獻[Models and Algorithms for Duplicate Document Detection 1999年]將內容重復歸結為以下四個類型:
1.如果2篇文檔內容和格式上毫無差別,則這種重復叫做full-layout duplicate。
2.如果2篇文檔內容相同,但是格式不同,則叫做full-content duplicates
3.如果2篇文檔有部分重要的內容相同,并且格式相同,則稱為partial-layout duplicates
4.如果2篇文檔有部分重要的內容相同,但是格式不同,則稱為partial-content duplicates
?
網頁去重的任務就是去掉網頁中主題內容重復的部分。它和網頁凈化(noise reduction),反作弊(antispam) 是搜索引擎的3大門神
?
去重在我看來起碼有四好處:減少存儲;增強檢索效率;增強用戶的體驗;死鏈的另一種解決方案。
?
目前從百度的搜索結果來看,去重工作做的不是很完善,一方面可能是技術難度(precision和recall都超過90%還是很難的);另一方面可能是重復的界定,比如轉載算不算重復?所以另一項附屬的工作是對個人可寫的頁面(PWP)進行特殊的處理,那么隨之而來的工作就是識別PWP頁面。^_^這里就不扯遠呢。
?
問題如何解決?
網頁的deduplication,我們的算法應該是從最簡單的開始,最樸素的算法當然是
?
? ? ? ? 對文檔進行兩兩比較,如果A和B比較,如果相似就去掉其中一個
?
然而這個樸素的算法,存在幾個沒有解決的問題:
? ? ?0.要解決問題是什么?full-layout?full-content?partial-layout還是partial-content?
? ? ?1. 怎么度量A 和 B的相似程度
? ? ?2. 去掉A還是去掉B,如果A ~B(~表相似,!~表示不相似),B~C 但是 A!~C,去掉B的話,C就去不掉。
?
另一個更深入的問題是,算法的復雜度是多少?假設文檔數為n,文檔平均長度為m,如果相似度計算復雜度為m的某一個復雜度函數:T=T(m),文檔兩兩比較的復雜度是O(n^2),合起來是O(n^2 * T(m)) . 這個復雜度是相當高的,想搜索引擎這樣處理海量數據的系統,這樣的復雜度是完全不能接受的,所有,另外三個問題是:
?
? ? ? 3. 如何降低相似度計算的復雜化度
? ? ? 4. 如何減少文檔比較的復雜度
? ? ? 5. 超大數據集該如何處理
第0個問題是,我們要解決的關鍵,不同的問題有不同的解決方法,從網頁的角度來看,結構的重復并不能代表是重復,比如產品展示頁面,不同的產品展示頁面就有相同的文檔結構。內容來看,復制網站會拷貝其他網站的主要內容,然后加些廣告或做些修改。所以,解決的問題是,partial-content deduplication,那么首先要抽取網頁的主體內容。算法變成:
?
? ? ?抽取文檔主體內容,兩兩比較內容的相似性,如果A和B相似,去掉其中一個
其次,問題2依賴于問題1的相似度度量,如果度量函數具有傳遞性,那么問題2就不存在了,如果沒有傳遞性,我們的方法是什么呢?哦,那就找一個關系,把相似關系傳遞開嘛,簡單,聚類嘛,我們的框架可以改成:
?
? ? ?抽取文檔主體內容,兩兩比較內容的相似性,如果A和B相似,把他們聚類在一起,最后一個類里保留一個page
最后,歸納為幾個步驟
第一步:識別頁面的主題內容,網頁凈化的一部分,以后討論
第二步:計算相似度
第三步:聚類算法,計算出文檔那些文檔是相似的,歸類。
?
核心的問題是,“如何計算相似度?”這里很容易想到的是
? ?1. 計算內容的編輯距離edit distance(方法很有名,但是復雜度太高)
? ?2. 把內容分成一個個的token,然后用集合的jaccard度量(好主意,但是頁面內容太多,能不能減少啊?)
?
好吧,但是,當然可以減少集合的個數呢,采樣,抽取滿足性質的token就可以啦,如滿足 mod m =0 的token,比如有實詞?比如stopwords。真是絕妙的注意.在把所有的idea放一起前,突然靈光一現,啊哈,
? ?3. 計算內容的信息指紋,參考google研究員吳軍的數學之美系列http://www.googlechinablog.com/2006/08/blog-post.html
?
把他們放在一起:?
? ? ?
第一步:識別頁面的主題內容,網頁凈化的一部分,以后討論
第二步:提取頁面的特征。將文章切分為重合和或不重合的幾個結合,hash out
第三步:用相似度度量來計算集合的相似性,包括用信息指紋,Jaccard集合相似度量,random projection等。
第四步:聚類算法,計算出文檔那些文檔是相似的,歸類。
?
方法分類:
?
按照利用的信息,現有方法可以分為以下三類
1.只是利用內容計算相似
2.結合內容和鏈接關系計算相似
3.結合內容,鏈接關系以及url文字進行相似計算
?
一般為內容重復的去重,實際上有些網頁是
按照特征提取的粒度現有方法可以分為以下三類
?
1.按照單詞這個級別的粒度進行特征提取.
2.按照SHINGLE這個級別的粒度進行特征提取.SHNGLE是若干個連續出現的單詞,級別處于文檔和單詞之間,比文檔粒度小,比單詞粒度大.
3.按照整個文檔這個級別的粒度進行特征提取
?
算法-具體見真知
1. I-Match
2. Shingling
3. Locality Sensitive Hashing.(SimHash)
4. SpotSigs
5. Combined
?
網頁去重-算法篇 http://blog.csdn.net/beta2/article/details/5014530
前一篇提到了5個解決網頁去重的算法,這里我想討論下這些算法
1. I-Match
2. Shingliing
3. SimHashing( locality sensitive hash)
4. Random Projection
5. SpotSig
6. combined
I-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。
?
網頁去重-鏡像站點的特殊處理 http://blog.csdn.net/beta2/article/details/5028411
基于關鍵詞的復制網頁算法
想前面的提到的算法都是基于這個文檔的,對于大型的搜索引擎來說,在性能上有些差距,所以有些優化,針對是網頁的關鍵詞,或者網頁的meta描述部分。所以,必須有以下的技術做支撐:
1、網頁中出現的關鍵詞(中文分詞技術)以及每個關鍵詞的權重(關鍵詞密度);
2、提取meta descrīption或者每個網頁的若干(比如:512)個字節的有效文字。
在以下算法描述中,我們約定幾個信息指紋變量:
Pi表示第i個網頁;
該網頁權重最高的N個關鍵詞構成集合Ti={t1,t2,...tn},其對應的權重為Wi={w1,w2,...wi}
摘要信息用Des(Pi)表示,前n個關鍵詞拼成的字符串用Con(Ti)表示,對這n個關鍵詞排序后形成的字符串用Sort(Ti)表示。
以上信息指紋都用MD5函數進行加密。
基于關鍵詞的復制網頁算法有以下5種:
1、MD5(Des(Pi))=MD5(Des(Pj)),就是說摘要信息完全一樣,i和j兩個網頁就認為是復制網頁;
2、MD5(Con(Ti))=MD5(Con(Tj)),兩個網頁前n個關鍵詞及其權重的排序一樣,就認為是復制網頁;
3、MD5(Sort(Ti))=MD5(Sort(Tj)),兩個網頁前n個關鍵詞一樣,權重可以不一樣,也認為是復制網頁。
4、MD5(Con(Ti))=MD5(Con(Tj))并且Wi-Wj的平方除以Wi和Wj的平方之和小于某個闕值a,則認為兩者是復制網頁。
5、MD5(Sort(Ti))=MD5(Sort(Tj))并且Wi-Wj的平方除以Wi和Wj的平方之和小于某個闕值a,則認為兩者是復制網頁。
關于第4和第5的那個闕值a,主要是因為前一個判斷條件下,還是會有很多網頁被誤傷,搜索引擎開發根據權重的分布比例進行調節,防止誤傷。
這個是北大天網搜索引擎的去重算法(可以參考:《搜索引擎--原理、技術與系統》一書),以上5種算法運行的時候,算法的效果取決于N,就是關鍵詞數目的選取。當然啦,選的數量越多,判斷就會越精確,但是誰知而來的計算速度也會減慢下來。所以必須考慮一個計算速度和去重準確率的平衡。據天網試驗結果,10個左右關鍵詞最恰當。
資源:
SCAM (Stanford Copy Analysis Mechanism)=.http://infolab.stanford.edu/~shiva/SCAM/scamInfo.html
?
================================================================================================
以下內容來自csdn的"機器學習和我關注的技術"
================================================================================================
網頁去重-比較文本的相似度-Near duplication detection http://blog.csdn.net/beta2/article/details/4974221
Near duplicate detection 的任務是檢測重復的內容,這項工作在搜索引擎,版權保護,信息展示等方面都有很好的應用。在搜索引擎上,主要是去掉重復的頁面,圖片,文件,文檔等等。下面就指討論網頁的deduplication。
?
問題是什么?
? ? 據統計,網頁上的大部分相同的頁面占29%,而主體內容完全相同的占22%,這些重復網頁有的是沒有一點改動的拷貝,有的在內容上稍作修改,比如同一文章的不同版本,一個新一點,一個老一點,有的則僅僅是網頁的格式不同(如 HTML, Postscript),文獻[Models and Algorithms for Duplicate Document Detection 1999年]將內容重復歸結為以下四個類型:
1.如果2篇文檔內容和格式上毫無差別,則這種重復叫做full-layout duplicate。
2.如果2篇文檔內容相同,但是格式不同,則叫做full-content duplicates
3.如果2篇文檔有部分重要的內容相同,并且格式相同,則稱為partial-layout duplicates
4.如果2篇文檔有部分重要的內容相同,但是格式不同,則稱為partial-content duplicates
?
網頁去重的任務就是去掉網頁中主題內容重復的部分。它和網頁凈化(noise reduction),反作弊(antispam) 是搜索引擎的3大門神
?
去重在我看來起碼有四好處:減少存儲;增強檢索效率;增強用戶的體驗;死鏈的另一種解決方案。
?
目前從百度的搜索結果來看,去重工作做的不是很完善,一方面可能是技術難度(precision和recall都超過90%還是很難的);另一方面可能是重復的界定,比如轉載算不算重復?所以另一項附屬的工作是對個人可寫的頁面(PWP)進行特殊的處理,那么隨之而來的工作就是識別PWP頁面。^_^這里就不扯遠呢。
?
問題如何解決?
網頁的deduplication,我們的算法應該是從最簡單的開始,最樸素的算法當然是
?
? ? ? ? 對文檔進行兩兩比較,如果A和B比較,如果相似就去掉其中一個
?
然而這個樸素的算法,存在幾個沒有解決的問題:
? ? ?0.要解決問題是什么?full-layout?full-content?partial-layout還是partial-content?
? ? ?1. 怎么度量A 和 B的相似程度
? ? ?2. 去掉A還是去掉B,如果A ~B(~表相似,!~表示不相似),B~C 但是 A!~C,去掉B的話,C就去不掉。
?
另一個更深入的問題是,算法的復雜度是多少?假設文檔數為n,文檔平均長度為m,如果相似度計算復雜度為m的某一個復雜度函數:T=T(m),文檔兩兩比較的復雜度是O(n^2),合起來是O(n^2 * T(m)) . 這個復雜度是相當高的,想搜索引擎這樣處理海量數據的系統,這樣的復雜度是完全不能接受的,所有,另外三個問題是:
?
? ? ? 3. 如何降低相似度計算的復雜化度
? ? ? 4. 如何減少文檔比較的復雜度
? ? ? 5. 超大數據集該如何處理
第0個問題是,我們要解決的關鍵,不同的問題有不同的解決方法,從網頁的角度來看,結構的重復并不能代表是重復,比如產品展示頁面,不同的產品展示頁面就有相同的文檔結構。內容來看,復制網站會拷貝其他網站的主要內容,然后加些廣告或做些修改。所以,解決的問題是,partial-content deduplication,那么首先要抽取網頁的主體內容。算法變成:
?
? ? ?抽取文檔主體內容,兩兩比較內容的相似性,如果A和B相似,去掉其中一個
其次,問題2依賴于問題1的相似度度量,如果度量函數具有傳遞性,那么問題2就不存在了,如果沒有傳遞性,我們的方法是什么呢?哦,那就找一個關系,把相似關系傳遞開嘛,簡單,聚類嘛,我們的框架可以改成:
?
? ? ?抽取文檔主體內容,兩兩比較內容的相似性,如果A和B相似,把他們聚類在一起,最后一個類里保留一個page
最后,歸納為幾個步驟
第一步:識別頁面的主題內容,網頁凈化的一部分,以后討論
第二步:計算相似度
第三步:聚類算法,計算出文檔那些文檔是相似的,歸類。
?
核心的問題是,“如何計算相似度?”這里很容易想到的是
? ?1. 計算內容的編輯距離edit distance(方法很有名,但是復雜度太高)
? ?2. 把內容分成一個個的token,然后用集合的jaccard度量(好主意,但是頁面內容太多,能不能減少啊?)
?
好吧,但是,當然可以減少集合的個數呢,采樣,抽取滿足性質的token就可以啦,如滿足 mod m =0 的token,比如有實詞?比如stopwords。真是絕妙的注意.在把所有的idea放一起前,突然靈光一現,啊哈,
? ?3. 計算內容的信息指紋,參考google研究員吳軍的數學之美系列http://www.googlechinablog.com/2006/08/blog-post.html
?
把他們放在一起:?
? ? ?
第一步:識別頁面的主題內容,網頁凈化的一部分,以后討論
第二步:提取頁面的特征。將文章切分為重合和或不重合的幾個結合,hash out
第三步:用相似度度量來計算集合的相似性,包括用信息指紋,Jaccard集合相似度量,random projection等。
第四步:聚類算法,計算出文檔那些文檔是相似的,歸類。
?
方法分類:
?
按照利用的信息,現有方法可以分為以下三類
1.只是利用內容計算相似
2.結合內容和鏈接關系計算相似
3.結合內容,鏈接關系以及url文字進行相似計算
?
一般為內容重復的去重,實際上有些網頁是
按照特征提取的粒度現有方法可以分為以下三類
?
1.按照單詞這個級別的粒度進行特征提取.
2.按照SHINGLE這個級別的粒度進行特征提取.SHNGLE是若干個連續出現的單詞,級別處于文檔和單詞之間,比文檔粒度小,比單詞粒度大.
3.按照整個文檔這個級別的粒度進行特征提取
?
算法-具體見真知
1. I-Match
2. Shingling
3. Locality Sensitive Hashing.(SimHash)
4. SpotSigs
5. Combined
?
網頁去重-算法篇 http://blog.csdn.net/beta2/article/details/5014530
前一篇提到了5個解決網頁去重的算法,這里我想討論下這些算法
1. I-Match
2. Shingliing
3. SimHashing( locality sensitive hash)
4. Random Projection
5. SpotSig
6. combined
I-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。
?
網頁去重-鏡像站點的特殊處理 http://blog.csdn.net/beta2/article/details/5028411
基于關鍵詞的復制網頁算法
想前面的提到的算法都是基于這個文檔的,對于大型的搜索引擎來說,在性能上有些差距,所以有些優化,針對是網頁的關鍵詞,或者網頁的meta描述部分。所以,必須有以下的技術做支撐:
1、網頁中出現的關鍵詞(中文分詞技術)以及每個關鍵詞的權重(關鍵詞密度);
2、提取meta descrīption或者每個網頁的若干(比如:512)個字節的有效文字。
在以下算法描述中,我們約定幾個信息指紋變量:
Pi表示第i個網頁;
該網頁權重最高的N個關鍵詞構成集合Ti={t1,t2,...tn},其對應的權重為Wi={w1,w2,...wi}
摘要信息用Des(Pi)表示,前n個關鍵詞拼成的字符串用Con(Ti)表示,對這n個關鍵詞排序后形成的字符串用Sort(Ti)表示。
以上信息指紋都用MD5函數進行加密。
基于關鍵詞的復制網頁算法有以下5種:
1、MD5(Des(Pi))=MD5(Des(Pj)),就是說摘要信息完全一樣,i和j兩個網頁就認為是復制網頁;
2、MD5(Con(Ti))=MD5(Con(Tj)),兩個網頁前n個關鍵詞及其權重的排序一樣,就認為是復制網頁;
3、MD5(Sort(Ti))=MD5(Sort(Tj)),兩個網頁前n個關鍵詞一樣,權重可以不一樣,也認為是復制網頁。
4、MD5(Con(Ti))=MD5(Con(Tj))并且Wi-Wj的平方除以Wi和Wj的平方之和小于某個闕值a,則認為兩者是復制網頁。
5、MD5(Sort(Ti))=MD5(Sort(Tj))并且Wi-Wj的平方除以Wi和Wj的平方之和小于某個闕值a,則認為兩者是復制網頁。
關于第4和第5的那個闕值a,主要是因為前一個判斷條件下,還是會有很多網頁被誤傷,搜索引擎開發根據權重的分布比例進行調節,防止誤傷。
這個是北大天網搜索引擎的去重算法(可以參考:《搜索引擎--原理、技術與系統》一書),以上5種算法運行的時候,算法的效果取決于N,就是關鍵詞數目的選取。當然啦,選的數量越多,判斷就會越精確,但是誰知而來的計算速度也會減慢下來。所以必須考慮一個計算速度和去重準確率的平衡。據天網試驗結果,10個左右關鍵詞最恰當。
資源:
SCAM (Stanford Copy Analysis Mechanism)=.http://infolab.stanford.edu/~shiva/SCAM/scamInfo.html
總結
- 上一篇: 2022哈工大软件构造lab1小结(知识
- 下一篇: 一篇文章看懂Facebook和新浪微博的