周拴龙
(郑州大学 信息管理系 河南 郑州 450001)
Lucene.net中文分词算法分析
周拴龙
(郑州大学 信息管理系 河南 郑州 450001)
Lucene.net实现中文分词依靠的是Analyzer类,但通过分析其内置的KeywordAnalyzer,StandardAnalyzer,StopAnalyzer,SimpleAnalyzer,WhitespaceAnalyzer 5个分词类发现,它们几乎都是按单字的标准进行切分的,为更好处理中文信息,必须引用外部独立开发的中文分词包.在对ChineseAnalyzer,CJKAnalyzer和 IKAnalyzer这3种典型的中文分词包分别测试后,发现采用字典分词以及正反双向搜索方法的IKAnalyzer分词器的分词效果更胜一筹.
Lucene; 中文分词; Analyzer类
从发展历史角度看,Lucene是Apache软件基金会Jakarta项目组的一个子项目,是一个开放源代码的全文搜索引擎工具包.Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便地在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文搜索引擎[1].
到目前为止,Lucene的C#移植有3个版本,最开始是NLucene,然后是Lucene.net,当Lucene.net转向商业化之后,SourceForge上又出现了DotLucene项目.它们都是Lucene全文搜索引擎库的 .net实现.所以3者在架构、内核等方面与Lucene是一脉相承的.综合性能比较,Lucene.net在3者里最为成熟、稳定,所以,本文选择了Lucene.net分析其中文分词算法的实现[2].
图1 Lucene 索引机制架构Fig.1 Index mechanism structure of Lucene
Lucene包括索引和搜索两大部分.
索引所做的工作是为各种各样的文档构建Lucene能识别的索引文件.具体讲,第1步,Lucene 使用各种解析器对各种不同类型的文档进行解析.Lucene有多种文档解析器,如HTML解析器,PDF解析器,MS Word解析器,Text File解析器等等.Lucene根据文档类型做出判断,将不同文档交由不同解析器处理,滤去种种不必要信息,最终输出纯文本内容.第2步, Lucene 的分词器—Analyzer从纯文本内容中提取出索引项以及相关信息,如索引项的出现频率等.第3步,由Analyzer把这些信息写到索引文件中[1].图1显示了 Lucene 索引机制的架构.
搜索所做的工作是从用户输入的关键字入手找出与之相匹配的文本并返还给用户.搜索不是本文要讨论的重点,因为Lucene默认对搜索关键词不分词,所以分词的工作就集中在了索引部分.
Lucene的索引中有5个基础类:
(1)Document—是用来描述要解析的文档的,这里的文档可以是HTML,PDF,Word或Text File等等类型.一个 Document 对象由多个 Field 对象组成.
(2)Field—是用来描述一个文档的某个属性的.Field有3个属性:是否存储,是否索引,是否分词.
(3)Analyzer—它负责在一个文档被索引之前,预先对文档内容进行分词处理,主要是提取词汇单元,并除掉无用的信息.Analyzer 类是一个抽象类,它有多个实现.针对不同的语言和应用需要选择适合的 Analyzer.Analyzer 把分词后的内容交给 IndexWriter 来建立索引.
(4)IndexWriter—“写入索引”.它的作用就是把一个个的 Document 对象加到索引中来.这是 Lucene 用来创建索引的一个核心类.
(5)Directory—标示Lucene 的索引的存储位置[2].
最初,Lucene的设计者只考虑了英文、德文两种西文格式的分词情形.众所周知,中文分词要走的是另外一条道路.
2.1中文分词技术的核心—分词算法
现有的中文分词算法可分为3大类:基于规则的分词方法、基于统计的分词方法和基于理解的分词方法.
(1)基于规则的分词方法
这种方法又叫做机械分词法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行匹配,若在词典中找到某个字符串,则匹配成功(识别出一个词).按照扫描方向的不同,串匹配分词方法可以分为正向(由左到右)匹配和逆向(由右到左)匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法.
常用的机械分词方法有以下3种:正向最大匹配法;逆向最大匹配法;最少切分匹配法.一般说来,逆向匹配的切分精度略高于正向匹配,遇到的歧义现象也较少.
(2)基于统计的分词方法
从形式上看,词是稳定的字的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词.因此字与字相邻共现的频率或概率能够较好地反映成词的可信度.可以对语料中相邻共现的各个字的组合的频度进行统计,计算它们的互现信息.具体操作起来,我们可以借鉴信息计量学的方法,定义两个字的互现信息,并最终计算两个汉字的相邻共现概率.互现信息体现了汉字之间结合关系的紧密程度.当紧密程度高于某一个阈值时,便可认为此字组可能构成了一个词.
这种方法有一定的局限性,会抽出一些共现频度高、但并不是词的常用字组,例如“这一”、“之一”、“有的”、“我的”、“许多的”等,并且对常用词的识别精度差,时空开销大.实际应用的统计分词系统都要使用一部基本的分词词典(常用词词典)进行串匹配分词,同时使用统计方法识别一些新的词,即将串频统计和串匹配结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点.
(3)基于理解的分词方法
这种分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果.其核心思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象.它通常包括3个部分:分词子系统、句法语义子系统、总控部分.在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,这种分词方法模拟了人对句子的理解过程,需要使用大量的语言知识和信息.由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此,目前基于理解的分词系统还处在试验阶段[3].
到底哪种分词算法的准确度更高,目前并无定论.但取得公认的是,对于任何一个成熟的分词系统来说,不可能单独依靠某一种算法来实现,都需要综合不同的算法.
2.2中文分词的难题
中文是一种十分复杂的语言,让计算机理解中文语言更是困难.在中文分词过程中,有2大难题一直没有完全突破.
(1)歧义识别
歧义是指同样的一句话,可能有两种或者更多的切分方法.例如:表面的,因为“表面”和“面的”都是词,那么这个短语就可以分成“表面/的”和“表/面的”.这种称为交叉歧义.由于没有人的知识去理解,计算机很难知道到底哪个方案正确.
交叉歧义相对组合歧义来说还是比较容易处理的,组合歧义就必需根据整个句子来判断了.例如,在句子“这个门把手坏了”中,“把手”是个词,但在句子“请把手拿开”中,“把手”就不是一个词.
如果交叉歧义和组合歧义计算机都能解决的话,在歧义中还有一个难题,是真歧义.真歧义意思是给出一句话,由人去判断也不知道哪个应该是词,哪个应该不是词.例如:“乒乓球拍卖完了”,可以切分成“乒乓/球拍/卖/完/了”、也可切分成“乒乓球/拍卖/完/了”,如果没有上下文其他的句子,恐怕谁也不知道“拍卖”在这里算不算一个词.
(2)新词识别
新词,专业的术语称为未登录词.也就是那些在词库中都没有收录过,但又确实能称为词的那些词.最典型的是人名,人可以很容易理解句子“王军虎去广州了”中,“王军”是个词,因为是一个人的名字,但要是让计算机去识别就困难了.如果把“王军虎”做为一个词收录到字典中去,全世界有那么多名字,而且每时每刻都有新增的人名,收录这些人名本身就是一项巨大的工程.即使这项工作可以完成,还是会存在问题,例如:在句子“王军虎头虎脑的”中,“王军虎”还能不能算词[4].
新词中除了人名以外,还有机构名、地名、产品名、商标名、简称、省略语等都是很难处理的问题,而且这些又正好是人们经常使用的词,因此对于搜索引擎来说,分词系统中的新词识别十分重要.
目前,在设计算法时,对于此类词的区分将会逆向考虑,不在词库的词排除常用字后即为专有名词,这也意味着要对常用“字”进行词性分类如“西”“姆”,按照现代汉语习惯,只会和其他字结合不单独出现,所以“马克西姆”是专有名词.而对于“在”、“和”、“了”之类的字可以单独出现.
3.1Lucene.net中文分词核心—Analyzer
Lucene.net中,分词是核心库之一,其内置在Lucene.net里的分词都被放在项目的Analysis目录下,也就是Lucene.net.Analysis命名空间下.
分词的类的命名一般都是以“Analyzer”结束,比如KeywordAnalyzer,StandardAnalyzer,StopAnalyzer,SimpleAnalyzer,WhitespaceAnalyzer等,全部继承自Analyzer类.而它们一般各有一个辅助类,一般以“Tokenizer”结尾,分词的逻辑大都在辅助类完成.
严格地讲,Analyzer应该被称作词法分析器 ,它是一个进行词法过滤和分析的类,实际上是个对分词器、过滤器进行综合包装的类.而真正执行分词动作的是辅助类Tokenizer,它们对文本进行分词,可能是单字、词、二元切分等等,是真正的分词器.
3.2比较Lucene.net的5个内置分词类
现在,对于KeywordAnalyzer,StandardAnalyzer,StopAnalyzer,SimpleAnalyzer,WhitespaceAnalyzer这5个内置的分词类做两个测试,以分析对比他们各自的分词效果.
首先,private static String TestString=“郑州大学信息管理系,I love my major.”做第一个测试,结果如下:
Lucene.net.Analysis.KeywordAnalyzer结果:
郑州大学信息管理系,I love my major.
Lucene.net.Analysis.StandardAnalyzer结果:
郑/州/大/学/信/息/管/理/系/I/love/ my/ major
Lucene.net.Analysis.SimpleAnalyzer结果:
郑州大学信息管理系/I/love/my/major
Lucene.net.Analysis.StopAnalyzer结果:
郑州大学信息管理系/I/love/my/major
Lucene.net.Analysis.WhitespaceAnalyzer结果:
郑州大学信息管理系,I /love/my/major.
接下来,换一句话来做第二个测试.更改Teststring值为“郑州大学信息管理系,I’m glad to see you.阿Q正传.”.测试结果如下:
Lucene.net.Analysis.KeywordAnalyzer结果:
郑州大学信息管理系,I’m glad to see you.阿Q正传.
Lucene.net.Analysis.Standard.StandardAnalyzer结果:
郑/州/大/学/信/息/管/理/系/I’m/glad/to/see/you/阿Q正传/
Lucene.net.Analysis.SimpleAnalyzer结果:
郑州大学信息管理系/I’m/glad/to/see/you/阿Q正传
Lucene.net.Analysis.StopAnalyzer结果:
郑州大学信息管理系/I’m/glad/to/see/you/阿Q正传
Lucene.net.Analysis.WhitespaceAnalyzer结果:
郑州大学信息管理系,I’m/glad/to/see/you.阿Q正传.
由此可以看出:KeywordAnalyzer分词,没有任何变化;StandardAnalyzer对英文和中文都单字拆分;SimpleAnalyzer和StopAnalyzer差不多,对英文按单字分开,而对中文则几无变化;WhitespaceAnalyzer只是按空格划分,不屏蔽标点符号.
以上这些是初步的结论,但可以确定的是,Lucene.net自带的分词类几乎都是按单字的标准进行切分的,这点在处理中文信息时是远远达不到应用要求的.
3.3更多的中文分词包
上文提到,中文分词可分为单字分词、二元分词、词库匹配、语义理解等几种,每一种方法,Lucene.net的程序爱好者们都尝试去研究,开发出许多达到应用级的分词包.
上面的测试是对Lucene.net内置的分词程序进行的测试,使用的是Lucene.net默认的单字分词.对于后3种中文分词方法,我们分别选择ChineseAnalyzer,CJKAnalyzer和 IKAnalyzer 3种典型的中文分词包进行测试.
private static String TestString = “原郑州大学创建于1956年,是新中国成立后国家创办的第一所综合性大学.”;
ChineseAnalyzer结果:
原/郑/州/大/学/创/建/于/1956/年/是/新/中/国/成/立/后/国/家/创/办/的/第/一/所/综/合/性/大/学
CJKAnalyzer结果:
原郑/郑州/大学/学创/创建/建于/于1956/1956年/年是/是新/新中/中国/国成/成立/立后/后国/国家/家创/创办/办的/的第/第一/一所/所综/综合/合性/性大/大学
IKAnalyzer结果:
郑州大学/郑州/大学/郑/大/创建/1956年/1956/年/新中国/中国/成立/国家/创办/第一所/第一/一/综合性大学/综合性/综合/大学/大
由此可见:
ChineseAnalyzer采用一元分词的方法,基本等同StandardAnalyzer;
CJKAnalyzer则是二元分词方法,交叉双字进行分割;
而IKAnalyzer则是字典分词方法,并采用正反双向搜索来提高分词效果.且从测试中可以看出:ChineseAnalyzer和CJKAnalyzer没有过滤常用的汉字,如“是”、“的”等,这些常用的汉字对搜索是没有多大作用的.KIAnalyzer则可以通过在词典中屏蔽掉这些常用字而提高分词和检索的效率.
[1] 赵峰.基于Lucene的全文检索系统初探[J].黑龙江科技信息,2007,12:62-64.
[2] 孙永波,郭红峰.天文文献全文检索系统的研究与实现[J].天文研究与技术,2007,4(3):296-300.
[3] 蔡建超,郭一平,王亮.基于Lucene.NET校园网搜索引擎的设计与实现[J].计算机技术与发展,2006,16(11):73-75.
[4] 赵汀,孟祥武.基于Lucene API 中文全文数据库的设计与实现[J].计算机工程与应用,2003,20:179-181.
AnalysisonChineseSegmentationAlgorithmofLucene.net
ZHOU Shuan-long
(DepartmentofInformationManagement,ZhengzhouUniversity,Zhengzhou450001,China)
The segment of Chinese word relies on the Class Analyzer.By analyzing the five built-in analyzers of Lucene.net, it was found that their segment were based on the single character of KeywordAnalyzer, StandardAnalyzer,StopAnalyzer,SimpleAnalyzer and WhitespaceAnalyzer.An improted segment kit for a better Chinese information disposal was added.By testing the three typical kits, ChineseAnalyzer,CJKAnalyzer and IKAnalyzer, it was found that IKAnalyzer which uses Dictionary participle and the positive and negative two-way search method, worked well.
Lucene; Chinese word segment; Class Analyzer
TP 391
A
1671-6841(2011)03-0073-05
2010-12-10
周拴龙(1964-),男,副教授,硕士,主要从事信息资源数字化、全文检索等方面的研究,E-mail:shuanlong@zzu.edu.cn.