自己動手實現主題搜尋引擎
1.前言:
軟體設計要寫大作業了,好慌啊,寫什麼好呢,室友居然把Everything實驗了,那我也寫一個與搜尋有關的玩玩吧。突然想到大一時候自學過利用whoosh和solr寫過簡單的搜尋引擎,那麼今天就自己動手試一試吧。
2.簡介
本專案主要實現了一個主題搜尋引擎。主題搜尋引擎是針對某一個領域的專業搜尋引擎,是搜尋引擎的細分和延伸,是對網頁庫中的某類專門的資訊進行一次整合,定向分欄位抽取出需要的資料進行處理後再以某種形式返回給使用者。主題搜尋是相對通用搜尋引擎的資訊量大、查詢不準確、深度不夠等提出來的新的搜尋引擎服務模式,通過針對某一特定領域、某一特定人群或某一特定需求提供的有一定價值的資訊和相關服務。其特點就是“專、精、深”,且具有行業色彩,相比較通用搜尋引擎的海量資訊無序化,主題搜尋引擎則顯得更加專注、具體和深入。
3.系統分析
本系統主要包括主題領域資料庫的建立以及根據倒排索引和TF_IDF演算法得到使用者查詢結果兩大模組。
其中資料庫的建立是針對特定主題領域,設計啟發式爬蟲,利用網路爬蟲採集資料。本專案的啟發式爬蟲採用的是快速模擬退火演算法;使用者查詢部分用到了TF_IDF演算法以及字典樹等資料結構。整體系統設計圖如圖所示。
4.系統設計
4.1啟發式爬蟲
4.1.1主題爬蟲的體系結構
爬蟲體系結構如下圖所示:
4.1.2頁面主題相關性判斷
- 預處理階段:構建主題關鍵詞詞庫和停用詞詞庫,本專案採用的關鍵詞詞庫是從qq輸入法官方網站下載的與足球有關的關鍵詞詞庫,停用詞是從也是從網路資源中找的。
- 對提取的連結text和title進行分詞,去掉停用詞。
- 計算關鍵詞在詞庫中出現頻率以及分詞結果計算出每個URL的相關性得分。
- 根據得分值與閾值的比較結果,處理相應URL,大於閾值,放入URL佇列,小於閾值,丟棄。
注:計算的頁面相關性得分時用到字典樹結構,根據字典樹結構可以統計詞頻。
4.1.3搜尋策略的選擇
- 啟發式演算法簡介:
傳統的網路爬蟲在搜尋遍歷網頁的時候採用的是盲目無資訊的遍歷演算法,即對所獲得的連結進行遍歷(如廣度優先、深度優先搜尋等),抽取資訊存到資料庫供搜尋呼叫。但是會因為遍歷大量無關連結導致系統負擔過大,而採用啟發式爬蟲可以減少遍歷的連結數量,減少無關連結的訪問,從而提高系統效率。
常見的啟發式搜尋演算法有A*演算法、爬山法、模擬退火演算法。
A*演算法是一種基於有限空間的啟發式搜尋演算法,而網路空間是一個無限的狀態空間,因此不能直接用A*演算法搜尋網頁。
爬山法不會前瞻與當前狀態不直接相鄰的那些狀態的值,只是選擇鄰居狀態中最好的一個,而事先不考慮下一步走的方向,所以爬山法只能近似地反映資訊資源在未搜尋空間邊緣附近而不是其內部情況。
模擬退火演算法的核心在於搜尋最優解的過程中,除了可以接受有化解之外,還有一個隨機接受準則有限度的接受惡化解,並且接受惡化解概率幾乎為0,因此模擬退火演算法有可能從區域性最優解中跳出,找到全域性最優解。 - 模擬退火演算法分析
模擬退火演算法的思想來源於物理退火過程,最早針對組合優化問題提出。模擬退火演算法的執行策略如下步驟構成:從任意一個解開始探測整個空間,並且擾動該解產生一個新解,按照Metropolis準則判斷是否接受新解,相應下降控制溫度,模擬退火演算法流程圖如圖所示:
4.2搜尋部分
4.2.1建立倒排索引
- 單詞文件矩陣
單詞-文件矩陣是表達兩者之間所具有的一種包含關係的概念模型,x下圖展示了其含義。圖的每列代表一個文件,每行代表一個單詞,打對勾的位置代表包含關係。
從縱向即文件這個維度來看,每列代表文件包含了哪些單詞,比如文件1包含了詞彙1和詞彙4,而不包含其它單詞。從橫向即單詞這個維度來看,每行代表了哪些文件包含了某個單詞。比如對於詞彙1來說,文件1和文件4中出現過單詞1,而其它文件不包含詞彙1。
搜尋引擎的索引其實就是實現“單詞-文件矩陣”的具體資料結構,我們採用倒排索引的方式儲存單詞-文件對映關係。
2. 倒排索引
倒排索引是實現“單詞-文件矩陣”的一種具體儲存形式,通過倒排索引,可以根據單詞快速獲取包含這個單詞的文件列表。倒排索引主要由兩個部分組成:“單詞詞典”和“倒排檔案”。
3. 單詞詞典
搜尋引擎的通常索引單位是單詞,單詞詞典是由文件集合中出現過的所有單詞構成的字串集合,單詞詞典內每條索引項記載單詞本身的一些資訊以及指向“倒排列表”的指標。
4. 倒排列表
倒排列表記載了出現過某個單詞的所有文件的文件列表及單詞在該文件中出現的位置資訊,每條記錄稱為一個倒排項(Posting)。根據倒排列表,即可獲知哪些文件包含某個單詞。
5. 倒排檔案
所有單詞的倒排列表往往順序地儲存在磁碟的某個檔案裡,這個檔案即被稱之為倒排檔案,倒排檔案是儲存倒排索引的物理檔案,為本專案為了便於開發,將倒排檔案放入了記憶體。
上圖所示的單詞-文件矩陣轉化為倒排索引則如下圖所示:
建立對應文件集的倒排索引的演算法一般如下:對所有文件進行分詞,建立單詞詞典,對所有單詞建立倒排表。
4.2.2搜尋程式的設計
- 對使用者輸入進行分詞處理,去掉停用詞
- 到單詞詞典查詢分詞之後得到的每一個關鍵詞,得到相應的文章ID
- 利用TF_IDF演算法計算每個關鍵詞的得分
- 計算每份文件的得分,並排序,得到相應排名結果
5.系統實現及測試
5.1結果
結果如圖所示,其中Web site url 可以是任意的,是爬蟲的抓取站點:
5.2不足之處
- 根據資料庫建立的詞典檔案和倒排索引表沒有儲存到本地,而是每次執行重新建立,因此第一次查詢時間效率不夠高
- 退火演算法的引數設定測試不夠多,應該有更多的測試,得到更加理想的效果
- 領域詞庫不夠大,資料量偏少
- 沒有做去重處理
相關文章
- 實現一個自己的搜尋引擎的初始規劃
- 搜尋引擎面試題面試題
- 48_初識搜尋引擎_快速上機動手實戰Query DSL搜尋語法
- 搜尋引擎-03-搜尋引擎原理
- 50_初識搜尋引擎_上機動手實戰常用的各種query搜尋語法
- 51_初識搜尋引擎_上機動手實戰多搜尋條件組合查詢
- 【搜尋引擎】 PostgreSQL 10 實時全文檢索和分詞、相似搜尋、模糊匹配實現類似Google搜尋自動提示SQL分詞Go
- 三步搭建自己的Google搜尋引擎Go
- 直播開發app,實時搜尋、搜尋引擎框APP
- 海量資料搜尋---demo展示百度、谷歌搜尋引擎的實現谷歌
- 52_初識搜尋引擎_上機動手實戰如何定位不合法的搜尋以及其原因
- 蘋果或自己開發搜尋引擎:與谷歌拜拜?蘋果谷歌
- 雅虎釋出API,構建自己的搜尋引擎API
- 海量資料搜尋---搜尋引擎
- 搜尋引擎必看的入門書籍——《搜尋引擎:資訊檢索實踐》
- 自己動手實現OkHttpHTTP
- 一步步實現 Redis 搜尋引擎Redis
- Java實現利用搜尋引擎收集網址的程式Java
- 搜尋引擎:MapReduce實戰----倒排索引索引
- 相見恨晚!開源的傻瓜搜尋引擎,幫你快速實現搜尋功能
- 網站搜尋引擎優化問題網站優化
- 搜尋引擎es-分詞與搜尋分詞
- CSS 實現搜尋相關互動CSS
- 用Python實現一個大資料搜尋引擎Python大資料
- 基於 Mysql 實現一個簡易版搜尋引擎MySql
- 用 Python 實現一個大資料搜尋引擎Python大資料
- 搜尋引擎關鍵字智慧提示的一種實現
- ElasticSearch全文搜尋引擎Elasticsearch
- 搜尋引擎語法
- 搜尋引擎命令大全
- 搜尋引擎程式碼
- 【搜尋引擎】Solr Suggester 實現全文檢索功能-分詞和和自動提示Solr分詞
- 53_初識搜素引擎_上機動手實戰如何定製搜尋結果的排序規則排序
- 自己動手寫SQL執行引擎SQL
- 自己實現鬥地主引擎
- LG通訊攜手雅虎釋出手機搜尋引擎
- 搜尋引擎分散式系統思考實踐分散式
- 搜尋引擎優化(SEO)優化