Lucene中文分析器的中文分词准确性和性能比较
对几种中文分析器,从分词准确性和效率两方面进行比较。分析器依次为:StandardAnalyzer、ChineseAnalyzer、CJKAnalyzer、IK_CAnalyzer、MIK_CAnalyzer、MMAnalyzer、PaodingAnalyzer。
单纯的中文分词的实现一般为按字索引或者按词索引。按字索引顾名思义,就是按单个字建立索引。按词索引就是按词喽,根据词库中的词,将文字进行切分。车东的交叉双字分割或者叫二元分词我觉得应该算是按字索引的改进,应该还是属于字索引的范畴吧。
分词准确性的评估比较难,很难有统一的标准,不同应用的要求也不同,这个统一以“2008年8月8日晚,举世瞩目的北京第二十九届奥林匹克运动会开幕式在国家体育场隆重举行。”为例说明。
分词效率,统一使用《射雕英雄传》的全文文本为例说明。呵呵。对于按词索引的分析器,使用统一的基本词库,词汇量为227,719个。在开发环境下运行,性能不准确,但可比较相对值。
分析器:
按字 | StandardAnalyzer | Lucene自带的标准分析器。 |
| ChineseAnalyzer | Lucene contrib中附带的分析器,与StandardAnalyzer类似。注意是类似啊,还是有区别的。 |
| CJKAnalyzer | Lucene contrib中附带的二元分词 |
按词 | IK_CAnalyzer、MIK_CAnalyzer | http://lucene-group.group.javaeye.com/group/blog/165287。使用版本为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在性能上对于词典的敏感度较高。
总结:
对于一般性的应用,采用二元分词法应该就可以满足需求。如果需要分词的话,从分词效果、性能、扩展性、还是可维护性来综合考虑,建议使用庖丁解牛。