《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于Lucene的中文分詞器的改進(jìn)與實(shí)現(xiàn)
基于Lucene的中文分詞器的改進(jìn)與實(shí)現(xiàn)
2015年微型機(jī)與應(yīng)用第11期
羅惠峰,郭淑琴
(浙江工業(yè)大學(xué) 信息工程學(xué)院,浙江 杭州 310023)
摘要: Lucene是一個(gè)高效的全文檢索工具包,本文主要研究了Lucene的體系架構(gòu)及其在中文檢索上的應(yīng)用。通過對(duì)基于最大匹配算法的中文分詞器的設(shè)計(jì)與改進(jìn),并引入文本解析器與構(gòu)建同義詞詞庫(kù)引擎,使得Lucene對(duì)中文的檢索更加個(gè)性化。通過檢索結(jié)果的對(duì)比表明,改進(jìn)后的中文分詞器對(duì)檢索功能的擴(kuò)展有了極大的提高。并最終構(gòu)建出了一個(gè)高效的中文全文檢索系統(tǒng)。
Abstract:
Key words :

  羅惠峰,郭淑琴

 ?。ㄕ憬I(yè)大學(xué) 信息工程學(xué)院,浙江 杭州 310023)

  摘  要: Lucene是一個(gè)高效的全文檢索工具包,本文主要研究了Lucene的體系架構(gòu)及其在中文檢索上的應(yīng)用。通過對(duì)基于最大匹配算法中文分詞器的設(shè)計(jì)與改進(jìn),并引入文本解析器與構(gòu)建同義詞詞庫(kù)引擎,使得Lucene對(duì)中文的檢索更加個(gè)性化。通過檢索結(jié)果的對(duì)比表明,改進(jìn)后的中文分詞器對(duì)檢索功能的擴(kuò)展有了極大的提高。并最終構(gòu)建出了一個(gè)高效的中文全文檢索系統(tǒng)。

  關(guān)鍵詞: 全文檢索;中文分詞器;文本解析器;最大匹配算法(MMSEG)

0 引言

  隨著網(wǎng)絡(luò)的發(fā)展和數(shù)據(jù)存儲(chǔ)技術(shù)的成熟,如何在大量的數(shù)據(jù)中快速、準(zhǔn)確地獲取到我們所需要的信息成為一個(gè)亟待解決的問題,也是信息檢索技術(shù)的核心問題。

  信息檢索的核心是全文檢索技術(shù),全文檢索是指以各種計(jì)算機(jī)數(shù)據(jù)諸如文字、聲音、圖像等為處理對(duì)象,提供按照數(shù)據(jù)資料的內(nèi)容而不是外在特征來(lái)實(shí)現(xiàn)的信息檢索手段。當(dāng)前對(duì)全文數(shù)據(jù)的檢索主要有兩種方法:順序掃描法(Serial Scanning)和倒排索引法(Inverted Index)。前者較為原始,對(duì)于小數(shù)量的數(shù)據(jù)是最直接和最方便的方法;但隨著數(shù)據(jù)量的增多,倒排索引法具有更快的檢索速度和更全的應(yīng)用范圍[1]。Lucene并不是一個(gè)完整的搜索引擎應(yīng)用,而是一個(gè)開放源代碼的高性能、可伸縮的信息搜索庫(kù),可以方便地嵌入到各種應(yīng)用中,實(shí)現(xiàn)針對(duì)應(yīng)用的全文索引/檢索功能,并且已經(jīng)在許多搜索項(xiàng)目中得到了廣泛的應(yīng)用[2]。

  中文分詞技術(shù)作為信息檢索的核心技術(shù)之一,它的研究與發(fā)展促進(jìn)了全文檢索技術(shù)的應(yīng)用。本文主要研究了中文分詞的最大匹配算法,并通過該算法對(duì)原始中文分詞器進(jìn)行了改進(jìn),改進(jìn)后的分詞器更加適用于中文條件下的搜索。

1 Lucene架構(gòu)及簡(jiǎn)介

001.jpg

  圖1描述了基于Lucene的全文檢索過程,Lucene對(duì)索引的創(chuàng)建和搜索是通過不同的流程來(lái)實(shí)現(xiàn)。創(chuàng)建索引時(shí),需要通過文件、數(shù)據(jù)庫(kù)、Web或人工輸入方式來(lái)對(duì)數(shù)據(jù)進(jìn)行采集;其次則需要建立索引的Document,一條Document就類似于數(shù)據(jù)庫(kù)的一條記錄[3];最后通過這些Document來(lái)生成索引。搜索索引時(shí),首先通過用戶查詢得到用戶的查詢條件,然后Lucene通過查詢條件對(duì)索引進(jìn)行搜索,并將最終經(jīng)過一定規(guī)則排序后的結(jié)果返回給用戶。目前常見的搜索引擎排序算法有Direct Hit排序算法、PageRank算法、排名競(jìng)價(jià)服務(wù)和詞頻位置加權(quán)算法[4]。

