『IR 信息檢索入門必看』課程項目-文學檢索-開發(fā)文檔

訪問博客查看 本文 最新內容初嘹,排版更美觀ヾ(?ω?`)o 如有錯誤歡迎指出~

IR 信息檢索系列筆記:

logo

Description:本文檔作為 2021 年夏季學期 IR 課程 Project 搜索引擎搭建的開發(fā)文檔及汉,檢索主題為「文學」。

Date:2021-08

Copyleft:? 2021 Hwcoder. All rights reserved.

系統(tǒng)說明

中國文學有數(shù)千年悠久歷史屯烦,以特殊的內容坷随、形式和風格構成了自己的特色房铭,有自己的審美理想,有自己的起支配作用的思想文化傳統(tǒng)和理論批判體系温眉,是世界文學寶庫中光彩奪目的瑰寶缸匪。

本搜索引擎主要收錄了與中國文學有關的網頁文檔,包括但不限于民族文學类溢、宗教文學凌蔬、語言文學、詩詞文學闯冷、中國外國文學等龟梦,爬取網站均來自中國社科院等官方機構。

系統(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

總體設計流程

  1. 安裝 Ubuntu 虛擬機,配置環(huán)境坷檩,安裝 Larbin 和 Xunsearch啦膜。
  2. 配置 Larbin 爬蟲選項,選定種子頁面淌喻,爬取文檔僧家。
  3. 利用 BeautifulSoup4 模塊編寫腳本 Parser.py 解析文檔,存儲為 csv 文件裸删。
  4. 生成 Xunsearch 配置文件八拱,構建索引,生成搜索框架涯塔。
  5. 部署至 Apache HTTP Server肌稻,前后端代碼再開發(fā),優(yōu)化搜索頁面匕荸。

各模塊設計細節(jié)

網絡爬蟲

網絡爬蟲模塊使用 Larbin2.6.5 進行網頁文檔的爬取爹谭。在按照配置進行爬取 30 分鐘后,最終獲得 10965 個文檔(約 409 MB)榛搔。由于爬蟲自身的限制诺凡,這些文檔均來自 http 站點。

以下是關鍵的配置項及說明:

  • 是否鎖定種子站點:践惑。取消鎖定才能根據(jù)鏈接爬取到更多內容腹泌。
  • 是否使用擴展鏈接:。大部分網頁為了提高排名尔觉,都會引入無關的友鏈凉袱,由于本項目是專題檢索,故關閉此功能避免進入其他域名。
  • 同一個服務器的兩次請求的間隔時間:無限制专甩。通持油遥基于禮貌原則,我們應該限制訪問頻率涤躲,但由于關閉了擴展鏈接棺耍,爬蟲只會在少數(shù)域名中爬取,如果限制了間隔時間會使得爬取效率極低篓叶。
  • 是否哈希頁面以去重:烈掠。由于站點固定,去重可以減少大量數(shù)據(jù)冗余缸托。

以下是種子網頁地址:

在終端運行爬蟲過程如下:

圖片請在 博客 中查看左敌。

打開 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)想:

圖片請在 博客 中查看典格。

部分功能

  1. 查詢聯(lián)想

圖片請在 博客 中查看岛宦。

  1. 拼音聯(lián)想

圖片請在 博客 中查看。

  1. 搜索糾錯

圖片請在 博客 中查看耍缴。

  1. 拼音糾錯

圖片請在 博客 中查看砾肺。

  1. 布爾檢索

圖片請在 博客 中查看。

插入否定連接詞后:

圖片請在 博客 中查看防嗡。

性能評估

下表隨機選取 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 等指標讶凉。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市窒升,隨后出現(xiàn)的幾起案子缀遍,更是在濱河造成了極大的恐慌慕匠,老刑警劉巖饱须,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異台谊,居然都是意外死亡蓉媳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門锅铅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酪呻,“玉大人,你說我怎么就攤上這事盐须⊥孳” “怎么了?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵贼邓,是天一觀的道長阶冈。 經常有香客問我,道長塑径,這世上最難降的妖魔是什么女坑? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮统舀,結果婚禮上匆骗,老公的妹妹穿的比我還像新娘。我一直安慰自己誉简,他們只是感情好碉就,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著闷串,像睡著了一般瓮钥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窿克,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天骏庸,我揣著相機與錄音,去河邊找鬼年叮。 笑死具被,一個胖子當著我的面吹牛,可吹牛的內容都是我干的只损。 我是一名探鬼主播一姿,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼七咧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了叮叹?” 一聲冷哼從身側響起艾栋,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛉顽,沒想到半個月后蝗砾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡携冤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年悼粮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片曾棕。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡扣猫,死狀恐怖,靈堂內的尸體忽然破棺而出翘地,到底是詐尸還是另有隱情申尤,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布衙耕,位于F島的核電站昧穿,受9級特大地震影響,放射性物質發(fā)生泄漏臭杰。R本人自食惡果不足惜粤咪,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渴杆。 院中可真熱鬧寥枝,春花似錦、人聲如沸磁奖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽比搭。三九已至冠跷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間身诺,已是汗流浹背蜜托。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留霉赡,地道東北人橄务。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像穴亏,于是被迫代替她去往敵國和親蜂挪。 傳聞我的和親對象是個殘疾皇子重挑,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內容