当前位置:文档之家› 一种基于LUCENE的中文分词算法研究

一种基于LUCENE的中文分词算法研究

第24@第3期 青岛大学学报(自然科学版) 2 0 1 1年8月 JOURNAL OF QINGDAO UNIVERSITY(Natural Science Edition) Vo1.24 NO.3 Aug.2 0 1 1 

文章编号:1006—1037(2011)03—0053—06 doi:10.3969/j.issn.1006—1037.2011.08.012 

一种基于LUCENE的中文分词算法研究 

戴 洪,蒋 静,樊 程,于雪丽 

(青岛大学信息工程学院,山东青岛266071) 

摘 要:由于Lucene自带的ChineseAnalyzer和CJKAnalyzer两种中文分析器不能够满 

足全文检索系统的应用,本文给出了一种新的中文分词算法,用于改进Lucene中文分析 器。该算法基于字符串匹配原理,实现了正向和逆向相结合的最大增字匹配分词算法。 

通过实验仿真,比较改进后的分析器与Lucene自带的两种分析器在分词效果和效率上的 

差异。结果显示,改进后的分析器分词效果明显优于Lucene自带的两种分析器,提高了 全文检索系统的中文处理能力,系统的查全率和查准率都达到用户的需求。 

关键词:全文检索;Lucene;中文分词 中图分类号:TP391 文献标志码:A 

全文检索是以各种计算机数据诸如文字、声音、图像等为处理对象,提供按照数据资料的内容而不是外 

在特征来实现的信息检索手段 。Lucene作为实现全文检索的组件之一,虽然已经被广泛地应用,但是国 内对Lucene的研究和应用多数是将Lucene直接应用到全文检索系统中 ,Luncene自带的语言分析器只 

能对汉字进行单字切分和双字切分,不能很好的对中文信息进行处理。本文针对Luncene的这一不足进行 

了改进,提出了一个新的中文分词算法,用以构建高效的中文分析器。改进后的分析器提高了中文信息处理 

能力。 

1相关技术研究 

I ucene是一个免费开放源码的全文检索引擎工具包l3 ],来源于Apache下Jakarta项目组开发的JA— 

VA API接口。它不是一个完整的全文检索引擎,而是一个面向全文检索的引擎架构,要开发基于Lucene 

的全文检索系统,需要在其基础上进行二次开发 ]。Lucene主要提供了索引引擎、检索引擎和存储管理接 口等模块。它为开发人员提供了一个简单易用的全文检索类包,可以方便地嵌入到各种应用中以实现全文 

检索功能。 

1.1 LUCENE系统架构 Lucene系统架构有着明显的面向对象特点,它将系统核心功能部分设计为抽象类,具体的实现部分设 

计为抽象类的实现,设计一种与平台无关的索引格式类,与平台相关操作也设计为抽象类,通过层层面向对 象设计,使Lucene成为一个高内聚、低耦合、容易进行二次开发的检索引擎。Lucene系统架构主要由基本 封装结构、索引核心和外部接口三部分组成,其中索引核心是Lucene架构的关键部分。Lucene系统架构如 

图1所示(org.apache.Lucene简写为Lucene)。 通过图1Lucene系统架构可见,Lucene系统结构清晰,每个包分工明确,用来完成特定的功能。每个功 

能模块都设计为抽象类,便于维护和扩展[6]。 

*收稿日期:2Ol1-07 23 基金项目:国家支撑计划项目(2006BA111B07) 作者简介:戴洪(1988),男,硕士研究生,主要研究方向:分布式计算。

 54 青岛大学学报(自然科学版) 第24卷 

图1 Lucene系统架构 

1.2 LUCENE索引结构 

Lucene采用倒排索引结构,即以词作为索引基本单位,通过词来建立词一文档映射关系。根据这种索 

引结构,使得Lucene在进行检索时,是通过词来查找文档,而不是通过文档来查找词。 

在Lucene的索引结构中,由项(Term)指向域(Field),由域(Field)指向文档(Document),由文档(Docu— 

ment)指向段(Segment) ]。Lucene的索引结构如图2所示。 

图2 Lucene索引结构图 

1.3 LUCENE中文分词算法 

Lucene有其自己的中文分析器,其中主要是chineseAnalyzer和CJKAnalyzer两个中文分析器。Chi— 

neseAnalyzer分析器采用单字分词法,而CJKAnalyzer分析器采用二分法。这两种分词法的具体分词方式 

如下: 

(1)单字分词法 

单字分词法是以单个字作为单元进行切分,把文本的每一个字切分出来,然后按照这种方式来建立索 第3期 戴洪,等:一种基于LUCENE的中文分词算法研究 55 

引。例如“中华人民共和国”使用单字分词法进行分词时,切分出来的词为:“中”、“华”、“人”、“民”、“共”、 

“和”、“国”。可见,单字分词法实现比较简单,但切分出来的词没有意义,丧失了文本原有的语义。 

(2)二分法 二分法以两个字作为一个单元进行切分,把文本中相邻两个字切分出来,然后按照这种方式建立索引。 

例如“中华人民共和国”使用二分法进行分词,切分出来的词为:“中华”、“华人”、“人民”、“民共”、“共和”、“和 

国”。与单字分词法相比,虽然二分法在处理字词位置方面要好,但这种方法切分出很多无用词条,从而产生 

索引冗余。 

综上所述,LUCENE自带的两种中文分析器,对于中文分词效果并不明显,不能满足系统对中文的分词 

要求。 

2 改进的中文分词算法研究 

现有分词算法大体可分为三类:基于字符串匹配的分词方法,基于理解的分词方法和基于统计的分词方 

