徐春鳳,王艷春,葉青
(長(zhǎng)春理工大學(xué) 計(jì)算機(jī)科學(xué)技術(shù)學(xué)院,長(zhǎng)春 130022)
隨著計(jì)算機(jī)技術(shù)的發(fā)展以及社會(huì)信息化程度大大提高,信息化建設(shè)方面有了比較深入的發(fā)展,抽取出對(duì)其有價(jià)值的、潛在的信息,使之能有效地被應(yīng)用在管理和決策中給予了越來(lái)越多的關(guān)注。信息檢索技術(shù)幫助用戶從海量的信息中提取出他們所需要的有用信息,節(jié)省了用戶的時(shí)間,提高了用戶的工作效率。搜索引擎正是這些技術(shù)的基礎(chǔ)和平臺(tái),它決定著這些技術(shù)的開(kāi)發(fā)和應(yīng)用。
本文是基于對(duì)全文搜索引擎模型的基本原理、核心技術(shù)和流程的研究,應(yīng)用Apache軟件基金會(huì)提供的全文檢索引擎工具包Lucene,建立一個(gè)能對(duì)常見(jiàn)文檔進(jìn)行全文檢索的電子文檔全文檢索系統(tǒng),并在此系統(tǒng)的基礎(chǔ)上研究如何提高全文搜索引擎的精度、性能和用戶體驗(yàn),尤其是對(duì)中文分詞等方面進(jìn)行深入的研究并做適當(dāng)?shù)母倪M(jìn)。
通常將全文搜索引擎模型分成兩大功能模塊:索引處理(Indexing Process)和查詢處理(Query Process)。索引處理的主要任務(wù)是針對(duì)指定資源,如互聯(lián)網(wǎng)上的網(wǎng)頁(yè)或其他類型的文檔,根據(jù)這些資源的具體內(nèi)容建立一個(gè)可進(jìn)行后期查詢的數(shù)據(jù)庫(kù)。這個(gè)庫(kù)并不是我們通常所說(shuō)的能用結(jié)構(gòu)化查詢語(yǔ)言(SQL)進(jìn)行查詢的數(shù)據(jù)庫(kù),這種數(shù)據(jù)庫(kù)就是索引庫(kù),尤其是指倒排索引庫(kù)。而查詢處理則是在建立好索引庫(kù)的前提下,根據(jù)用戶的查詢條件進(jìn)行檢索并生成一個(gè)具有優(yōu)先級(jí)的文檔列表以合理的布局顯示給用戶。
索引處理的核心主要包括文本采集、文本轉(zhuǎn)換和索引創(chuàng)建等模塊。文本采集負(fù)責(zé)從指定位置如互聯(lián)網(wǎng)中發(fā)現(xiàn)并獲取可進(jìn)行索引處理的資源,如網(wǎng)頁(yè)、電子郵件、新聞等文檔,這部分功能通常由爬網(wǎng)程序完成。之后將結(jié)果交由文本轉(zhuǎn)換器處理。文本轉(zhuǎn)換模塊負(fù)責(zé)從原始文件中提取有用的純文本內(nèi)容,進(jìn)行內(nèi)容的分詞并過(guò)濾掉常見(jiàn)的無(wú)意義的停用詞,有必要時(shí)還要進(jìn)行詞干提取,并最終返回字符串流(Token Stream)。最后由索引創(chuàng)建模塊負(fù)責(zé)對(duì)返回的字符串流中的每一個(gè)字符串進(jìn)行倒排處理后添加到索引庫(kù)中,此外還包括文檔的統(tǒng)計(jì)、權(quán)值計(jì)算、索引優(yōu)化等。有的時(shí)侯,需要將被抓回的文檔存儲(chǔ)到本地,那么這時(shí)候就需要?jiǎng)?chuàng)建一個(gè)文檔數(shù)據(jù)庫(kù)將這些文檔存儲(chǔ)起來(lái)。索引處理的流程如圖1所示。
圖1 全文搜索引擎的索引處理流程Fig.1 The process of full-text search
從圖2不難看出,查詢處理涉及用戶交互、索引查詢和結(jié)果排序等模塊。首先用戶通過(guò)用戶交互模塊提交查詢關(guān)鍵字,檢索查詢模塊根據(jù)關(guān)鍵字建立查詢語(yǔ)句,然后利用該查詢語(yǔ)句到索引庫(kù)中查詢并返回相關(guān)的文檔記錄,在進(jìn)行文檔相關(guān)度排序后又通過(guò)用戶交互將結(jié)果顯示給用戶。整體查詢類似于數(shù)據(jù)庫(kù)的查詢。此外,還可以增加一些系統(tǒng)評(píng)價(jià)功能以幫助進(jìn)一步優(yōu)化系統(tǒng)。
圖2 全文搜索引擎的查詢處理流程Fig.2 The query flow of full-text search
經(jīng)過(guò)這十幾年的發(fā)展,中文分詞算法越來(lái)越多,而且分詞的效果也在不斷改善。一般情況下,將現(xiàn)有的分詞算法分為主要的三大類,即基于字符串匹配、基于理解和基于統(tǒng)計(jì)的分詞方法[8]。
(1)基于字符串匹配的分詞方法
現(xiàn)在較為常用的幾種基于字符串匹配的方法主要有正向最大匹配法(MM)、逆向最大匹配法(RMM)和雙向最大匹配法(DMM)。
基于字符串匹配的分詞方法相對(duì)簡(jiǎn)單,易于實(shí)現(xiàn);但匹配速度比較慢,并且存在交集型和組合型歧義切分問(wèn)題,沒(méi)有統(tǒng)一標(biāo)準(zhǔn)的詞集,缺乏智能學(xué)習(xí)的特性。
(2)基于理解的分詞方法
基于理解的分詞方法模擬人在理解句子的基礎(chǔ)上進(jìn)行分詞。這種方法在分詞的同時(shí)還進(jìn)行句法、語(yǔ)義分析,并利用句法信息和語(yǔ)義信息來(lái)處理歧義現(xiàn)象。常用的基于理解的分詞方法有專家系統(tǒng)方法和神經(jīng)元網(wǎng)絡(luò)方法[10]。
(3)基于統(tǒng)計(jì)的分詞方法
從形式上看,詞是穩(wěn)定的字的組合,因此在上下文中,相鄰的字同時(shí)出現(xiàn)的次數(shù)越多,就越有可能構(gòu)成一個(gè)詞。因此字與字相鄰共現(xiàn)的頻率或概率能夠較好的反映成詞的可信度??梢詫?duì)語(yǔ)料中相鄰共現(xiàn)的各個(gè)字的組合的頻度進(jìn)行統(tǒng)計(jì),計(jì)算它們的互現(xiàn)信息。但這種方法也有一定的局限性,會(huì)經(jīng)常抽出一些共現(xiàn)頻度高、但并不是詞的常用字組,例如“這一”、“之一”、“有的”、“我的”、“許多的”等,并且對(duì)常用詞的識(shí)別精度差,時(shí)空開(kāi)銷大。
在中文分詞基本算法中,基于字符串匹配的分詞算法是最簡(jiǎn)單的。通常情況下,基于字符串匹配可以最大化匹配,也可以最小化匹配。但最小化匹配可能識(shí)別不了一些常見(jiàn)的如“馬到成功”、“懸崖勒馬”之類的成語(yǔ),導(dǎo)致在檢索的時(shí)候準(zhǔn)確率會(huì)有所下降。本小節(jié)將實(shí)現(xiàn)基于正向最大匹配和基于逆向最大匹配的分詞算法。
正向最大匹配法的基本思想如下:
假設(shè)詞典中最長(zhǎng)詞條長(zhǎng)度為N,則首先取出被處理漢字序列中的前N個(gè)作為一個(gè)單位,到詞典中查找是否存在與之相等的詞條。
若存在則匹配成功,并將這個(gè)單位從原漢字序列中切分出去;否則去掉這個(gè)單位的最后一個(gè)字,剩下的部分作為一個(gè)新的單位重新進(jìn)行詞典查找,直到匹配成功或者是只剩下一個(gè)漢字。如此進(jìn)行下去,直到整個(gè)漢字序列全部匹配完成。算法流程如圖3所示。
逆向最大匹配法的基本思想與之類似,只是每次都是從漢字序列的末尾取詞,每次刪詞時(shí)都是去除單位最前面一個(gè)漢字。
圖3 正向最大匹配法流程圖Fig.3 The flow of positive matching method
傳統(tǒng)的文件查找一般只對(duì)文件名進(jìn)行匹配查詢,而文件名對(duì)文件內(nèi)容的概括能力是有限的,而且查找返回的文件列表之間缺乏優(yōu)先級(jí)。尤其是在互聯(lián)網(wǎng)的時(shí)代,文檔的共享變得越來(lái)越受歡迎,這一點(diǎn)顯得更加重要。如百度文庫(kù)、新浪愛(ài)問(wèn)等就是利用全文檢索技術(shù)開(kāi)發(fā)的應(yīng)用。本章將講述建立一個(gè)自己的全文文檔檢索系統(tǒng)。整個(gè)系統(tǒng)由文本提取、中文分詞器、索引器、查詢器、用戶界面和文件下載6大模塊組成。其中中文分詞器、索引器、查詢器是系統(tǒng)的核心部分。文檔排序功能由查詢器完成。各個(gè)模塊之間的工作流程如圖4所示。
圖4 各模塊之間工作流程Fig.4 The flow of each module
為了實(shí)現(xiàn)對(duì)常見(jiàn)文件文本內(nèi)容的提取,在文本提取模塊中設(shè)計(jì)了幾個(gè)獨(dú)立的類負(fù)責(zé)對(duì)相應(yīng)類型文件的內(nèi)容提取,依次是PDF類、Word類、PPT類、XLS類和TXT類。在每一個(gè)類中,都有一個(gè)構(gòu)造函數(shù)和一個(gè)文本提取方法。前者負(fù)責(zé)構(gòu)造一個(gè)文件實(shí)例,后者完成文本的真正提取。
在Lucene內(nèi)部提供了幾個(gè)分詞工具,如按字符間空格進(jìn)行分詞的WhitespaceAnalyzer、進(jìn)行簡(jiǎn)單分詞的SimpleAnalyzer、按停用詞進(jìn)行劃分的StopA-nalyzer和更智能的StandardAnalyzer等分析器。但這些分析器中除了StandardAnalyzer提供了部分中文分詞功能外,其他幾個(gè)版本基本是針對(duì)西方文字而開(kāi)發(fā)的。
常用的應(yīng)用于Lucene的中文分詞器有IK分詞器、庖丁解牛分詞器和CJK分詞器。CJK分詞器是Apache下一個(gè)基于java語(yǔ)言的開(kāi)源子項(xiàng)目,針對(duì)中日韓語(yǔ)系的分詞工具包。該工具包提供了三種分詞方法,ChineseAnalyzer、CJKAnalyzer和 SmartChineseAnalyzer。ChineseAnalyzer采用一元分詞法,即一個(gè)漢字分為一個(gè)詞。CJKAnalyzer則采用二元分詞法,將任意相鄰的兩個(gè)漢字識(shí)別為一個(gè)詞。而正如其名,SmartChineseAnalyzer采用了更智能的方法實(shí)現(xiàn)分詞,效果更佳。CJK分詞效果如圖5所示。
圖5 CJK分詞效果Fig.5 The effect of cjk segmentation
鑒于SmartChineseAnalyzer的分詞效果比較理想,而且其本身在Lucene工具包下的lucene-smartcn-3.1.0.jar中已經(jīng)實(shí)現(xiàn),本系統(tǒng)就直接利用該分詞器進(jìn)行文本的分詞。
實(shí)現(xiàn)了文本提取和中文分詞器,便可以進(jìn)入另一個(gè)核心模塊,即索引器模塊。在使用Lucene所提供的類庫(kù)和API中,在建立索引庫(kù)時(shí):首先至少創(chuàng)建一個(gè)文件對(duì)象File用于指定索引庫(kù)的存儲(chǔ)位置,接著根據(jù)這個(gè)File對(duì)象和所要使用的分詞器創(chuàng)建一個(gè)寫索引對(duì)象IndexWriter,依次針對(duì)每個(gè)文件創(chuàng)建一個(gè)文檔對(duì)象Document,并為每個(gè)文檔創(chuàng)建至少一個(gè)域?qū)ο驠ield,將這些Field依次添加到Document中,將這些Document添加到IndexWriter中,最后優(yōu)化索引并關(guān)閉IndexWriter。在此應(yīng)用中,Indexer類對(duì)指定文件夾下的所有文件進(jìn)行索引,整個(gè)算法流程如圖6所示。
圖6 索引處理流程圖Fig.6 The flow of index process
用戶界面主要的工作是獲取查詢條件和檢索結(jié)果顯示,實(shí)現(xiàn)查詢的關(guān)鍵還是在索引器的實(shí)現(xiàn)。在本系統(tǒng)中,將查詢器封裝成Searcher類。關(guān)鍵字的查詢主要涉及到Directory、Analyzer、IndexSearcher、Query和TopDocs類。為了創(chuàng)建查索引器Index-Searcher對(duì)象,首先得創(chuàng)建索引庫(kù)所在的目錄Directory和處理查詢關(guān)鍵字的索引器Analyzer,在生成好Lucene內(nèi)部查詢語(yǔ)句Query后就可以對(duì)索引庫(kù)進(jìn)行檢索。檢索結(jié)果最終存儲(chǔ)在TopDocs對(duì)象中以便后續(xù)處理使用。整個(gè)流程如圖7所示。
獲取查詢結(jié)果TopDocs后,就可進(jìn)行后續(xù)處理,如文檔過(guò)濾和文檔排序等操作,并將最終結(jié)果傳給用戶界面進(jìn)行顯示。
本文介紹了中文分詞的一些基本算法,并對(duì)中文分詞的基于字符串匹配的算法進(jìn)行實(shí)現(xiàn),及如何利用Lucene建立全文文檔檢索系統(tǒng)和系統(tǒng)優(yōu)化。在此實(shí)現(xiàn)了中文分詞以及索引的建立,并且可以根據(jù)用戶提供的關(guān)鍵字進(jìn)行查詢,將最終結(jié)果在用戶界面上顯示。雖然本系統(tǒng)取得了一定的進(jìn)展,但還有一些問(wèn)題有待進(jìn)一步的研究,例如還需對(duì)文檔相關(guān)度排序算法的學(xué)習(xí),基于Lucene的全文文檔檢索系統(tǒng)功能上有待完善。
圖7 查詢處理流程圖Fig.7 The flow of query process
[1]桌面搜索引擎[EB/OL].http://baike.baidu.com/view/678550.htm.
[2]搜索引擎[EB/OL].http://baike.baidu.com/view/1154.htm.
[3]謝希仁.計(jì)算機(jī)網(wǎng)絡(luò)[M].北京:電子工業(yè)出版社,2009.
[4]吳眾欣,沈家立.Lucene分析與應(yīng)用[M].北京:機(jī)械工業(yè)出版社,2008.
[5]W.BRUCE CROFT,DONALD METZLER,TREVVOR STROHMAN[M].Search Engines Information Retrieval in Practice,2009.
[6]Michael McCandless,Erik Hatcher,Otis Gospodnetic[M].Lucene in Action 2nd Edition,2010.
[7]劉挺,秦兵,張宇等,譯.搜索引擎信息檢索實(shí)踐[M].北京:機(jī)械工業(yè)出版社,2010.
[8]中文搜索引擎技術(shù)揭密(三)[EB/OL].http://blog.csdn.net/kangsheng/archive/2005/03/19/323627.aspx,2005-03-19.
[10]中文分詞的研究現(xiàn)狀及未來(lái)發(fā)展[EB/OL].http://hi.baidu.com/08%B5%BD%B1%B1%BE%A9/blog/item/37bccc730ca586148701b0a8.html.
[11]中文搜索引擎技術(shù)揭密:中文分詞(四)[EB/OL].http://blog.csdn.net/kangsheng/archive/2005/03/19/323626.aspx,2005-03-19.
[12]Search Ranking Factors[EB/OL].http://www.seomoz.org/article/search-ranking-factors#overview.