002.jpg

  圖2為L(zhǎng)ucene的邏輯架構(gòu)圖。由圖2可以看出Lucene索引和檢索時(shí)各個(gè)模塊間的調(diào)用關(guān)系:當(dāng)索引文件時(shí),接口模塊會(huì)先調(diào)用語(yǔ)法分析器對(duì)文本進(jìn)行分析,并通過基礎(chǔ)結(jié)構(gòu)公共模塊將分析后的數(shù)據(jù)寫入索引文件中。用戶查詢時(shí),同樣是通過接口模塊將查詢語(yǔ)句傳遞到索引核心模塊,該模塊負(fù)責(zé)在底層的存儲(chǔ)類中讀取索引文件里面的數(shù)據(jù),并返回給接口模塊[5]。該邏輯圖中的部分模塊是作為公共類存在的。

2 自定義中文分詞器的設(shè)計(jì)

  Lucene架構(gòu)中的分詞器(Analyzer)用于對(duì)文本數(shù)據(jù)進(jìn)行分詞,文本數(shù)據(jù)的索引創(chuàng)建過程一般包含以下幾步:(1)將原文檔傳遞給分詞組件(Tokenizer);(2)將得到的詞元(Token)傳遞給語(yǔ)言過濾組件(TokenFilter);(3)最后將得到的語(yǔ)匯單元(Term)傳遞給索引組件從而建立該詞的索引[6]。如圖3所示。

003.jpg

  2.1 文本解析器的應(yīng)用

  在構(gòu)建搜索程序時(shí),一個(gè)重要的步驟就是從文檔中提取文本以用于索引。這就要求搜索程序能夠處理多種多樣的文檔。對(duì)于XML或者HTML等文本格式,必須小心處理以避免對(duì)其標(biāo)簽進(jìn)行錯(cuò)誤的改寫。

  由于Lucene只能處理文本內(nèi)容,而不能直接處理文件,因此對(duì)于存儲(chǔ)文本的各種文件,Lucene過去采用不同的文檔過濾器,并通過這些過濾器從文件中提取文本,同時(shí)還需要自己檢測(cè)文檔類型和編碼類型[4]。通過引入文本解析器TIKA作為中間模塊,實(shí)現(xiàn)對(duì)文件的文本內(nèi)容進(jìn)行提取。除此之外,TIKA還能從大多數(shù)類型的文檔中提取出元數(shù)據(jù)[7]。TIKA相當(dāng)于提供了應(yīng)對(duì)各種文件的中間器,如圖4所示。

