nimi SearchEngin 項目思路及算法

        最近作一個輕量文本搜索項目,在項目實行過程當中,若是使用餘弦求網頁類似度,不能適應海量網頁查重。看了那本《這就是搜索引擎  核心技術詳解》後,對simhash算法有必定的理解,而且喜歡上了這個算法。關於simhash的使用,看博客http://blog.csdn.net/u013209147/article/details/48227113 。git

        如下是項目的算法。每次讀取一個文檔就進行查重,以便於適應往後用網絡爬蟲抓取網頁,動態地進行查重得須要。查重的過程還行,simhash值在set中,此處還能夠進一步優化。花時間比較多的在於對網頁的處理上(分詞,詞頻統計等),還好這只是預處理,不是響應客戶端。github

1、預處理算法

一、DirScan.hpp 遞歸遍歷語料文件夾,將全部文檔的絕對路徑保存到vector<string> oldVec 中;
二、DuplicateRemoval 對上述的 oldVec 進行遍歷操做:
循環作如下操做:
1)根據vector<string>中的一個路徑讀取一篇網頁到字符串。
2)使用"cppjiaba 工具"對字符串進行分詞,詞頻統計,取topN個關鍵字。
3)使用"simhash 工具"將topN關鍵字映射成一個表明網頁特徵的64bit simhash值。
4)將"simhash"中的isEqual()方法,傳入find_if(),將待選網頁的64bit simhash與set<uint64_t>中的simhash值比較,判斷海明距離與3(默認爲3,能夠自定義)的關係。
5)若是isEqual()返回true;則說明海明距離小於3,即斷定此網頁與已選網頁中的某一篇重複。返回步驟 1)。
 若是isEqual()返回false;則說明不重複,作進一步操做步驟 6)。
6)將simhash值插入到set<uint64_t>中,並將此網頁的路徑加入到新的數組vector<string> newVec中。
7)循環上述操做,指導下標指向oldVec的結尾。結束後獲得一個裝有不重複網頁的路徑的數組 newVec。


編程

類或者模塊之間的關係:json

cppjiaba <- dict
Simhasher.hpp <- cppjiaba
Simhasher.hpp <- jenkins.h(產生哈希值的工具)
DuplicateRemoval.hpp <-Simhasher.hpp
最終咱們使用DuplicateRemoval就能夠完成網頁去重的工做。


三、FileHandle.hpp 對網頁進行格式化
將DuplicateRemoval處理的結果傳給FilaHandle.cpp的對象,就能夠獲得一個網頁庫文件和一個文件偏移文件。


四、BuildIndex  建字典(哈希加鏈表優化詞典)和倒排文件(……,<docid,TF,weight>,……)
使用Cppjieba,根據偏移文件讀取網頁庫,對每一篇網頁進行分詞,詞頻統計……。



2、服務端編程

1)接收客戶端請求的字符串str
2)使用cppjieba分詞庫對str進行分詞(使用full模式)
3)將分詞結果保存到一個數組中
4)對數組進行遍歷操做,根據倒排文件尋找對應的網頁,讀取出的網頁根據單詞的權重進行排序。
5)讀取網頁,並用XMLParser.hpp(已經封裝好)解析XML格式的文檔數組

6)用cppjson工具將解析結果封裝成json字符串返回客戶端。網絡



以上僅供參考,可能還會有優化的地方。項目的代碼還差一點完成,以後見github。工具


版權聲明:本文爲博主原創文章,未經博主容許不得轉載。優化

相關文章
相關標籤/搜索