張俊飛
(廣州醫(yī)科大學,廣州511436)
信息技術(shù)的發(fā)展,推動了高校信息化教學和無紙化辦公,出現(xiàn)了越來越多的非結(jié)構(gòu)化數(shù)字文檔。如何快速對非結(jié)構(gòu)化的海量文檔進行檢索成為當前研究的熱點。傳統(tǒng)的方法是對每一個文檔進行遍歷,然而對于海量文檔來說,這是一件很耗費時間和精力的事情。全文檢索是一種高效的信息檢索技術(shù),可以快速地從海量文檔中查詢內(nèi)容,提高檢索效率。
Lucene是一套用于全文檢索的開源程序庫,是Apache軟件基金會Jakarta項目組的一個子項目[1]。Lucene不僅可以被用來構(gòu)建具體的全文檢索應用,還可以嵌入到各種系統(tǒng)軟件中。近幾年,Lucene已在各個領域中的應用得到了研究,如音視頻資源檢索[2]、學科領域的應用[3-4]、行業(yè)應用[5-6]。文獻[7]通過對倒排索引的研究,實現(xiàn)了基于正向減字最大匹配分詞方式的中文索引,提高了中文分詞效率。文獻[8]研究了Lu?cene索引查詢與關系數(shù)據(jù)庫的差異。文獻[9]利用Ha?doop和Lucene的結(jié)合,實現(xiàn)云存儲網(wǎng)絡文檔共享服務。隨著信息技術(shù)的發(fā)展,Lucene技術(shù)及其配套的組件也發(fā)生了變化,本文著重于文檔解析、中文分詞器、查詢結(jié)果的顯示處理等方面進行論述。
全文檢索是指計算機對檢索的數(shù)據(jù)源中每一個文檔通過文檔解析、分詞操作,對其進行創(chuàng)建索引庫,然后檢索索引庫,采用倒排索引技術(shù)把查找到相關文檔反饋給用戶的過程。
本研究采用Swing技術(shù)對Lucene及其配套組件進行整合,開發(fā)基于桌面應用的全文搜索終端。Swing是面向Java應用程序用戶界面的開發(fā)工具包,采用抽象窗口工具包(AWT),使應用程序具有跨平臺性,并且可以使用任何可插拔的外觀風格。Swing豐富、靈活的功能和模塊化組件使得Swing開發(fā)人員更加容易的創(chuàng)建優(yōu)雅的用戶界面。
本研發(fā)的桌面全文檢索終端包含文檔讀取模塊、索引模塊、檢索模塊等全文檢索核心功能。系統(tǒng)結(jié)構(gòu)如圖1所示。
圖1 系統(tǒng)結(jié)構(gòu)
為了實現(xiàn)快速檢索,Lucene采用倒排索引的數(shù)據(jù)結(jié)構(gòu)[10]。倒排索引是根據(jù)屬性值查找記錄數(shù)據(jù),每個屬性包含該屬性歸屬的記錄數(shù)據(jù)地址。通常認為單詞是文檔的組成部分,反轉(zhuǎn)認為文檔是依附單詞存在,這樣的索引就稱作倒排,由屬性值查找記錄數(shù)據(jù)的位置因而稱為倒排索引。倒排索引以文檔形式存儲,形成倒排文檔。
全文檢索的關鍵步驟就是建立倒排索引,倒排索引一般表示為一個關鍵詞,并記錄它出現(xiàn)的頻數(shù)、地址等相關信息。好比書本的目錄結(jié)構(gòu),可以直接根據(jù)目錄提示信息,查看到章節(jié)信息摘要、頁碼等,從而獲取章節(jié)信息,不必對書進行全部遍歷。
Lucene的索引結(jié)構(gòu)可以分為索引(index)、索引段(segment)、索引文檔(document)、索引域(field)和索引項(term)五個層次。五個層次之間是具有包含關系的,每個索引由一個或者多個索引段組成,每個段包含一個或者多個索引文檔,每個文檔又管理一個或者多個索引域,每個域由一個或多個索引項構(gòu)成,而每個索引項就是一個索引數(shù)據(jù)。Lucene 5.2.1生成的索引文檔類型如表1所示。
表1 索引文檔類型
本研究終端主要針對中文文檔進行全文檢索,目前中文分詞算法大概分為兩大類:①基于詞典分詞法。掃描字符串,按照正向或逆向最大匹配,最小切分等策略。②非詞典分詞法。基于統(tǒng)計以及機器學習的分詞方式。
第一種分詞算法比較常見,在實際應用中,通常是多種算法整合使用,同時加入多個屬性值如詞頻、詞性等以輔助分詞處理,達到理想的輸出效果。這種算法形成的分詞器分詞速度快,時間復雜度較低,實現(xiàn)簡單。第二種分詞器目前常見的是HMM、CRF等,主要運用了機器學習、概率統(tǒng)計等領域的方法。這種分詞器需要提前對文件進行建模,根據(jù)標注好的語料庫對模型參數(shù)進行訓練,通過對模型分詞概率的計算,將概率最大的分詞結(jié)果作為輸出結(jié)果。這種分詞方法對未知詞語的分詞處理較好,能夠根據(jù)訓練出的領域模型提高分詞精度,但是需要大量的前期準備,實現(xiàn)比較復雜。
Lucene是開源高性能的Java全文檢索引擎架構(gòu),提供了完整的查詢引擎、索引引擎和部分文本分析引擎。Lucene內(nèi)部自帶了一些分詞器,如:StandardAna?lyzer、SimpleAnalyzer、WhitespaceAnalyzer、StopAnalyz?er、SmartChineseAnalyzer等分詞器。但是在本研究中主要是針對中文分詞,Lucene內(nèi)部這些分詞器不能滿足要求。故本研究采用MMSeg4j分詞器,它是基于MMSeg算法實現(xiàn)的中文分詞組件。
MMSeg是一種基于詞典的分詞算法,采取正向最大匹配策略,同時加入多種消除歧義的規(guī)則。其算法實現(xiàn)方式分為兩種:①SimpleAnalyzer,簡單的按照匹配上的最長詞條做切分;②ComplexAnalyzer,在正向最大匹配的基礎上,添加了相鄰詞的詞長策略,設計了四個去歧義規(guī)則指導分詞。四個規(guī)則分別為:備選詞塊的長度最大、備選詞塊的平均詞長最大、備選詞塊的詞長變化最小、備選詞塊中單字的出現(xiàn)詞自由度最高。在實際應用中,一般都整合使用ComplexAnalyzer和四個過濾規(guī)則。
本文重點比較了Lucene自帶的兩種中文分詞器:SmartChineseAnalyzer、StandardAnalyzer和 MMseg4j分詞器的ComplexAnalyzer實現(xiàn)方法。以“計算機軟件工程教育技術(shù)全文搜索引擎”為例,并在MMseg4j詞庫中添加了“計算機軟件工程”和“教育技術(shù)”兩個詞條,測試結(jié)果如表2所示。
表2 分詞器對比分析結(jié)果
從表2中可以看出,StandardAnalyzer分詞器實現(xiàn)了對中文單字的分詞,不能滿足用戶基于詞的分詞效果;SmartChineseAnalyzer實現(xiàn)了基于詞的分詞,但是不能夠得到用戶指定的詞條,且耗時較長。MMseg4j分詞器的ComplexAnalyzer能夠提供用戶自定義分詞詞條,且耗時較少。
在創(chuàng)建索引時,一個最重要的步驟就是從文檔中提取文本。然而海量文檔格式繁多,如Outlook、MS Of?fice、PDF、RTF等,對不是同一編碼格式的文檔內(nèi)容提取處理將不是一件簡單的事情。
Apache Tika是一種簡單易用的程序框架,針對不同的文檔類型使用相同的API。Tika本身并不完成任何文檔的過濾提取,而是通過外部獨立的解析程序完成對文檔的解析。除了文本文檔之外,Tika還可以提取元數(shù)據(jù)[11]。Tika使用內(nèi)部解析類庫實現(xiàn)對文檔的解析,對應的文檔格式和Tika類如表3所示。
表3 Tika解析文檔格式
Lucene提供兩種高亮方式:FastVectorHighlighter和Hightlighter。FastVectorHighlighter是基于項向量實現(xiàn)的,通過對每個域中的Term的位置信息進行標注,實現(xiàn)檢索的方便快速定位,但是這就意味著需要額外存儲空間和磁盤I/O操作,索引體積會變大,占用更大內(nèi)存。故采用Hightlighter犧牲高亮標注時間,增加系統(tǒng)松耦合性。
使用Lucene自帶的Highlighter就可以實現(xiàn)對原始文檔摘要的提取工作。通過對Highlighter類中g(shù)et?BestFragment方法的重載,實現(xiàn)從指定的原始文檔中,提取檢索關鍵字出現(xiàn)頻率最高的一段文字作為摘要,默認情況下提取100個字符,同時加上自定義的高亮顯示代碼實現(xiàn)關鍵字高亮顯示。
終端實現(xiàn)了對本地海量文檔的全文檢索。通過Swing中的JFileChooser組件實現(xiàn)海量本地文檔數(shù)據(jù)源的定位。通過對MMseg4j分詞器的詞庫文檔的編輯實現(xiàn)用戶對需要查詢詞條的添加。索引模塊采用Tika框架實現(xiàn)對文檔的解析,MMseg4j分詞器的MMseg算法實現(xiàn)對字符串流的分詞,使用Lucene封裝的Index?Writer方法創(chuàng)建索引。
SwingX是一個包含Swing GUI工具包的擴展控件,為富客戶端應用提供豐富的組件。采用其中的JX?BusyLabel組件實現(xiàn)程序加載中的友好提示,如圖2所示。
圖2 SwingX組件
圖3 檢索方式
本研究實現(xiàn)的全文檢索方式有六種:通過項搜索、組合搜索、短語搜索、通配符搜索、模糊搜索、匹配所有文檔搜索。
通過項搜索是對索引中特定項進行搜索的最基本方式。Term是最小的索引片段,每個Term包含一個域名和一個文本值。
組合搜索通過使用邏輯AND、OR和NOT把各種查詢類型組合成復雜的查詢方式。在本系統(tǒng)中,組合查詢整合了兩個通過項查詢,如下代碼所示。
短語搜索根據(jù)位置信息查詢到某個距離范圍內(nèi)的項所對應的文檔。
通配符查詢通過使用“*”和“?”進行查詢。*代表0個或者多個字符;?代表0個或者多個字符。
模糊查詢用于查詢與指定項相似的項的一種查詢方式,通過Levenshtein距離算法來決定索引文檔中的項與指定目標項的相似度。編輯距離越小的項所獲得的評分越高,編輯距離公式如公式(1)。
匹配所有文檔搜索,顧名思義就是匹配索引中所有文檔。文檔查詢加權(quán)默認值是1.0,加權(quán)值起到排序作用。
通過項搜索界面如圖4所示,其他檢索界面布局一致。在檢索界面中,查詢按鈕實現(xiàn)了對輸入項的全文查找。詳情按鈕采用 DJNativeSwing.jar、DJNa?tiveSwing-SWT.jar和org.eclipse.swt.win32.win32.x86_64-4.2.jar三個jar包,實現(xiàn)在終端中嵌入一個瀏覽器,把查詢結(jié)果以網(wǎng)頁形式高亮顯示反饋給用戶,如圖5所示。導出按鈕實現(xiàn)把查詢到的信息文檔復制到指定的文檔夾中,便于用戶集中閱讀。
圖4 通過項搜索圖
圖5 檢索結(jié)果
Luke是一個針對Lucene搜索引擎,方便開發(fā)和診斷的第三方工具,它可以訪問Lucene創(chuàng)建的索引,并允許顯示和修改。本研究使用lukeall-5.2.1.jar實現(xiàn)對創(chuàng)建索引的查看,如圖6所示。
圖6 Luke應用界面
最后,Eclipse把開發(fā)好Swing程序,發(fā)布成終端jar文件,然后采用exe4j工具把終端jar文件和終端運行依賴環(huán)境文件夾jre7一起打包成可獨立執(zhí)行的exe文檔。
實驗過程,采用普通PC,配置參數(shù)為:Intel Core i3-3240 CPU x64處理器,頻率為3.4GHz,內(nèi)存4GB,64位操作系統(tǒng)。選取 MS Office、CAJ、TXT、網(wǎng)頁、PDF 等不同格式文檔組成四個不同大小的數(shù)據(jù)源文件夾,總大小分為40.9M、385M、770M、1.1G。終端可以直接拷貝到PC上,運行exe主程序,對選取的數(shù)據(jù)源進行索引創(chuàng)建和檢索操作。
從實驗結(jié)果表4、圖8可以看出,數(shù)據(jù)源大小對文檔索引和檢索速率產(chǎn)生了影響,當數(shù)據(jù)源大小達到某個數(shù)值的時候,速率會下降,在本實驗中,數(shù)據(jù)源大小在385M處索引速率和檢索速率發(fā)生下降;當數(shù)據(jù)源總大小超過某個數(shù)值的時候,索引速率和檢索速率變化幅度變小。終端在實際的使用過程中,基本可以實現(xiàn)用戶本地海量文檔的快速檢索,其具備較高應用價值。
圖7 終端應用圖
表4 實驗對比分析結(jié)果
圖8 實驗對比分析圖
本文針對海量本地文檔檢索問題,設計和研發(fā)了一款全文檢索桌面終端軟件。該終端具有友好的用戶體驗,可以針對不同格式文檔進行解析,實現(xiàn)基于詞典的分詞操作,采用Swing配套組件實現(xiàn)查詢結(jié)果以網(wǎng)頁形式顯示在桌面終端程序中,并對結(jié)果數(shù)據(jù)進行了高亮處理。后期的實驗數(shù)據(jù)驗證了終端的可使用性,其具有一定的應用價值。