004.jpg

  2.2 分詞器的設(shè)計(jì)思路

  經(jīng)過文本提取后的內(nèi)容,就可以進(jìn)行分詞操作了。然而Lucene自帶的分詞器在中文環(huán)境下的應(yīng)用具有很大的局限性。對(duì)于英文該分詞器采用空格分詞,對(duì)于中文實(shí)際上只是將文本切割為單個(gè)字符,并不符合中文的語(yǔ)法及語(yǔ)義。最大匹配算法(MMSEG)是一種常見的、基于詞典的分詞算法[8]。該算法以正向最大匹配為主,多種消除歧義的規(guī)則為輔。它的匹配規(guī)則包括正向匹配和復(fù)雜匹配;歧義消除規(guī)則依次采用最大匹配、最大平均單詞長(zhǎng)度、單詞長(zhǎng)度最小方差和單字單詞語(yǔ)素最大自由度對(duì)語(yǔ)句進(jìn)行分詞,直到只有一種結(jié)果或者最后一個(gè)規(guī)則使用完畢。

  該算法強(qiáng)調(diào)長(zhǎng)度和均衡,體現(xiàn)在以下幾個(gè)方面:每個(gè)詞的組合要盡可能長(zhǎng),每個(gè)詞也要盡可能長(zhǎng),每個(gè)詞的長(zhǎng)度要盡可能接近,每個(gè)詞的詞頻也要較為接近。例如,假設(shè)C1,C2,C3,…,Cn為一組字符構(gòu)成的短語(yǔ)字符串,首先搜索詞典以確定_C1_是否為單個(gè)字,若為單個(gè)字則繼續(xù)搜索_C1C2_,直到在詞典中找到最長(zhǎng)的單詞即為最合理的匹配。取出這個(gè)詞,并對(duì)下一個(gè)字符采取同樣的操作,直到該字符串最后一個(gè)字。在消除歧義方面,定義平均詞長(zhǎng):

  1.png

  式中N為詞組總字?jǐn)?shù),M為詞語(yǔ)數(shù)量。對(duì)于字?jǐn)?shù)一定的詞組,詞語(yǔ)數(shù)量越少則平均詞長(zhǎng)越大,該系列分詞后的詞語(yǔ)更符合中文語(yǔ)義。當(dāng)平均詞長(zhǎng)相同時(shí),繼續(xù)采用詞語(yǔ)長(zhǎng)度的變化率(即標(biāo)準(zhǔn)差公式)來(lái)判斷分詞的好壞,定義每個(gè)詞的長(zhǎng)度分別為n1,n2,n3,…,nn,則該短語(yǔ)詞語(yǔ)長(zhǎng)度變化率為:

  2.png

  變化率越小,則說(shuō)明該方法下的分詞效果越好。最后,對(duì)于單字詞和連接詞的判斷,采用的方法是計(jì)算詞組中的所有單字詞詞頻的自然對(duì)數(shù),然后將得到的值相加,取總和最大的詞組。例如A_BBB_C(單字詞詞頻,A:3,C:7),DD_E_F(單字詞詞頻,E:5,F(xiàn):5)表示兩個(gè)詞組,A、C、E、F表示不同的單字詞,如果不取自然對(duì)數(shù),單純就詞頻來(lái)計(jì)算,這兩個(gè)詞組是一樣的,但實(shí)際上不同的詞頻范圍所表示的效果也不同,所以這里取自然對(duì)數(shù):

  ln Fa+ln Fc<ln Fe+ln Ff

  即:ln 3+ln 7<ln 5+ln 5(3)

  比如:設(shè)施_和_服務(wù),設(shè)施_和服_務(wù),在文本中,“和”字作為單字的詞頻越高,則第一種分詞方法的可能性就越大。

  基于以上所述的分詞算法,對(duì)示例語(yǔ)句“我是一名大學(xué)生”進(jìn)行分析,并標(biāo)明分詞后的語(yǔ)匯單元的屬性,如圖5所示。

005.jpg

  由圖5各項(xiàng)屬性可知,當(dāng)文本被語(yǔ)匯單元化了之后,相對(duì)于前一個(gè)語(yǔ)匯單元的位置信息將以位置增量值保存,默認(rèn)值為1。如果位置增量大于1,則表明兩個(gè)語(yǔ)匯單元之間有被TokenFilter過濾掉的停用詞?;谝陨戏衷~算法,可以構(gòu)建同義詞引擎,該同義詞能滿足與原詞匯具有相同的詞匯偏移量,并且通過堆棧的方式設(shè)置0位置增量來(lái)表示插入的同義詞,那么就可以實(shí)現(xiàn)基于Lucene的中文同義詞分詞器的改進(jìn)。這種改進(jìn)使得在搜索時(shí),輸入任何一個(gè)同義詞,都能得到相匹配的結(jié)果。

