方錦文,童樺茜
(1.桂林電子科技大學(xué)信息科技學(xué)院,廣西桂林,541004;2.廣西城市建設(shè)學(xué)校,廣西桂林,541003)
搜索引擎是一種專(zhuān)門(mén)在網(wǎng)絡(luò)上提供查詢服務(wù)的系統(tǒng),它把分布在網(wǎng)絡(luò)上的信息資源進(jìn)行收集、處理,然后經(jīng)過(guò)整理后方便人們查詢。目前像百度和Google這樣的大型搜索引擎能為用戶提供海量的信息查詢服務(wù),其查詢范圍遍布各行各業(yè),基本可以滿足各個(gè)領(lǐng)域的信息橫向搜索。也正是因?yàn)檫@類(lèi)通用搜索引擎所覆蓋領(lǐng)域廣闊,所以很難在搜索的同時(shí)兼顧到搜索的精準(zhǔn)度。其價(jià)值在于對(duì)大量的分散信息做信息導(dǎo)航,對(duì)于信息量相對(duì)集中、分類(lèi)類(lèi)別更詳細(xì)的某一特定領(lǐng)域的信息檢索就會(huì)表現(xiàn)出其縱向搜索的局限性。
垂直搜索引擎的出現(xiàn)正是為了解決通用搜索引擎在特定領(lǐng)域下的搜索精度不高、主題偏移、搜索深度不夠等問(wèn)題。垂直搜索引擎專(zhuān)注于某一類(lèi)信息、專(zhuān)業(yè)領(lǐng)域、特定主題下的信息檢索,其追求的是專(zhuān)業(yè)性和檢索服務(wù)深度。對(duì)于大學(xué)招生信息主題的搜索引擎,則專(zhuān)注于提供各個(gè)學(xué)校招生信息、學(xué)校信息、招生專(zhuān)業(yè)等信息的檢索服務(wù)。
系統(tǒng)主要由信息采集、信息預(yù)處理、信息檢索三部分組成。在信息采集部分,主要通過(guò)網(wǎng)絡(luò)爬蟲(chóng)抓取因特網(wǎng)上的網(wǎng)頁(yè)數(shù)據(jù)的方式,用構(gòu)建招生信息主題詞庫(kù)的過(guò)濾器過(guò)濾掉與招生信息不相關(guān)的網(wǎng)頁(yè)鏈接,然后把與招生信息相關(guān)的網(wǎng)頁(yè)信息存放到網(wǎng)頁(yè)庫(kù)中。在信息預(yù)處理部分通過(guò)索引器對(duì)對(duì)采集到的網(wǎng)頁(yè)庫(kù)建立索引方便系統(tǒng)查詢。信息檢索部分主要負(fù)責(zé)與用戶的直接對(duì)接,如圖1所示。
圖1 主題搜索引擎總體框架
用戶通過(guò)Web服務(wù)器界面接入系統(tǒng),輸入要查詢的內(nèi)容,檢索器與索引庫(kù)對(duì)接,在索引庫(kù)中搜索信息,用排序器對(duì)搜索結(jié)果進(jìn)行排序處理后返回給用戶。
Scrapy是基于 Python 實(shí)現(xiàn)的爬蟲(chóng)框架,其架構(gòu)清晰,模塊耦合度低[1]。可以應(yīng)用在包括數(shù)據(jù)挖掘,信息處理或存儲(chǔ)歷史數(shù)據(jù)等一系列的程序中,簡(jiǎn)單來(lái)說(shuō),Scrapy是一個(gè)可以爬取網(wǎng)站的數(shù)據(jù),提取數(shù)據(jù)的框架。
Scrapy 框架組件及其中間件的功能如下[2]:
(1)Scrapy Engine(引擎):串聯(lián)框架各個(gè)模塊,觸發(fā)事務(wù)處理流程,控制數(shù)據(jù)流在系統(tǒng)中所有組件中流動(dòng)。
(2)Scheduler(調(diào)度器):負(fù)責(zé)管理待抓取 URL 隊(duì)列。接受請(qǐng)求后返回下一個(gè)要爬取的鏈接。
(3)Downloader(下載器):向網(wǎng)站服務(wù)器發(fā)送訪問(wèn)頁(yè)面請(qǐng)求,獲取頁(yè)面數(shù)據(jù)并提供給引擎。
(4)Spiders(爬蟲(chóng)):爬取指定網(wǎng)站的數(shù)據(jù)內(nèi)容,管理爬取規(guī)則和網(wǎng)頁(yè)解析規(guī)則等。
(5)Item Pipeline(項(xiàng)目管道):處理被spider提取出來(lái)的item,包括數(shù)據(jù)清洗、驗(yàn)證及持久化(例如存取到數(shù)據(jù)庫(kù)中)等。
(6)Middlewares(中間件):包括下載器中間件(Downloader middlewares)和Spider中間件(Spider middlewares),處理引擎與下載器、爬蟲(chóng)之間的請(qǐng)求及響應(yīng),其提供了一個(gè)簡(jiǎn)便的機(jī)制,通過(guò)插入自定義代碼來(lái)擴(kuò)展Scrapy功能。
Scrapy框架安裝完成后,便可創(chuàng)建自己的爬蟲(chóng)項(xiàng)目,Scrapy爬蟲(chóng)項(xiàng)目結(jié)構(gòu)如圖2所示。
圖2 項(xiàng)目文件結(jié)構(gòu)
各文件功能如下[3]:
(1)scrapy.cfg: 項(xiàng)目運(yùn)行的參數(shù)設(shè)定。
(2)middlewares.py:爬蟲(chóng)程序中間件。
(3)items.py: 項(xiàng)目中的item文件,管理待抓取的一些信息。
(4)pipelines.py: 項(xiàng)目中的pipelines文件,對(duì)爬取的數(shù)據(jù)進(jìn)行清洗。
(5)settings.py: 項(xiàng)目的設(shè)置文件。
(6)spiders: 放置spider代碼的目錄。
為使抓取的網(wǎng)頁(yè)與高校信息主題相關(guān)度更高,本文采用知名度較高的高校招生網(wǎng)作為初始目標(biāo)網(wǎng)站爬取數(shù)據(jù)。通過(guò)觀察目標(biāo)網(wǎng)頁(yè),在高校信息詳情頁(yè)部分,可以找到高校名字、類(lèi)型、聯(lián)系電話、地址、簡(jiǎn)介、招生計(jì)劃等信息,均包含在屬性值為class的li標(biāo)簽中。可以先獲取一級(jí)頁(yè)面的列表頁(yè)信息,在根據(jù)列表頁(yè)中的詳情頁(yè)URL來(lái)獲取詳情頁(yè)的數(shù)據(jù)。
先在項(xiàng)目的全局性配置文件setting.py中,配置好項(xiàng)目的名稱(chēng)、下載延遲、Scrapy執(zhí)行的最大并發(fā)請(qǐng)求數(shù)等信息[4]。然后在數(shù)據(jù)模塊items.py文件中設(shè)置好要爬取的高校信息字段,然后通過(guò)scripy對(duì)目標(biāo)網(wǎng)頁(yè)的高校信息頁(yè)面進(jìn)行一級(jí)頁(yè)面的連接爬取和二級(jí)頁(yè)面的詳細(xì)內(nèi)容。在scripy文件中,通過(guò)start_urls = []設(shè)置初始目標(biāo)網(wǎng)站,通過(guò)allowed_domains = []設(shè)置允許爬取的范圍,在def parse()通過(guò)Xpath獲取到爬取的一級(jí)頁(yè)面的列表
在數(shù)據(jù)處理模塊pipelines.py中定義對(duì)爬蟲(chóng)爬取下來(lái)的數(shù)據(jù)進(jìn)行過(guò)濾處理。對(duì)爬取到的信息中含有非法字符的數(shù)據(jù)進(jìn)行清洗和過(guò)濾,在實(shí)際操作過(guò)程中,遇到了一些亂碼的文字,設(shè)置過(guò)濾條件即可過(guò)濾全部數(shù)據(jù)噪聲。過(guò)濾后的數(shù)據(jù),就可以存放到數(shù)據(jù)庫(kù)中了,本文將爬取的數(shù)據(jù)利用pymysql存儲(chǔ)到MySQL數(shù)據(jù)庫(kù)中。如圖3所示。
圖3 數(shù)據(jù)庫(kù)表中的爬取數(shù)據(jù)
用戶實(shí)際進(jìn)行查詢操作時(shí),對(duì)自己信息需求的描述方式,可能會(huì)與本來(lái)想要表達(dá)的意思有一定的出入,這樣系統(tǒng)在按用戶輸入的描述進(jìn)行檢索的過(guò)程中,檢索結(jié)果中也許會(huì)出現(xiàn)很多用戶并不關(guān)心的信息,而用戶本來(lái)比較感興趣的一部分信息卻被忽視掉。為了讓這些沒(méi)有被描述過(guò)的信息在檢索結(jié)果中的重要性提升,就需要一個(gè)反饋的機(jī)制。
一個(gè)理想的檢索結(jié)果應(yīng)該是用戶感興趣的內(nèi)容最多,而用戶不感興趣的內(nèi)容最少。但是這樣的理想情況是不可能一次實(shí)現(xiàn)的,要想得到讓用戶滿意的檢索結(jié)果,必須通過(guò)若干次的反饋過(guò)程。
Rocchio算法提供了一種將相關(guān)反饋信息融入到向量空間模型的方法,是實(shí)現(xiàn)相關(guān)反饋的一個(gè)經(jīng)典算法[5]。它的基本思想是將用戶需求表示為一個(gè)向量,根據(jù)用戶的反饋情況來(lái)動(dòng)態(tài)調(diào)整向量中每一維的關(guān)鍵詞的權(quán)重來(lái)使得向量更接近用戶想要的理想查詢。
D是文檔集合,包括所有相關(guān)和不相關(guān)的文檔。我們想要的,是找到一個(gè)最優(yōu)的查詢向量q,使得q與相關(guān)文檔的相似度最大并且與不相關(guān)的文檔的相似度最小,如下:
Rocchio經(jīng)過(guò)推導(dǎo)計(jì)算可以得到一種常見(jiàn)修正形式如下:
公式(2)中引入了可變參數(shù)α、β、γ,來(lái)調(diào)控修改結(jié)果和原始向量之間的平衡,讓公式更具有普遍適用性。在實(shí)際使用中,正反饋往往比負(fù)反饋更重要,因此在很多系統(tǒng)中會(huì)把參數(shù)設(shè)置成β>γ,甚至很多系統(tǒng)都只允許進(jìn)行正的反饋,即γ=0。一種在性能上比較穩(wěn)定的方法是只對(duì)檢索結(jié)果中排名最高的不相關(guān)文檔進(jìn)行負(fù)反饋,如下:
Rocchio算法要求用戶對(duì)檢索結(jié)果進(jìn)行相關(guān)性評(píng)價(jià),我們可以詢問(wèn)用戶檢索結(jié)果是否相關(guān),讓系統(tǒng)進(jìn)行自動(dòng)修正,但是更多情況下,用戶并不會(huì)耐心閱讀檢索出來(lái)的所有文檔,也不一定會(huì)對(duì)文檔進(jìn)行直接的相關(guān)性評(píng)價(jià)。不過(guò)我們可以通過(guò)分析用戶閱讀文檔時(shí)的一些操作,間接得到用戶對(duì)文檔的評(píng)價(jià),如:
(1)若用戶反復(fù)閱讀某一個(gè)文檔,即文檔的被點(diǎn)擊次數(shù)較多,則用戶對(duì)這個(gè)文檔感興趣。
(2)若用戶下載某個(gè)文檔,說(shuō)明用戶對(duì)這個(gè)文檔感興趣。
(3)若用戶長(zhǎng)時(shí)間閱讀某個(gè)文檔,則認(rèn)為用戶對(duì)這個(gè)文檔感興趣。
(4)對(duì)于用戶沒(méi)有點(diǎn)擊訪問(wèn)的文檔,則認(rèn)為用戶對(duì)這個(gè)文檔不感興趣。
(5)對(duì)于用戶點(diǎn)擊進(jìn)入后很快離開(kāi)的頁(yè)面,則認(rèn)為用戶對(duì)這個(gè)文檔不感興趣。
本文將高校名字、地址、類(lèi)型、招生批次等數(shù)據(jù)作為Rocchio算法中的向量,然后根據(jù)用戶的時(shí)間使用情況動(dòng)態(tài)調(diào)整。用戶相關(guān)性向量模型不必根據(jù)用戶每次的閱讀行為進(jìn)行調(diào)整,我們可以搜集一段時(shí)間內(nèi)的反饋信息后再進(jìn)行調(diào)整。這樣可以減輕系統(tǒng)壓力,也可以避免用戶行為的偶然性的反饋影響。
本文基于Scrapy框架設(shè)計(jì)了一個(gè)高校招生信息主題的垂直搜索引擎。利用 Scrapy 爬蟲(chóng)框架以及Pythn語(yǔ)言擴(kuò)展庫(kù)實(shí)現(xiàn)了網(wǎng)頁(yè)數(shù)據(jù)的爬取,針對(duì)用戶輸入查詢?cè)~不明確的情況,本文還對(duì)基于Rocchio算法的反饋模型進(jìn)行了研究,為用戶提供更精確的搜索體驗(yàn)。系統(tǒng)同時(shí)也有一些有待改進(jìn)的地方,比如數(shù)據(jù)分類(lèi)存儲(chǔ)優(yōu)化,Rocchio算法參數(shù)的優(yōu)化等,這些都是需要進(jìn)一步進(jìn)行研究的內(nèi)容。