最近做乙個mini搜尋引擎專案,在專案實行過程中,如果使用余弦求網頁相似度,不能適應海量網頁查重。看了那本《這就是搜尋引擎 核心技術詳解》後,對simhash演算法有一定的理解,並且喜歡上了這個演算法。關於simhash的使用,看部落格 。
以下是專案的演算法。每次讀取乙個文件就進行查重,以便於適應日後用網路爬蟲抓取網頁,動態地進行查重得需要。查重的過程很快,因為simhash值在set中是有序的,set的查詢效率還算高。花時間比較多的在於對網頁的處理上(分詞,詞頻統計等),還好這只是預處理,不是響應客戶端。
一、預處理
1、dirscan.hpp 遞迴遍歷語料資料夾,將所有文件的絕對路徑儲存到vectoroldvec 中;
2、duplicateremoval 對上述的 oldvec 進行遍歷操作:
迴圈做以下操作:
1)根據vector中的乙個路徑讀取一篇網頁到字串。
2)使用"cppjiaba 工具"對字串進行分詞,詞頻統計,取topn個關鍵字。
3)使用"simhash 工具"將topn關鍵字對映成乙個代表網頁特徵的64bit simhash值。
4)使用"simhash"中的isequal()方法,將待選網頁的64bit simhash與set中的simhash值比較,判斷海明距離與3(預設為3,可以是別的)的關係。
5)如果isequal()返回true;則說明海明距離小於3,即判定此網頁與已選網頁中的某一篇重複。返回步驟 1)。
如果isequal()返回false;則說明不重複,做進一步操作步驟 6)。
6)將simhash值插入到set中,並將此網頁的路徑加入到新的陣列vectornewvec中。
7)迴圈上述操作,指導下標指向oldvec的結尾。結束後得到乙個裝有不重複網頁的路徑的陣列 newvec。
類或者模組之間的關係:
cppjiaba <- dict
simhasher.hpp <- cppjiaba
simhasher.hpp <- jenkins.h(產生雜湊值的工具)
duplicateremoval.hpp <-simhasher.hpp
最終我們使用duplicateremoval就可以完成網頁去重的工作。
3、filehandle.hpp 對網頁進行格式化
將duplicateremoval處理的結果傳給filahandle.cpp的物件,就可以得到乙個網頁庫檔案和乙個檔案偏移檔案。
4、buildindex 建字典(雜湊加鍊表優化詞典)和倒排檔案(……,,……)
使用cppjieba,根據偏移檔案讀取網頁庫,對每一篇網頁進行分詞,詞頻統計……。
二、服務端程式設計
1)接收客戶端請求的字串str
2)使用cppjieba分詞庫對str進行分詞(使用full模式)
3)將分詞結果儲存到乙個陣列中
4)對陣列進行遍歷操作,根據倒排檔案尋找對應的網頁,讀取出的網頁根據單詞的權重進行排序。
5)讀取網頁,並用xmlparser.hpp(已經封裝好)解析xml格式的文件
6)用cppjson工具將解析結果封裝成json字串返回客戶端。
以上僅供參考,可能還會有優化的地方。專案的**還差一點完成,之後見github。
ASC超算競賽及基本思路
目錄 設計超算集群 看參考文獻做設計 對超算集群進行效能測試 一般來講的測試工具就是用hpl,找到最適合的引數,達到最優秀的計算能力 數字影象處理 通常 量較大,優化較為困難,優化偏重於編譯引數,執行引數和數學庫blas的重新鏈結,對於熱點可以考慮並行 讀寫 演算法 氣候 這個需要做的就是優化 目的...
C 算24 解題思路
給出4個小於10個正整數,你可以使用加減乘除4種運算以及括號把這4個數連線起來得到乙個表示式。現在的問題是,是否存在一種方式使得得到的表示式的結果等於24。這裡加減乘除以及括號的運算結果和運算的優先順序跟我們平常的定義一致 這裡的除法定義是實數除法 比如,對於5,5,5,1,我們知道5 5 1 5 ...
專案設計的方案及思路
答 而每乙個模組,再具體到程式之中就是乙個類,也是乙個類檔案,因為在php中乙個類檔案有且僅有l乙個類,而且類檔案是由類名.class.php組成的,那麼問題就來了,我們該如何來確定乙個專案需要哪些模組呢!答案是 我們必須從 的頁面入手,我們分頁每一頁面,然後利用頭腦風暴的方式在excel 中寫出每...