基于Lucene的自定义中文分词器的设计与实现
2014-02-17王桐王韵婷
王桐 王韵婷
摘要:该文设计了一个基于复杂形式最大匹配算法(MMSeg_Complex)的自定义中文分词器,该分词器采用四种歧义消除规则,并实现了用户自定义词库、自定义同义词和停用词的功能,可方便地集成到Lucene中,从而有效地提高了Lucene的中文处理能力。通过实验测试表明,该分词器的分词性能跟Lucene自带的中文分词器相比有了极大的提高,并最终构建出了一个高效的中文全文检索系统。
关键词:中文分词;复杂最大匹配;Lucene;分词器
中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2014)02-0430-04
虽然Lucene功能强大,配置灵活且应用广泛,然而其自带分词器的中文分词效果却不是太好。中文分词是自然语言处理领域中的一项重要的基础性工作,其结果将直接影响到检索系统的查准率和查全率。因此,研究一种能与Lucene相结合的高效的中文分词器,一直以来都是一个重要的课题[1]。将中文的汉字序列切分成一系列有意义的词,就是中文分词技术所要探讨内容,中文分词的准确与否,对搜索引擎检索结果的相关性和准确性有着很大的影响[2]。综合考虑上述要求,该文决定采用基于字符串匹配的分词算法来设计分词器,因为它原理简单且易于实现,简洁而高效,完全可以满足一般情况下开发设计自己个性化搜索引擎的需要。
1 Lucene简介及其分词原理
Lucene中不同的Analyzer其实质上就是组合不同的Tokenizer和TokenFilter而得到最后的TokenStream。当文本在索引过程中经过分析后,最后生成的每个语汇单元都将作为一个项被传递给索引[3]。我们以对文本“How are you”的分析为例,该文本中每个语汇单元都表示一个独立的单词,图2展示了用Lucene 中的StandardAnalyzer类分析该短语所产生的语汇单元。
由图1可知,当文本被语汇单元化了之后,相对于前一个语汇单元的位置信息将以位置增量值保存,一般来说,位置增量默认为1。如果位置增量大于1,则允许语汇单元之间有空隙,可以利用这个空隙来表示被删除的单词,由于“are”这个单词是个停用词,分词时被过滤掉了,所以“How”和“you”之间的位置增量变成了2。位置增量为0的语汇单元则表示将该语汇单元放置在前一个语汇单元的位置上。同义词分词器可以通过0位置增量来表示插入的同义词,这个做法使得Lucene在进行短语查询时,输入任何一个同义词,都能匹配到相同的结果。该文设计的自定义同义词分词器就应用到了0位置增量的原理。
2 基于复杂形式最大匹配算法的自定义分词器的设计
根据Lucene的分词原理,该文设计了一个基于复杂形式最大匹配算法的自定义分词器,在有效提高Lucene对中文信息处理能力的同时,用户还可以根据开发需要添加用户自定义词库、根据分词结果自定义同义词和停用词集来扩展该分词器的性能,从而能够更加方便地检索出自己想要搜索的内容。
其中最大长度的词组是第三个,因此,第三个词组的第一个单词_C1C2_被我们认为是正确的,我们接受这个词,然后从汉字C3开始,重复上述步骤,直到字符串的最后一个词被识别。该文提出的复杂最大匹配算法的“消除歧义规则”有四项,依次使用这四项规则对分词结果进行过滤,直到只有一种结果或者这四项规则使用完毕为止。这四项规则分别是:1) 最大匹配,2) 最大平均单词长度,3) 单词长度最小方差,4) 单字单词语素自由度的最大和。
规则1:最大匹配最大匹配规则选择具有最大长度的三词词组的第一个词作为正确的分词结果,如果经过规则1过滤后,有多于一个的词组具有最大长度,则采用下一个规则。
规则2:最大平均单词长度,在每一个字符串的结尾,很可能得到只有一个或两个单词的词组,例如:下面的词组拥有相等的长度且单词长度的方差也相等。1) _C1_ _C2_ 2) _C1C2_。
规则2以最大平均单词长度(平均词长=词组总字数/词语数量)从词组中取得第一个单词,因此在上面的例子中,我们选择第二个词组中的_C1C2_作为正确的分词结果。规则2是基于相对于单字的单词我们更容易遇到多字的单词这个事实来进行假设的,而且这个规则是只有在三词词组中的一个或两个单词位置为空时才适用,因为当词组是一个真正的三词词组时,相同长度的三词词组当然具有相同的平均词长,这个规则就不适用了,于是要采用规则3。
规则3:单词长度最小方差,规则3是取拥有单词长度最小方差的词组的第一个单词作为正确分词结果的。这个规则是建立在“我们通常认为,单词的长度是均匀分布的”这个假设之上的。
规则4:单字单词语素自由度的最大和,规则4将计算词组中所包含的所有单字单词的语素自由度,然后将得到的值相加,取总和最大的词组的第一个单词作为正确的分词结果。
由于这两个词组拥有相同的词长、方差和平均单词长度,而它们分别有“是”和“主”这两个单字单词,假设“是”作为单字单词时候的使用频率是10,“主”作为单字单词时候的使用频率是5,对10和5分别取自然对数以得到它们各自的语素自由度,然后取其最大值者,所以选择“是”字所在词组的第一个单词,即“主要”作为正确的分词。因为很少有两个汉字会拥有完全相同的使用频率值,而一个高频率使用的汉字更可能是一个单字单词,所以在应用这个规则之后应该就没有歧义性了。
2.1 词典配置模块
本文设计的MMSeg_Complex分词算法的词典配置采用的是IK2012分词器自带的主词典,它拥有27万左右的汉语单词量,另外,该文采用“双数组trie树”的词典结构来存储该词典,同时还支持用户添加自定义词库。词典的第二部份由13060个汉字以及它们的使用频率组成,汉字的使用频率会在最后一个消除歧义规则中使用。其中,中文分词的处理,以UTF-8编码为主,以减少编码的复杂性。在MMSeg_Complex算法中,取得所有的“三词词组(chunk)”是比较复杂的部分,在这里,出于性能考虑,该文采用“三层for循环”来实现所有“三词词组”的获取。
3 实验测试结果及分析
根据前文所述的中文分词器设计方案,可以很方便地将该分词器集成到Lucene中去,不妨将其命名为MySame_MyStopAnalyzer。在这里,分别对三个分词器StandardAnalyzer、SimpleAnalyzer,MySame_MyStopAnalyzer的分词性能来进行测试。实验环境为Microsoft Windows XP Professional 版本2002 Service Pack 3 操作系统,Pentium(R)4 CPU 2.93GHz 处理器,2 GB内存。一般来说,分词系统的评价准则主要有以下几个方面[5]:1)分词准确性;2)分词速度;3)功能完备性——自动分词方法除了要完成分词的功能外,还应具备词库增删、修改等的功能。
3.1 分词准确性和分词速度比较
采用一篇由1152个单词组成的语料样本来对各分词器的算法性能进行测试,其分词结果如表1所示。
其中,SimpleAnalyzer使用的是简单形式的最大匹配算法,不出意料的,就算是简单最大匹配算法,也能正确识别出样本中90%以上的单词,而这也被作为评估分词算法的一个基准。由于MySame_MyStopAnalyzer使用的是包含了四条歧义解析规则的复杂形式最大匹配算法,所以能正确识别出样本中近93%的单词,这个算法的分词准确性要明显优于简单匹配算法。
3.2 分词器功能完备性测试
接下来,该文要对MySame_MyStopAnalyzer功能的完备性进行测试,它包括用户自定义词库的更新,自定义同义词和停用词功能的实现。首先,输入一个包含有未登录词的测试字符串——“周黑鸭,安世亚太科技股份有限公司,郭敬明,雪乡”。测试结果如表2所示。
4 结束语
本文针对Lucene中文分词模块的薄弱性,设计并实现了一个基于复杂形式最大匹配算法的自定义分词器。这种全新的中文分词器,有效地改善了Lucene自身在中文分词能力上的不足。当然,该分词器的分词算法采用的仍是传统的机械分词,其分词的准确性和分词速度还有待进一步的提高。今后的工作可以分为以下两点来进行:1. 在机械分词的基础上,结合语义本体或基于统计的分词方法,通过收集更多专业权威的文档去充实语料库、更新词典库,以进一步地提高分词算法在歧义消除和未登录词识别方面的处理能力;2. 通过改进词典的存储效率,以进一步地提高分词算法的分词速度,使得Lucene处理中文信息的能力更加地高效和智能化。
参考文献:
[1] 罗宁,徐俊刚,郭洪韬.基于Lucene的中文分词模块的设计和实现[J].电子技术设计与应用,2013(1):54-56.
[2] 朱世猛.中文分词算法的研究与实现[D].成都:电子科技大学,2010.
[3] (美)Michael McCandless,Erik Hatcher,Otis Gospodnetic. Lucene in Action[M].北京:人民邮电出社,2011.
[4] Tsai Chih-Hao. MMSEG: A Word Identification System for Mandarin Chinese Text Based on Two Variants of the Maximum Matching Algorithm[EB/OL]. (2000-03-12). http://technology. chtsai.org/mmseg.
[5] 刘件,魏程.中文分词算法研究[J].微计算机应用,2008,29(8):11-16.
[6] 彭焕峰.基于Lucene 的中文分词器的设计与实现[J].微型机与应用,2011,30(18):62-64.
[7] 郎小伟,王申康.基于Lucene的全文检索研究与开发[J].计算机工程,2006,32(4):94-96.
[8] 义天鹏,陈启安.基于Lucene的中文分析器分词性能比较研究[J].计算机工程,2012,38(22):279-282.
[9] 索红光,孙鑫.针对中文检索的Lucene改进策略[J].计算机应用与软件,2009,26(6):175-177.