3 Lucene應(yīng)用測(cè)試實(shí)例及分析

  根據(jù)前文所述的自定義中文分詞器的設(shè)計(jì)方案,將該分詞器集成到Lucene分詞模塊中去,并通過對(duì)比最大匹配算法分詞器(MMSegAnalyzer)以及封裝好的自定義中文分詞器(MyAnalyzer)來(lái)進(jìn)行測(cè)試。自定義中文分詞器部分代碼如下,構(gòu)造該類時(shí)將同義詞引擎?zhèn)魅耄⒓虞d絕對(duì)路徑下的詞典。

  public class MyAnalyzer extends Analyzer {

  private SamewordContext samewordContext;

  //構(gòu)造時(shí)把同義詞引擎SamewordContext傳入

  public MyAnalyzer(SamewordContext swc){

  samewordContext=swc;

  }

  @Override

  public TokenStream tokenStream(String fieldName,Reader reader){

  Dictionary dic=

  Dictionary.getInstance("D:\\Java\\mmseg4j-1.8.5\\data");

  //分詞器采用最大匹配算法分詞器

  return new MySameTokenFilter(new MMSegTokenizer(new MaxWordSeg(dic),reader),samewordContext

  }

  }

  首先測(cè)試文本解析器TIKA的解析性能,通過對(duì)比TXT文本與被解析后的PDF文檔在Lucene中和Windows中對(duì)中文詞組“工具”的識(shí)別條數(shù)、索引和檢索時(shí)間,表明結(jié)合了文本解析器TIKA的Lucene具有較強(qiáng)的實(shí)用性。本文所用測(cè)試文本為世界科技百卷書及中華學(xué)生百科全書共200冊(cè),數(shù)據(jù)量約30 MB,系統(tǒng)為Windows 7 SP2。測(cè)試結(jié)果如表1所示。

006.jpg

  由表1可得知,使用Lucene對(duì)文件內(nèi)容創(chuàng)建索引并進(jìn)行搜索,其檢索效率與Windows自帶檢索功能相比,具有更快的算法實(shí)現(xiàn)。在搜索速度上,兩種方式的速度差別并不大,主要差別在于索引創(chuàng)建的過程。該實(shí)驗(yàn)結(jié)果很好地證明了最大匹配算法在中文分詞上的優(yōu)越性,以及TIKA對(duì)文本內(nèi)容的解析性能。

  接下來(lái)對(duì)搜索系統(tǒng)的完備性進(jìn)行測(cè)試。首先通過同義詞引擎將一組詞匯定義為相關(guān)同義詞,這使得在檢索某一詞匯時(shí),即使文檔本身中不包含該內(nèi)容,但只要包含了該詞匯的相關(guān)同義詞,即可獲得檢索結(jié)果。該方法是基于前述的位置信息和偏移信息等語(yǔ)匯單元屬性。定義同義詞:文明=文化=中華文明,并通過自定義分詞器建立索引并檢索這些詞匯,檢索結(jié)果如表2所示。

007.jpg

  由表2測(cè)試得知,當(dāng)文本解析器與自定義分詞器被引入Lucene之后,檢索響應(yīng)度和檢索滿意度均有較高提升,可以更方便快捷地實(shí)現(xiàn)用戶對(duì)數(shù)據(jù)的管理與檢索。

4 結(jié)束語(yǔ)

  通常使用功能完備性、分詞準(zhǔn)確性、檢索速度、查全率來(lái)評(píng)價(jià)搜索系統(tǒng)的性能。通過上述測(cè)試實(shí)例的對(duì)比發(fā)現(xiàn),結(jié)合了改進(jìn)后的自定義中文分詞器的搜索系統(tǒng),對(duì)以上性能指標(biāo)均有較高提升。當(dāng)然,該分詞器算法主要是根據(jù)最大匹配算法,通過詞典的加載來(lái)完成同義詞引擎的構(gòu)造。將來(lái)的研究方向:可以結(jié)合中文語(yǔ)義及概率統(tǒng)計(jì)智能化得出同義詞詞根,從而根據(jù)詞根使得搜索系統(tǒng)更加豐富化、人性化,并將其應(yīng)用在網(wǎng)絡(luò)數(shù)據(jù)檢索、網(wǎng)站搜索功能等方面。

參考文獻(xiàn)

  [1] 張博.基于Lucene倒排索引性能的研究與優(yōu)化[D].昆明:昆明理工大學(xué),2013.

  [2] 李永春,丁華福.Lucene的全文檢索的研究與應(yīng)用[J].計(jì)算機(jī)技術(shù)與發(fā)展,2009,20(2):12-15.

  [3] 羅剛.解密搜索引擎技術(shù)實(shí)戰(zhàn)Lucene&Java精華版[M].北京:電子工業(yè)出版社,2014.

  [4] 高樂,張健.基于網(wǎng)頁(yè)分塊的搜索引擎排序算法改進(jìn)[J].浙江工業(yè)大學(xué)學(xué)報(bào),2005,33(3):272-275.

  [5] 林碧英,趙銳,陳良臣.基于Lucene的全文檢索引擎研究與應(yīng)用[J].計(jì)算機(jī)技術(shù)與發(fā)展,2007,17(5):186-190.

  [6] 劉冰凌.基于正向最大匹配算法的優(yōu)化算法ImpFMMseg的實(shí)現(xiàn)[D].武漢:中南民族大學(xué),2010.

  [7] CUTTING D. The Lucene search engine powerful flexible and free[M]. Newyork: John Wiley Sons, 2000.

  [8] MCCANDLESS M. Lucene in Action[M].牛長(zhǎng)流,肖宇,譯.北京:人民郵電出版社,2011.


此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。