訪問博客查看 本文 最新內容初嘹,排版更美觀ヾ(?ω?`)o 如有錯誤歡迎指出~
IR 信息檢索系列筆記:
Description
:本文檔作為 2021 年夏季學期 IR 課程 Project 搜索引擎搭建的開發(fā)文檔及汉,檢索主題為「文學」。
Date
:2021-08
Copyleft
:? 2021 Hwcoder. All rights reserved.
系統(tǒng)說明
中國文學有數(shù)千年悠久歷史屯烦,以特殊的內容坷随、形式和風格構成了自己的特色房铭,有自己的審美理想,有自己的起支配作用的思想文化傳統(tǒng)和理論批判體系温眉,是世界文學寶庫中光彩奪目的瑰寶缸匪。
本搜索引擎主要收錄了與中國文學有關的網頁文檔,包括但不限于民族文學类溢、宗教文學凌蔬、語言文學、詩詞文學闯冷、中國外國文學等龟梦,爬取網站均來自中國社科院等官方機構。
系統(tǒng)架構
本搜索引擎系統(tǒng)主要架構如上圖所示窃躲。
檢索的源文檔由網絡爬蟲從給定的種子頁面開始爬取计贰,爬取到本地后利用 Python 中的 BeautifulSoup4 模塊進行網頁的解析,并寫入文檔數(shù)據(jù)庫中蒂窒。 之后利用搜索引擎解決方案 Xunsearch(迅搜)構建搜索引擎躁倒,利用索引器 Indexer 對文檔數(shù)據(jù)進行索引,并構建基于 Xapian 的后端搜索服務器與前端的搜索應用洒琢,向用戶展示出搜索功能秧秉。
模塊介紹
網絡爬蟲:Larbin
Larbin 是一種開源的網絡爬蟲,用 C++ 語言實現(xiàn)衰抑。其設計簡單象迎,具有高度的可配置性,能夠配置抓取深度呛踊、間隔砾淌、并發(fā)度、代理谭网,并支持通過后綴名對抓取網頁進行過濾汪厨。Larbin 具有非常高的效率,可以輕易獲取單個網站的所有鏈接愉择,自動擴展 url 頁面并抓取與保存劫乱,從而為搜索引擎提供廣泛的數(shù)據(jù)來源。
然而锥涕,Larbin 只是一個爬蟲衷戈,只抓取網頁,并不負責網頁的解析层坠、數(shù)據(jù)庫的存儲以及索引的建立殖妇,也不支持分布式系統(tǒng)。另外窿春,Larbin 已經較長時間不再更新拉一,因而不支持 https 協(xié)議采盒,這在今天很大程度上造成了網頁頁面的局限性。
這里采用由國人在基于原版 Larbin2.6.3 版本上繼續(xù)開發(fā)并發(fā)布于 GitHub 的 Larbin2.6.5 版本進行搜索引擎系統(tǒng)的構建蔚润。
項目網址:https://github.com/ictxiangxin/larbin
網頁解析:BeautifulSoup4 (bs4)
BeautifulSoup4 是一個可以從 HTML 或 XML 文件中提取數(shù)據(jù)的 Python 庫磅氨。
由于 HTML 和 XML 文件本身是結構化的文本,有一定的規(guī)則嫡纠,通過它的結構可以簡化信息提取烦租。類似的網頁信息提取庫還有 Lxml 和 Pyquery 等,但是 bs4 相比其他的庫更加簡單易用除盏。
本項目就采用 BeautifulSoup4 快速對網頁文檔內容進行解析和格式化叉橱。
官方文檔:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
前端&搜索引擎:Xunsearch & Xapian
Xunsearch(迅搜)是一款以 GPL 協(xié)議開源發(fā)布的高性能、全功能的全文檢索解決方案者蠕,并針對中文深度優(yōu)化和處理窃祝,用于幫助開發(fā)者針對海量數(shù)據(jù)快速建立搜索引擎。
Xunsearch 采用結構化分層設計踱侣,包含后端服務器和前端開發(fā)包兩大部分粪小。后端是用 C/C++ 基于 Xapian 搜索庫、SCWS 中文分詞抡句、libevent 等開源庫開發(fā)探膊,借鑒了 nginx 的多進程多線程混合工作方式,是一個可承載高并發(fā)的高性能服務端待榔。前端則是使用流行的腳本語言編寫了開發(fā)工具包(SDK)逞壁。
本項目采用 Xunsearch 還考慮了以下特點:
- 具有為搜索而自主開發(fā) SCWS 中文分詞庫,支持復合分詞锐锣、自定義補充詞庫腌闯,保障查全率、準確率刺下。
- 索引接口齊全绑嘹,索引添加簡便,支持實時搜索橘茉,支持多種數(shù)據(jù)源(SQL、JSON姨丈、CSV 等)畅卓。
- 除通用搜索引擎功能外,還內置支持拼音檢索蟋恬、分面搜索翁潘、相關搜索、同義詞搜索歼争、搜索糾錯建議等專業(yè)功能拜马。
官方地址:http://www.xunsearch.com/
此外渗勘,Xunsearch 的高速響應能力還離不開 Xapian 這一搜索引擎庫。
Xapian 是一個允許開發(fā)人員輕易地添加高級索引和搜索功能到他們的應用系統(tǒng)的高度可修改的工具俩莽,它在支持概率論檢索模型的同時也支持布爾型操作查詢集旺坠。
Xapian 相比 Lucene 有更多的優(yōu)勢:基于 C++ 開發(fā)的強可移植性(可以運行在 Linux, MacOS, Windows 系統(tǒng)上),豐富的查詢機制(概率性搜索排名扮超、相關度反饋取刃、鄰近搜索、布爾搜索出刷、詞干提取璧疗、通配符查詢、別名查詢馁龟、拼寫糾正等)和較強的檢索性能崩侠。
設計文檔
運行環(huán)境
主機:
- 系統(tǒng):Windows 10
- 帶寬:40 Mbps
虛擬機:
- 軟件:Oracle VM VirtualBox 6.1.26
- 配置設置:
- 內存:2GB
- 磁盤:20GB
- 處理器:Intel(R) Core(TM) i5-9300H CPU @ 2.40GHz(核心數(shù):1)
- 系統(tǒng):Linux Ubuntu 20.04
- 依賴環(huán)境:
- Apache 2.4.41
- PHP 7.4.3
- Python 3.8.10
總體設計流程
- 安裝 Ubuntu 虛擬機,配置環(huán)境坷檩,安裝 Larbin 和 Xunsearch啦膜。
- 配置 Larbin 爬蟲選項,選定種子頁面淌喻,爬取文檔僧家。
- 利用 BeautifulSoup4 模塊編寫腳本 Parser.py 解析文檔,存儲為 csv 文件裸删。
- 生成 Xunsearch 配置文件八拱,構建索引,生成搜索框架涯塔。
- 部署至 Apache HTTP Server肌稻,前后端代碼再開發(fā),優(yōu)化搜索頁面匕荸。
各模塊設計細節(jié)
網絡爬蟲
網絡爬蟲模塊使用 Larbin2.6.5 進行網頁文檔的爬取爹谭。在按照配置進行爬取 30 分鐘后,最終獲得 10965 個文檔(約 409 MB)榛搔。由于爬蟲自身的限制诺凡,這些文檔均來自 http 站點。
以下是關鍵的配置項及說明:
- 是否鎖定種子站點:否践惑。取消鎖定才能根據(jù)鏈接爬取到更多內容腹泌。
- 是否使用擴展鏈接:否。大部分網頁為了提高排名尔觉,都會引入無關的友鏈凉袱,由于本項目是專題檢索,故關閉此功能避免進入其他域名。
- 同一個服務器的兩次請求的間隔時間:無限制专甩。通持油遥基于禮貌原則,我們應該限制訪問頻率涤躲,但由于關閉了擴展鏈接棺耍,爬蟲只會在少數(shù)域名中爬取,如果限制了間隔時間會使得爬取效率極低篓叶。
- 是否哈希頁面以去重:是烈掠。由于站點固定,去重可以減少大量數(shù)據(jù)冗余缸托。
以下是種子網頁地址:
- http://philosophychina.cssn.cn/ (中國哲學網-中國社科網子域名)
- http://literature.cssn.cn/ (中國文學網-中國社科網子域名)
- http://cel.cssn.cn/#story1 (中國民族文學網-中國社科網子域名)
- http://ling.cssn.cn/ (中國語言文學網-中國社科網子域名)
- http://iwr.cssn.cn/ (中國宗教文學網-中國社科網子域名)
- http://ifl.cssn.cn (中國外國文學網-中國社科網子域名)
- http://www.china-language.edu.cn/ (中國語言學網)
- http://www.huaxiawen.com/ (華夏古代文學網)
- http://www.zgwenxue.com/ (中國文學網)
- http://www.eduwx.com/ (教育文學網)
- http://www.wgwxzz.cn/ (外國文學網)
- http://www.zhexue.org/ (哲學網)
- http://www.52shici.cn/ (吾愛詩詞網)
在終端運行爬蟲過程如下:
圖片請在 博客 中查看左敌。
打開 localhost:8081 查看統(tǒng)計結果:
圖片請在 博客 中查看。
從統(tǒng)計結果可以看出俐镐,共收到 13783 個 URL矫限,訪問了 13783 個頁面,最終成功爬取 10965 個頁面佩抹。
圖片請在 博客 中查看叼风。
從上圖可以具體地得出爬蟲的爬取效率,可見爬蟲爬取的速度隨著時間的推移會發(fā)生較大的變化棍苹。
網頁解析
解析器模塊利用 Python 的 BeautifulSoup4 和 Pandas 模塊編寫无宿,前者可以對網頁文檔進行解析,后者便于將數(shù)據(jù)以 csv 文件形式保存枢里,便于后續(xù)搜索引擎使用孽鸡。
調用 BeautifulSoup4 的代碼如下:
with open(path + file, 'rb') as f:
soup = BeautifulSoup(f.read(), 'html.parser')
if soup.title == None or soup.title.string == None:
title.append('')
else:
title.append(soup.title.string.replace('\n', '').replace('\r', ''))
body.append(soup.get_text().replace('\n', '').replace('\r', ''))
調用 Pandas 的代碼如下:
data = {'id': id, 'title': title, 'body': body, 'urls': urls}
frame = pd.DataFrame(data)
if k == 0:
frame.to_csv('data_u.csv', encoding='utf-8-sig', index=False)
else:
frame.to_csv('data_u.csv', mode='a+', header=False, encoding='utf-8-sig', index=False)
處理結果如下:
圖片請在 博客 中查看。
可以看到每個文檔被分出 id, title, body, urls 四個字段栏豺,存儲在一個 csv 文件中彬碱。
前端&搜索引擎
搜索引擎模塊利用 Xunsearch 提供的開發(fā)工具即可實現(xiàn)。首先確定運行環(huán)境正常奥洼,然后編寫配置文件對格式化的 csv 文件建立索引巷疼,并生成搜索骨架代碼,即可實現(xiàn)基本檢索功能灵奖。
首先利用工具包中的 RequiredCheck 檢查當前環(huán)境是否滿足 Xunsearch 的運行條件:
圖片請在 博客 中查看嚼沿。
環(huán)境正常后,利用工具包中的配置文件生成工具 IniWizzard桑寨,在 Web 交互頁面中即可完成各個字段的設計:
圖片請在 博客 中查看伏尼。
其中,各個字段的含義如下:
- id 為主鍵尉尾,作為每個文檔的標識符。
- title 為文檔的標題燥透,賦予較高權重沙咏。
- body 為文檔的內容辨图,截取 300 個字符作為搜索結果的摘要顯示。
- urls 作為每個文檔在展示時的附屬信息肢藐,不需要進行索引故河。
此后,就可以用工具包中的索引管理器 Indexer 批量建立索引:
圖片請在 博客 中查看吆豹。
在 db 文件夾下鱼的,可以看到建立的索引文件:
圖片請在 博客 中查看。
此時痘煤,可以用工具包中配備的測試工具 Quest凑阶,在當前索引中進行測試搜索,測試給定查詢詞的返回的數(shù)據(jù)衷快。
圖片請在 博客 中查看宙橱。
可以看到搜索功能已經可以使用了,這時需要用到工具包中的骨架代碼生成工具 SearchSkel蘸拔,生成前端代碼师郑。
圖片請在 博客 中查看。
最后调窍,運行 Apache2.0宝冕,將生成的 search 目錄放到 /var/www/html 中,即可在本地服務器 localhost 訪問搜索頁面邓萨,實現(xiàn)搜索引擎的功能地梨。
圖片請在 博客 中查看。
點擊文檔標題先誉,會返回對應的文檔主鍵(id):
圖片請在 博客 中查看湿刽。
頁面再開發(fā)
可以看到,直接生成的框架文件有如下的不足:
- 前端較為簡陋褐耳,重點不夠突出诈闺。
- 由于使用了國外的 cdn,訪問速度較慢铃芦。
- 搜索結果點擊后無法直接跳轉至頁面雅镊。
開發(fā) style.css 和 search.tpl 文件后,可以得到新的頁面:
圖片請在 博客 中查看刃滓。
頁面展示
網站部署到 web 可訪問目錄后仁烹,可以通過虛擬機的端口轉發(fā)設置,實現(xiàn)在主機上訪問咧虎,也可以購買 HTTP 映射服務后在給定域名訪問卓缰。這里選擇最簡單的在虛擬機中訪問。
首頁
使用搜索前:
圖片請在 博客 中查看。
使用搜索后:
圖片請在 博客 中查看征唬。
在使用了搜索功能后捌显,搜索引擎將分析搜索日志,從而提供熱門搜索詞总寒。 此外扶歪,可以看到搜索時可以選擇多種方式,頁腳有標明版權摄闸、處理時間以及作者的信息善镰。
搜索頁面
點擊搜索后,會反饋查詢結果的標題年枕、文檔摘要以及文檔對應的原網址炫欺,并進行對查詢詞進行高亮表示(標題中紅字、摘要中加粗)画切,并會返回檢索條目竣稽、檢索時間、檢索相似度等信息霍弹。
特別地毫别,在頁腳還提供了相關的搜索內容的聯(lián)想,下圖是在搜索「散文」后的聯(lián)想:
圖片請在 博客 中查看典格。
部分功能
- 查詢聯(lián)想
圖片請在 博客 中查看岛宦。
- 拼音聯(lián)想
圖片請在 博客 中查看。
- 搜索糾錯
圖片請在 博客 中查看耍缴。
- 拼音糾錯
圖片請在 博客 中查看砾肺。
- 布爾檢索
圖片請在 博客 中查看。
插入否定連接詞后:
圖片請在 博客 中查看防嗡。
性能評估
下表隨機選取 10 個與本搜索引擎相關的查詢詞進行檢索变汪,評估搜索引擎的 Top5 查準率(precision@5)與平均響應時間(mean responding time)。
查詢 | 查準率@5 | 響應時間/s | 匹配文檔總數(shù) |
---|---|---|---|
校園文學 | 4 | 0.0219 | 2000 |
宗教文學 | 5 | 0.0186 | 1000 |
漢語 | 5 | 0.0210 | 990 |
藏語 | 3 | 0.0229 | 68 |
季羨林 | 1 | 0.0173 | 50 |
魯迅 | 4 | 0.0188 | 501 |
毛澤東詩詞 | 5 | 0.0221 | 300 |
馬克思主義哲學中國化 | 5 | 0.0356 | 100 |
散文作品 | 4 | 0.0128 | 800 |
小說集 | 3 | 0.0225 | 120 |
計算得:平均查準率為 3.9蚁趁,平均響應時間為 0.02135s裙盾。
從結果上看,該搜索引擎在對應領域有著良好的表現(xiàn)他嫡,且響應迅速番官,但是對著名人物作品的查詢則稍顯不足。
此外钢属,在部分檢索結果中徘熔,有些無關文檔由于重復出現(xiàn)了查詢詞而被賦予較高的「相似度」,但實際上 Top 10 返回結果的「相似度」都很高淆党,可以考慮用 PageRank 等算法優(yōu)化網站排名酷师,提高 MRR 等指標讶凉。