Lucene中文分析器的中文分詞準確性和效能比較

atlantisholic發表於2011-07-31
對幾種中文分析器,從分詞準確性和效率兩方面進行比較。分析器依次為:StandardAnalyzer、ChineseAnalyzer、CJKAnalyzer、IK_CAnalyzer、MIK_CAnalyzer、MMAnalyzer(JE分詞)、PaodingAnalyzer。
單純的中文分詞的實現一般為按字索引或者按詞索引。按字索引顧名思義,就是按單個字建立索引。按詞索引就是按詞嘍,根據詞庫中的詞,將文字進行切分。車東的交叉雙字分割或者叫二元分詞我覺得應該算是按字索引的改進,應該還是屬於字索引的範疇吧。
分詞準確性的評估比較難,很難有統一的標準,不同應用的要求也不同,這個統一以“2008年8月8日晚,舉世矚目的北京第二十九屆奧林匹克運動會開幕式在國家體育場隆重舉行。”為例說明。
分詞效率,統一使用《射鵰英雄傳》的全文文字為例說明。呵呵。對於按詞索引的分析器,使用統一的基本詞庫,詞彙量為227,719個。在開發環境下執行,效能不準確,但可比較相對值。

 

 

分析器:


按字

StandardAnalyzer

Lucene自帶的標準分析器。

 

ChineseAnalyzer

Lucene contrib中附帶的分析器,與StandardAnalyzer類似。注意是類似啊,還是有區別的。

 

CJKAnalyzer

Lucene contrib中附帶的二元分詞

按詞

IK_CAnalyzer、MIK_CAnalyzer

http://code.google.com/p/ik-analyzer/downloads/list。使用版本為2.0.2

 

MMAnalyzer

現在能找到的最新版本是1.5.3。不過在原始網站已經找不到下載了,而且據說宣告為不提供維護和支援。因為談論的人比較多,所以列出來。但在使用中感覺不太穩定。

 

PaodingAnalyzer

庖丁解牛。http://code.google.com/p/paoding/downloads/list。使用版本為2.0.4beta。

 

   分詞準確性:


StandardAnalyzer

2008/年/8/月/8/日/晚/舉/世/矚/目/的/北/京/第/二/十/九/屆/奧/林/匹/克/運/動/會/開/幕/式/在/國/家/體/育/場/隆/重/舉/行/

一元分詞,沒什麼好說的。

ChineseAnalyzer

年/月/日/晚/舉/世/矚/目/的/北/京/第/二/十/九/屆/奧/林/匹/克/運/動/會/開/幕/式/在/國/家/體/育/場/隆/重/舉/行/

還是有區別吧,這是因為ChineseAnalyzer只對Character.LOWERCASE_LETTER、Character.UPPERCASE_LETTER、和Character.OTHER_LETTER進行了處理,其他型別的都濾掉了。具體可以參見程式碼。

CJKAnalyzer

2008/年/8/月/8/日晚/舉世/世矚/矚目/目的/的北/北京/京第/第二/二十/十九/九屆/屆奧/奧林/林匹/匹克/克運/運動/動會/會開/開幕/幕式/式在/在國/國家/家體/體育/育場/場隆/隆重/重舉/舉行/

二元分詞,作為一元分詞的改進,建立的索引小於一元,查詢效率較好,能滿足一般的查詢要求。

PaodingAnalyzer

2008/年/8/月/8/日/晚/舉世/矚目/舉世矚目/目的/北京/二/第二/十/二十/第二十/九/十九/二十九/九屆/奧林/奧林匹克/運動/運動會/奧林匹克運動會/開幕/開幕式/國家/體育/體育場/隆重/舉行/隆重舉行/

細粒度全切分。對於不在詞典中的詞進行二元分詞。

IK_CAnalyzer

2008年/2008/年/8月/8/月/8日/8/晚/舉世矚目/舉世/矚目/目的/北京/第二十九屆/第二十九/第二十/第二/二十九/二十/十九/九屆/九/奧林匹克運動會/奧林匹克/奧林/運動會/運動/開幕式/開幕/在國/國家/國/體育場/體育/隆重舉行/隆重/舉行/行/

細粒度全切分。對於不在詞典中的詞進行二元分詞。

MIK_CAnalyzer

2008年/8月/8日/晚/舉世矚目/目的/北京/第二十九屆/奧林匹克運動會/開幕式/在國/國家/體育場/隆重舉行/

最大匹配分詞。和細粒度全切分配合使用。

MMAnalyzer

2008/年/8/月/8/日/晚/舉世矚目/北京/第二十/九屆/奧林匹克運動會/開幕式/國家/體育場/隆重舉行/

對於不在字典項的內容,進行一元分詞。

 

 

分詞效能(毫秒):

分析器

第一次

第二次

第三次

分詞數

StandardAnalyzer

243

246

241

767675

ChineseAnalyzer

245

233

242

766298

CJKAnalyzer

383

383

373

659264

PaodingAnalyzer

927

899

909

482890

IK_CAnalyzer

1842

1877

1855

530830

MIK_CAnalyzer

2009

1978

1998

371013

MMAnalyzer

2923

2933

2948

392521

需要說明的是,IK_CAnalyzer在效能上對於詞典的敏感度較高。
總結:
對於一般性的應用,採用二元分詞法應該就可以滿足需求。如果需要分詞的話,從分詞效果、效能、擴充套件性、還是可維護性來綜合考慮,建議使用庖丁解牛。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23071790/viewspace-703626/,如需轉載,請註明出處,否則將追究法律責任。

相關文章