鐘 鋒
(浙江外國語學(xué)院科學(xué)技術(shù)學(xué)院,浙江杭州310012)
信息與網(wǎng)絡(luò)技術(shù)的飛速發(fā)展使得電子文檔、網(wǎng)站、數(shù)據(jù)庫等數(shù)字資源越來越呈現(xiàn)出海量特點(diǎn).如何從海量信息中快速、準(zhǔn)確地搜索用戶感興趣的信息,已成為當(dāng)前信息領(lǐng)域研究的一個(gè)熱點(diǎn)[1].全文檢索技術(shù)可以高效地實(shí)現(xiàn)對海量文本數(shù)據(jù)的快速查詢,大大提高了檢索的效率[2].Lucene是Apache軟件基金會(huì)的一個(gè)開源全文搜索引擎工具包,提供了完整的查詢引擎、索引引擎及部分文本分析引擎.本文在詳細(xì)研究Lucene源代碼的基礎(chǔ)上,針對其中文分析引擎的弱點(diǎn),對中文分詞算法進(jìn)行了改進(jìn),并將其應(yīng)用到全文檢索系統(tǒng)中,取得了良好的效果.
本文構(gòu)建的是一個(gè)支持多文檔格式的全文檢索系統(tǒng),系統(tǒng)主要有四個(gè)模塊構(gòu)成,自下而上分別為文檔歸一化模塊、文本分析模塊、數(shù)據(jù)存儲(chǔ)模塊和查詢接口模塊(見圖1).
圖1 支持多文檔格式的全文檢索系統(tǒng)架構(gòu)
系統(tǒng)將待檢索的每一篇文檔的相關(guān)信息統(tǒng)一存儲(chǔ)到數(shù)據(jù)庫中并為其全文建立倒排索引.當(dāng)用戶要查找包含某一關(guān)鍵字的文檔時(shí),利用查詢接口模塊在建立好的索引和數(shù)據(jù)庫中進(jìn)行查詢,得到相應(yīng)結(jié)果.
文檔歸一化模塊主要完成對待檢索文檔的預(yù)處理,主要有兩個(gè)功能:一是支持將.pdf,.ppt,.doc等文本解碼并轉(zhuǎn)化為.txt文件;二是對文本內(nèi)容進(jìn)行過濾,取出可能存在的非法字符和亂碼.
文本分析模塊主要實(shí)現(xiàn)對元文件文檔附屬信息的提取存儲(chǔ)和通過文本分析器對中文內(nèi)容的分析與構(gòu)建倒排索引.文檔相關(guān)附屬信息(如作者、時(shí)間、單位、文件存放目錄等)直接存儲(chǔ)在數(shù)據(jù)庫中;而對于摘要內(nèi)容和正文內(nèi)容信息,由于信息量較大,我們通過文本分析器實(shí)現(xiàn)中文自動(dòng)分詞,再利用Lucene的索引模塊實(shí)現(xiàn)倒排索引的自動(dòng)構(gòu)建.Lucene自帶有中文自動(dòng)分詞系統(tǒng),但性能一般,為此我們將在下文給出了一種新的基于字典的中文分詞方法用作文本分析.
數(shù)據(jù)存儲(chǔ)模塊實(shí)現(xiàn)數(shù)據(jù)庫信息和索引信息的存儲(chǔ).數(shù)據(jù)庫采用開源的MySQL,索引的存儲(chǔ)直接利用Lucene索引模塊,該模塊定義了一套以8位字節(jié)為基礎(chǔ)的索引文件格式,使得兼容系統(tǒng)或者不同平臺(tái)的應(yīng)用能夠共享建立的索引文件.在傳統(tǒng)全文檢索引擎的倒排索引的基礎(chǔ)上,實(shí)現(xiàn)了分塊索引,能夠針對新的文件建立小文件索引,提升索引速度.然后通過與原有索引的合并,達(dá)到優(yōu)化的目的[3].
查詢接口模塊負(fù)責(zé)實(shí)現(xiàn)用戶的查詢與反饋.查詢接口支持兩種查詢模式:數(shù)據(jù)庫查詢和索引查詢.索引查詢使用Lucene自帶的查詢器,默認(rèn)支持布爾查詢、模糊查詢和分組查詢.
文本分析器的主要功能用來實(shí)現(xiàn)中文分詞.中文分詞主要是將連續(xù)的漢語字序列按照一定的規(guī)范重新組合成詞序列的過程.成功進(jìn)行中文分詞,可以達(dá)到電腦自動(dòng)識(shí)別語句含義的效果,為全文檢索奠定良好的基礎(chǔ).Lucene系統(tǒng)自帶的中文分詞為單字成詞算法,即不存在分詞,每個(gè)字單獨(dú)成為一個(gè)詞.在本系統(tǒng)中,為了提高中文檢索的效率,我們采用了基于字典的中文分詞方法,并將該算法與Lucene框架進(jìn)行整合應(yīng)用到全文檢索系統(tǒng)中去.
3.1.1 詞庫與字典數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)與實(shí)現(xiàn)
本文采用的詞庫為Sougou詞庫,詞庫大小為1.60MB,即160萬字節(jié),相當(dāng)于40萬詞左右的詞匯容量[4].為了讓其能適應(yīng)我們的分詞算法的字典需求,我們遵循詞語的長度最小為2,最大為15的原則,按詞長對Sougou詞庫進(jìn)行分類.
根據(jù)詞庫劃分,系統(tǒng)字典結(jié)構(gòu)采用基于字長的順序存儲(chǔ)結(jié)構(gòu),在字典中使用List結(jié)構(gòu)來維護(hù)字長為2~15的單詞的SubDictionary,每個(gè)SubDictionary字長一致(見圖2).
圖2 字典數(shù)據(jù)結(jié)構(gòu)
3.1.2 基于雙向最大匹配的中文分詞算法
基于字典的分詞方法又叫機(jī)械分詞算法,這種算法按照一定的策略將待分析的漢字串與一個(gè)“充分大”的機(jī)器詞典中的詞條進(jìn)行匹配,若在詞典中找到某個(gè)字符串,則匹配成功,識(shí)別出一個(gè)詞[5].文中,我們提出的匹配算法是正向匹配與逆向匹配相結(jié)合的算法,算法流程如下:(1)導(dǎo)入待分詞的文本,利用Sougou詞庫構(gòu)建按字長構(gòu)建字典數(shù)據(jù)結(jié)構(gòu).然后,將待分詞文本按照不同類型(如普通中文字符、英文字符、阿拉伯?dāng)?shù)字、中文數(shù)字、中文日期等)進(jìn)行分割分類,并放入不同字符塊(Block)中.(2)獲取當(dāng)前的字符塊進(jìn)行處理,如果字符塊為漢字字符串,則采用正向最大匹配和逆向最大匹配分別進(jìn)行分詞.(3)將正向最大匹配和逆向最大匹配結(jié)果進(jìn)行比較,若返回子串切分?jǐn)?shù)目不同,則采用切分?jǐn)?shù)目較小的結(jié)果;若返回子串的切分?jǐn)?shù)目相同,則找出各自切分后的最短子串,采用最短子串長度較短的結(jié)果;若最短子串長度相同,則采用逆向匹配的結(jié)果.若處理的字符塊為非中文字符,則根據(jù)人工設(shè)定的啟發(fā)式規(guī)則對其進(jìn)行處理.(4)將分詞結(jié)果保存到Result集合中,直到所有字符塊執(zhí)行完,打印輸出分詞的結(jié)果(見圖3).
圖3 基于雙向最大匹配的中文分詞算法
3.1.3 分詞算法與Lucene的整合
在Lucene中,一個(gè)標(biāo)準(zhǔn)的分析器由兩部分組成[6]:一部分是分詞器 Tokenizer,另一部分是過濾器TokenFilter.一個(gè)分析器往往由一個(gè)分詞器和多個(gè)過濾器組成.Lucene分析器中分詞器的基類Tokenizer的構(gòu)造函數(shù)接受的Reader對象,表示它直接從外部設(shè)備取得數(shù)據(jù)源.而TokenFilter的構(gòu)造函數(shù)接受的是TokenStream的實(shí)例.我們通過可以繼承該分析器的基類Analyze并覆蓋其tokenStream()方法,從而實(shí)現(xiàn)分詞器與Lucene的接口封裝.
PDF文檔的數(shù)據(jù)是一系列基本對象的集合:數(shù)組、布爾型、字典、數(shù)字、字符串和二進(jìn)制流.開源PDFBox組件可以從PDF文檔中抽取信息生成純文本文檔,而Apache開源POI項(xiàng)目則是針對Microsoft Office的多種格式文檔實(shí)現(xiàn)了信息抽取[7-8].
文檔歸一化模塊主要完成對待檢索的多格式文檔的預(yù)處理.而Lucene組件本身只支持對純文本文檔的開發(fā)與應(yīng)用.針對全文檢索系統(tǒng)對多文檔格式的需求,我們利用開源PDFBox組件和POI組件對不同文檔進(jìn)行解析,首先轉(zhuǎn)換為純文本文檔,再進(jìn)一步利用Document接口轉(zhuǎn)換為Lucene架構(gòu)所能通用處理的Document對象進(jìn)行處理(見圖4).
我們選用了國際漢語分詞評測Bakeoff 2005所提供的標(biāo)準(zhǔn)測試集合.這個(gè)集合給出了容量為7.12KB,共7293字節(jié)的文本文檔和分詞的標(biāo)準(zhǔn)結(jié)果[9-10].利用文中所設(shè)計(jì)的分詞算法將文本文檔進(jìn)行分詞,并和標(biāo)準(zhǔn)結(jié)果進(jìn)行比較,便可知道分詞優(yōu)劣.
對分詞的評測結(jié)果,我們重點(diǎn)關(guān)注P值、R值和F值,公式如下:
圖4 文檔解析器實(shí)現(xiàn)
其中,P值為準(zhǔn)確率,R值為召回率,F(xiàn)值反映的是P值和R值的綜合標(biāo)準(zhǔn).Numc為正確切分詞的數(shù)量,Numt為總切分詞數(shù)量,Numh為人工標(biāo)準(zhǔn)結(jié)果詞匯總量.實(shí)驗(yàn)結(jié)果如下:(1)最初使用最大匹配分詞,不進(jìn)行文本預(yù)處理時(shí),P=74.5%、R=69%、F=71%;(2)重點(diǎn)針對標(biāo)點(diǎn)符號(hào)、“的”字處理、地名處理等預(yù)處理過后,P=86.5%、R=84%、F=84%;(3)使用了Sogou詞庫作為算法字典來源,并加入成語詞庫及地名詞庫后,P=89.3%、R=86.7%、F=87.0%.通過對比,我們發(fā)現(xiàn),詞庫的好壞與規(guī)模,對于基于字典的分詞方法有決定性的作用,針對特殊詞匯的文本預(yù)處理也會(huì)對分詞的結(jié)果有一定的影響.通過基于Sougou詞庫的雙向最大分詞,我們?nèi)〉昧朔衷~準(zhǔn)確率和召回率較為均衡的分詞結(jié)果,具有一定的使用價(jià)值.
Lucene是一個(gè)面向?qū)ο蟮娜乃饕妫恼箩槍ζ渲形姆衷~的不足,提出了一種基于雙向最大匹配的中文分詞算法并將其應(yīng)用到檢索系統(tǒng)中去,使全文檢索具有較高的文本檢索準(zhǔn)確率和召回率.但系統(tǒng)依然有較大的改進(jìn)空間,在后續(xù)的研究中,我們將進(jìn)一步關(guān)注:(1)文中分詞算法與國際上先進(jìn)的分詞算法相比,P值、R值和F值值依然有較大的提升空間;(2)當(dāng)文檔資源規(guī)模進(jìn)一步擴(kuò)大時(shí),Lucene索引可以進(jìn)一步優(yōu)化,以更好地保證系統(tǒng)的運(yùn)行效率與穩(wěn)定性;(3)可以進(jìn)一步改進(jìn)對檢索結(jié)果的排序算法,使用戶更加滿意結(jié)果的呈現(xiàn).
[1]勵(lì)子閏.基于Lucene搜索引擎的中文全文信息檢索技術(shù)的研究[D].上海:華東師范大學(xué),2009:4-6.
[2]岳莉.基于Lucene的全文檢索系統(tǒng)的研究與應(yīng)用[D].西安:西安電子科技大學(xué),2010:5-7.
[3]Lucene Features[EB/OL].[2012-12-21].http://lucene.apache.org/core/.
[4]邱哲,符滔滔,王學(xué)松.開發(fā)自己的搜索引擎Lucene+Heritrix[M].2版.北京:人民郵電出版社,2010:135-140.
[5]車東.Lucene:基于 Java的全文檢索引擎簡介[EB/OL].(2011-11-11).http://www.chedong.com/tech/lucene.html.
[6]Gospodnetic O,Hatcher E.Lucene in Action[M].北京:電子工業(yè)出版社,2011:98-103.
[7]張盼,聶剛.基于Lucene的全文檢索系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].電腦知識(shí)與技術(shù),2010(1):93-95.
[8]申兵一,鞏青歌.基于Lucene的PDF文檔文本解析的實(shí)現(xiàn)[J].信息與電腦,2009(11):23-28.
[9]汪濤.論基于Java的全文檢索實(shí)現(xiàn)和索引性能提高[J].湖北民族學(xué)院學(xué)報(bào):自然科學(xué)版,2009(1):49-51.
[10]姚林濤.基于Lucene的Web搜索引擎實(shí)現(xiàn)[D].西安:西安電子科技大學(xué),2008:45-48.