網頁去重之Simhash演算法
阿新 • • 發佈:2019-09-11
Simhash演算法是Google應用在網頁去重中的一個常用演算法,在開始講解Simhash之前,先了解——什麼是網頁去重?為什麼要進行網頁去重?如何進行網頁去重,其基本框架是什麼?
網頁去重,顧名思義,就是過濾掉重複的網頁。統計結果表明,近似重複網頁的數量佔網頁總數量的比例較高,即網際網路上有很多的頁面內容是完全一樣的或是相近的(這個不難理解,比如對於某一事件的新聞報道,很多是大同小異的)。基於這一實際情況,所以要進行網頁去重。
那麼如何進行網頁去重呢?這就用到了Simhash演算法。
去重演算法的任務是對海量資料進行處理,通用的網頁去重的基本框架如下。
參考: 1. 《這就是搜尋引擎-核心技術詳解》
- 對於給定的文件,首先通過一定的特徵抽取手段,從文件中抽取出一系列能夠表徵文件主體內容的特徵集合。這一步的關鍵點在於,儘可能保留文件的重要資訊,拋棄無關緊要的資訊。如何判定哪些資訊是重要的,哪些是不重要的,就是演算法研究的重點。
- 將文件轉換為特徵集合後,由於搜尋引擎所處理的網頁數量數以億計,為了能夠提高計算速度,很多演算法會在特徵集合的基礎上,對資訊進一步壓縮,採用資訊指紋相關演算法,將特徵集合壓縮為新的資料集合(即生成文件指紋),其包含的元素數量遠遠小於特徵集合數量。
- 把文件壓縮為文件指紋後,即可通過相似性計算來判斷哪些網頁是近似重複頁面。
- 從文件中提取一組能表徵文章的特徵詞(這裡首先需要利用開源的cppjieba進行分詞),並計算權重(見筆記:利用tf-idf演算法自動提取關鍵詞),得到pair<特徵詞,權重>;
- 利用hash函式(這個hash函式利用開源的),將每個特徵詞對映成為固定長度的二進位制數,即雜湊值,得到pair<雜湊值,權重>;
- 利用權值(w)對步驟2產生的二進位制數進行改寫,即把權重資訊融入二進位制序列中,變成一個實數向量。假設步驟2中得到的是<100110, w>,那麼經過改寫變成了實數向量(w,-w,-w,w,w,-w);
- 每個特徵詞都做了步驟3的改寫後,對一篇文件中的所有特徵詞的實數向量進行累加(即對應位置相加),從而獲得一個代表整個文件的實數向量。假設最後得到的實數向量是(13,108,-22,-5,-32,55)。
- 將步驟4得到的實數向量規範化,即將實數向量轉換為二進位制序列,轉換規則為正數變為1,負數變為0。即(13,108,-22,-5,-32,55) --> 110001。最終得到的這個二進位制序列就是本文件的文件指紋。
int numOf_1(int n) { int cnt = 0; while(n){ ++cnt; n = n & (n-1); } return cnt; }
至此,Simhash演算法就算全部講完了。 【總結】 1、網頁去重的基本框架 (1)特徵詞提取 --> (2)生成文件指紋 --> (3)相似性計算 2、simhash演算法,將一篇文件轉換成二進位制序列來表示 3、文件相似性計算-->計算兩篇文件的海明距離-->計算二進位制序列中"1"的個數
參考: 1. 《這就是搜尋引擎-核心技術詳解》