法口]。本文采用基于字符串匹配的分词算法来改进Lucene中文分词器。基于字符串匹配的分词方法是按 

照一定策略,将待分析的中文与机器词典进行匹配,若在词典中找到某个字符串,则匹配成功。与单字分词 

和二分法分词相比,使用词典进行分词准确性更高。 

2.1字符串匹配分词模型 

中文分词算法最常用的是基于字符串匹配方法,对于字符串匹配分词,可以建立一个分词模型ASM 

(Automatic Segmentation Mode1),该模型可表示为ASM(d,a,m)。其中d:匹配方向,+1表示正向,一1表 

示逆向;a:每次匹配失败后增加/减少字串长度(字符数),+1为增字,一1为减字;m:最大/最小匹配标志, 

+1为最大匹配,一1为最小匹配L8]。 

用该模型对各种方法的复杂度进行比较后得出,减字匹配ASM(d,一,m)的复杂度是12.3,高于增字匹 

配ASM(d,+,m)的复杂度10.6_8]。因此本文采用正向最大增字匹配ASM(+,+,+)和逆向最大增字匹 

配AsM(一,+,4-)相结合的双向最大增字匹配算法。 

正向最大增字匹配分词算法实现需要一个词典,在分词过程中,算法对文本从左到右进行扫描,将文本 

中的字符串和词典中的词条进行匹配,当前匹配字段从一个字开始,匹配中不断增字,直到匹配不下去为止; 

而结束每一轮匹配的最终结果,则取匹配成功的最大的当前匹配字段;这也就是被切分出来的词 ]。例如: 

“我是中华人民共和国公民”,词典中有“中华人民共和国”、“中华”、“人民”、“共和国”、“公民”等词。从“中” 

字开始,向后依次扫描,分别取“中”、“中华”、“中华人”、“中华人民”、“中华人民共”、“中华人民共和”、“中华 

人民共和国”、“中华人民共和国公”进行匹配,词典中最长的匹配字符串是“中华人民共和国”,那么该词被切 

分出来。接着从“公”字开始扫描,重复上述操作。 

正向最大增字匹配算法分词原则是“长词优先”,这样可以保证切词的精确性,但仍然可能切出和原字符 

串语义不同的词,我们称它为歧义词。例如:“提高成功的确定性”字符串在采用正向最大匹配算法分词时, 

“提高”和词典中相应词匹配成功,被切分成一个词,同理“成功”被切分成一个词,“的确”被切分出来…..,最 

后切分结果为“提高/成功/的确/定性”。可见,切分出的“的确”,“定性”属于歧义词,丢失了原字符串的语 

义。 

分析可知,产生这种问题是因为正向最大增字匹配算法扫描的方向是自左向右。为了确保在切分过程 

中,不丢失原字符串语义,本文给出正向最大增字匹配和逆向最大增字匹配相结合的算法,我们把它称作双 

向最大增字匹配算法。 

逆向最大增字匹配算法的分词过程与正向最大增字匹配算法基本相同。不同的是从字符串的末尾开始 

扫描,每次匹配不成功时去掉前面的一个字,直至匹配成功为止。

 56 青岛大学学报(自然科学版) 第24卷 

2.2改进的中文分词算法 

双向最大增字匹配算法的基本思想是:在进行中文分词时,将待处理的字符串先进行一次正向最大增字 

匹配算法处理,再进行一次逆向最大增字匹配算法处理,两次所切 

分出的词即为最终结果。 

假设对s===C CzC。C ……c 进行双向最大增字匹配分词,其 

算法过程描述如下: 

(1)首先取出s中的第一个字c ,在词典中匹配查找是否存 

在以C 为前缀的词,如果有,保存为成词标记; 

(2)再从s中取出一个字c2,和词典进行匹配,判断是否存在 

以C1C2为前缀的词; 

(3)如果不存在,则将C1从字串S中切分出来,一次分词结 

束; 

(4)如果存在,则再判断一下C1C2是否成词,计算以C1C2为 

前缀的词的个数n; 

(5)如果n一0,则一次分词结束; 

(6)如果n不为0,则再从s中取出一个字Ci,和词典进行匹 N 

配,判断是否存在以C1C2……ci为前缀的词; 

(7)如果存在,则转到(6); 

(8)如果不存在,则将C1C2……Ci一1从字串S中切分出来, 

一次分词结束; (9)从字串s的字ci开始继续进行分词,重复上述步骤,直到 

字串s正向切分结束; 

(10)首先取出S中的最后一个字Cn,在词典中匹配查找是否 

存在以Cn为后缀的词,如果有,保存为成词标记; 

(11)再从S中取出一个字Cn一1,和词典进行匹配判断是否 

存在以Cn一1Cn为后缀的词; (12)如果不存在,则将Cn从字串s中切分出来,一次分词结 

束; (13)如果存在,则再判断一下Cn一1Cn是否成词,计算以Cn 

1Cn为后缀的词的个数n; 

(14)如果n一0,则一次分词结束; 

(15)如果n不为0,则再从S中取出一个字Ci,和词典进行匹 

配判断是否存在以CI..…・Cn一1Cn为后缀的词; 

(16)如果存在,则转到(15); 

(17)如果不存在,则将Ci+1……Cn一1Cn从字串s中切分 

出来,一次分词结束; 

(18)从字串S的字Ci开始继续进行分词,重复上述步骤,直 

到字串s逆向切分结束。双向最大增字匹配算法分词的具体流程 

如图3所示。 例如:“提高成功的确定性”字符串在第一次正向扫描时,切分 

图3双向最大增字匹配算法流程图

相关主题