徐有健
(華南理工大學,廣東廣州,510006)
基于Lucene的中文分詞算法研究與實現(xiàn)
徐有健
(華南理工大學,廣東廣州,510006)
本文重點研究了如何改進中文分詞算法,并根據(jù)新的中文算法,設計出可以滿足Hadoop文件系統(tǒng)可視化文件搜索引擎研究的中文分析器MyAnalyzer。
lucene;Hadoop;搜索;中文分詞
作為中文信息處理的基礎,中文分詞分析器的效率和準確度對搜索引擎研究至關重要。中文分詞的準確性會直接影響到中文搜索引擎的準確率和工作效率。目前,中文搜索引擎技術比西文搜索引擎技術落后一段距離的原因就在于中文搜索需要經(jīng)過分詞程序,西文引擎的分詞分析器不適用于中文分詞。比如Lucene自帶的StandardAnalyzer分析器,英文分詞的效果非常好,但是在中文分詞方面是將每一個漢字當做一個詞,對中文分詞并沒有實用價值。至于Lucene自帶的另外兩種內(nèi)置分析器,SmartChineseAnalyzer和CJKAnalyzer,雖然可以實現(xiàn)中文分詞,但是分詞效率比較低,尤其是CJKAnalyze,會產(chǎn)生大量的無用分詞。由于Hadoop本身不帶有可視化文件系統(tǒng)管理功能,要建立基于Lucene的Hadoop文件系統(tǒng)可視化搜索引擎,就要研究如何改進Lucene中文分詞器,使其滿足項目需要。
2.1 中文分詞模塊設計
2.1.1 中文分詞模塊框架設計
設計一個高性能實用化的中文分詞模塊對實現(xiàn)引擎搜索結(jié)果的準確性和快捷性具有重要的意義。設計中文分詞模塊框架時要考慮到分詞速度、分詞精確度和系統(tǒng)維護的便利性。根據(jù)三個考慮要素,設計中文分詞框架如圖1-1所示。設計的分詞框架包括詞典、分詞器和性能評測三個模塊。
圖1 -1
2.1.2 中文分詞算法設計
為了適應人們的日常閱讀習慣與寫作習慣,本中文分詞模塊中文分詞算法設計采用了最佳匹配法的分詞算法。最佳匹配法分為正向的最佳匹配法和逆向的最佳匹配法,以“長詞優(yōu)先”原則為核心,按照在詞頻的大小順序?qū)υ~典中的詞條進行排列。正向最佳匹配算法的形式定義為:對于文本中的字符串ABC,A∈Z,AB∈Z,ABC不屬于Z,Z為字典,那么這串字符就切分為AB/C。例如,一封毛澤東親筆信原稿,采用正向最佳匹配法時則劃分為一封/毛澤東/親筆信/原稿。逆向最佳匹配法與正向最佳匹配法相反,從句子或者文章末尾開始處理。具體的算法設計如下:
(1)正向最佳逐字匹配算法
采用正向最佳逐字匹配算法,要堅持“長詞優(yōu)先”原則,即當一個漢字字符出現(xiàn)多種切分結(jié)果時,取含有長度最長的詞條切分結(jié)果。運用長詞優(yōu)先原則,有利于縮短對分詞詞典的檢索時間,提高分詞速度。運用正向最佳逐字匹配算法進行分詞的設計思路為:首先,在詞典中搜索字符串的最前面的字符,形成以該首字字符節(jié)點為根的詞典樹,將該字符串與詞典樹進行匹配,一次匹配一個字符,匹配成功則繼續(xù)向下匹配,否則就回溯,找到上一個可以成詞的字,即終止標識符為“T”,形成分詞結(jié)果。具體描述如下:
輸出:切分出的單詞集合S
Step1:在首字散列中定位待查詢漢字符串首字據(jù)待查詢字符串的首字的Unicode值。如果字符節(jié)點為根的詞典樹存在,則得到子樹節(jié)點的指針,并通過子樹節(jié)點的指針找到子節(jié)點表,記錄該節(jié)點的層數(shù)k,i=i+1,轉(zhuǎn)Step2。如果不存在,則單獨成詞,將該字添加到單詞集合S中,指向,重復Step1。
Step3:判斷該節(jié)點組詞標識是否為T,如果是,則轉(zhuǎn)Step4;如果不是,則i=i+1,找到該節(jié)點的子節(jié)點表,轉(zhuǎn)Step2。
Step4:判斷該節(jié)點是否為葉子節(jié)點,如果是,若i<n,將添加到單詞表S中,i=i+1,轉(zhuǎn)Step1;若i=n,將添加到單詞表S中,算法結(jié)束。如果不是,i=i+1,記錄該節(jié)點層次 k,轉(zhuǎn) Step2。
與傳統(tǒng)的正向最佳逐字配算法相比,這種正向最佳逐字配算法減少了分詞過程中試探性查詢的次數(shù),無需預知待查詢詞的長度,實現(xiàn)一次匹配完成分詞,極大地提高了分詞的效率。以“今天我們要上學”為例,假設詞典的最長詞長為5。
一般的最大匹配分詞算法的查找過程為:
用本文設計的最大匹配算法的查找過程為:
今天我們要上學我們要上學要上學上學。
通過比較,一般的最大匹配分詞算法的查找次數(shù)為12次,本文的最大匹配算法為4次,大大減少了查找的次數(shù),提高了查找的效率。
(2)逆向最佳逐字匹配算法
逆向最佳逐字匹配算法的原理與正向最佳逐字匹配算法基本相同,因此不以加贅述。與正向最佳逐字匹配算法不同的是,逆向最長匹配的分詞算法是從右至左,從字符串后面進行掃描,需要配合逆向最長匹配的詞典結(jié)構進行使用。
2.1.3 詞典設計
為了實現(xiàn)中文分詞模塊的順利使用,要結(jié)合分詞算法設計出詞典。
首先,要統(tǒng)計中文中的詞的字數(shù)個數(shù)的頻率,根據(jù)頻率制定各字數(shù)的詞條。一般來說,中文詞中,字數(shù)為2的詞語數(shù)量比較多,多字(四個字以上)的使用頻率比較低。其次,為了配合正向最佳逐字匹配算法使用,要設計出正序詞典機制。詞典中首字的索引值即為首字的 Unicode 編碼。詞典的第一層要建立起以詞語首字為索引的首字散列表,使各個首字相同的詞語采用同一根節(jié)點的詞典結(jié)構。除了詞語的首字外,剩余部分在內(nèi)存中采用樹的形式存放。最后,為了配合逆向最佳匹配算法,要設計出逆序詞典作為使用基礎。逆序詞典結(jié)構與正序詞典結(jié)構完全相同,但是要將每個詞條的順序顛倒,建立起存儲詞語尾字W以及在每個W下記錄了以尾字W為詞尾的所有詞匯的首字散列表。
2.2 中文分詞機制的實現(xiàn)
實現(xiàn)分詞機制首先要實現(xiàn)分詞預處理,將需要分詞的內(nèi)容轉(zhuǎn)換為分詞模塊可以處理的文本格式。其次,通過Lucene的工具包中的Analayzer類工具,實現(xiàn)設計的中文分詞模塊。由于Lucene自帶的SmartChineseAnalyzer和CJKAnalyze不能滿足引擎中的中文分詞需要,因此要開發(fā)出新的中文分析器。本文將新的分詞算法加入到Lucene當中開發(fā)出適合需要的MyAnalyzer,通過MyAnalyzer實現(xiàn)新設計的中文分詞算法。
2.3 分詞性能測試
2.3.1 分詞速度測試
(1)實驗方法: 以經(jīng)過分詞預處理后得到的純文本為速度測試材料,通過計算分詞的速度與質(zhì)量對分詞模塊的分詞性能進行測試。
(2)實驗方案:文本長度從500字符開始,以1500個字符為一個遞增區(qū)間,分別計算每次分詞所耗的時間。
(3)實驗數(shù)據(jù)測量:由于實驗環(huán)境無法達到理想狀態(tài),同一個文本每次切分所耗費的時間并不完全相同導致記錄時間有誤差,為了使實驗數(shù)據(jù)更加接近標準數(shù)據(jù),要對每個文本進行反復測試,取數(shù)據(jù)的平均值。
(4)實驗結(jié)果:經(jīng)過反復測驗,獲得實驗數(shù)據(jù)如表1-3
(5)數(shù)據(jù)分析:從表1-3可以看出,分析器的分詞速度一直都保持在20字/ms至25字/ms的速度之間。以這個速度,本分詞模塊每秒鐘處理字符數(shù)在20000到250000之間,可以滿足現(xiàn)在中文搜索引擎對速度的要求。
表1 -3
2.3.2 分詞精準度測試
(1)實驗方案:隨機選擇一個句子,通過MyAnalyzer、SmartChineseAnalyzer和CJKAnalyze三種分析器進行分詞,對結(jié)果進行比較,判斷新設計的中文分詞模塊的精準度。
(2)實驗步驟:①選擇了“2008年12月26日,中國海軍首批護航編隊踏上了遠洋護航的漫長征程。”作為分詞文本
②參與實驗的分析器包括MyAnalyzer、SmartChineseAnalyzer和CJKAnalyze
(3)實驗結(jié)果:MyAnalyzer的分詞結(jié)果是 2008/年/12/月/26/日/中國/海軍/首批/護航/編隊/踏上/了/遠洋/護航/的/漫長/征程/
SmartChineseAnalyzer的分詞結(jié)果是年/月/日/中/國/海/軍/首/批/護/航/編/隊/踏/上/了/遠/洋/護/航/的/漫/長/征/程/
CJKAnalyze的分詞結(jié)果是2008/年/12/月/26/日中/中國/國海/海軍/軍首/首批/批護/護航/航編/編隊/踏上/上了/了遠/遠洋/洋護/護航/航的/的漫/漫長/長征/征程/
(4)實驗結(jié)論:通過對分詞結(jié)果進行對比,可以發(fā)現(xiàn)MyAnalyzer的分詞準確性最高,具體體現(xiàn)在:SmartChineseAnalyzer將中文外的其他字符種類都給過濾掉了。CJKAnalyze保留了其他種類的字符,但是產(chǎn)生了許多無用的切分。相比之下,MyAnalyzer保留了中文外的其他字符種類,并且分詞字數(shù)不限于兩個字數(shù),準確率較高。因此,MyAnalyzer可以滿足Hadoop文件系統(tǒng)可視化文件搜索引擎設計的需要。
關于中文分詞的算法,目前仍然沒有完美的設計方案,可以完美兼顧中文分詞的準確性與高效率,而是或多或少會存在一定的局限性。但是,通過比較各種分詞算法的優(yōu)劣,并不斷對分詞算法加以改善,取長補短,終有一日可以整合出一個效率高、準確率高的分詞方法,推動中文引擎技術的發(fā)展。
[1] 戴洪,蔣靜,樊程,等.一種基于LUCENE的中文分詞算法研究[J].青島大學學報:自然科學版,2011(3):53-58.
[2] 趙珂,逯鵬,李永強.基于Lucene的搜索引擎設計與實現(xiàn)[J].計算機工程,2011(16):39-41.
[3] 趙旭,王慶樺.向LUCENE搜索引擎中加入中文同義詞查詢[J].科技信息,2011(7):60-61.
Lucene the Chinese word segmentation algorithm and implementation of research-based
Xu Youjian
(South China University of Technology,Guangzhou,510006)
This paper is aimed at improving Chinese word segmentation module.According to the new Chinese word segmentation module,an analyzer named MyAnalyzer that can process Hadoop file System research is developed.
lucene;Hadoop;search;Chinese word