基于Lucene的中文文本分词

王继明,杨国林

(内蒙古工业大学信息工程学院,呼和浩特010051)

摘要:中文文本分词技术是文本挖掘领域的一个重要分支,在中国仍然处于发展阶段.Apache Jakarta的开源工程Lucene是一个十分优秀的基于Java语言的文本检索工具包,在国外已经得到广泛的应用.但是Lucene对中文分词功能的支持不太理想,Lucene加入好的中文分词功能对Lucene在国内的发展和应用将会起到很大的推动作用.

CHINESE AUTOMATIC WORD-CUT BASE ON LUCENE

WANG Ji-ming,YING Guo-lin

(Inner Mongolia University of Technology,Hohhot010051,China)

Abstract:Chinese Automatic Word-cut technology is an important branch of Text Mining.It is still in the phases of evolution.Lucene is one of the open source project in Apache Jakarta.It is a very excellent text Retrieval toolkit base on Java and applied widely into many areas in many foreign countries.But Lucene do not support Chinese Automatic Word-cut effectively,implementing Lucene with the function of Chinese Automatic Word-cut will drive the application and improvement of Lucene in China.

0 引言

伴随着文本挖掘技术的发展,文本分词技术作为文本挖掘技术的一个重要研究分支,也得到了迅速的发展.文本分词技术为大多数文本挖掘技术(如文本分类技术,文本聚类技术等)提供文本预处理工作,分词效果的好坏会直接影响到后续的处理过程,因此文本分词技术是文本挖掘过程中的一个关键环节.目前,文本挖掘领域的一项重要成果Apache Jakarta的开源工程Lucene(一种基于JAVA语言的文本检索工具包)已经得到了广泛的应用和发展.国际上很多的大公司都以Lucene作为开发平台,例如目前搜索引擎业的巨头Google公司也在其系统中引入了Lucene平台,并在其基础上进行深入的开发.Lucene在国内近些年也得到了广泛的应用,但是由于其支持的中文文本分词仅限于单字区分和CJK两种方式,不能满足大多数中文文本挖掘技术的需求,所以在一定程度上限制了它在中国的应用和开发.目前,基于Lucene的中文分词包非常少而且分词效果大多不理想,因此给Lucene加入中文分词的功能,对于Lucene在中国的广泛应用和发展将会起到很大的推动作用.

1 文本分词

文本分词技术就是利用特定的算法把文档中的内容以词为单位进行划分.分词处理包括英文单词和中文单词的分词处理,两者的处理方式有很大的不同.这是因为英文单词之间有空格作为词与词的分界符,但是中文单词则没有明确的分界符来隔开中文中的词语,下面主要对中文分词的原理和算法进行详细的阐述.

1.1 中文分词的研究方向

中文分词相对英文文本的分词处理要复杂得多,目前中文单词的分词处理在业界还没有形成统一的标准,但是也有很多有效的方法可以进行文本的分词处理.比较重要的方法如下:

1.1.1 词典分词法.又称机械切分法.词典分词法主要有最大匹配法(MM)、逆向最大匹配法(RMMOMMIMM)、逐词匹配法、部件词典法、词频统计法、设立标志法、并行分词法、词库划分和联想匹配法等.

1.1.2 语义分词法.语义分词法引入了语义分析,对自然语言自身的语言信息进行更多的处理,如扩充转移网络法、知识分词语义分析法、邻接约束法、综合匹配法、后缀分词法、特征词库法、约束矩阵法和语法分析法等.

1.1.3 人工智能法.又称理解分词法.人工智能是对信息进行智能化处理的.一种模式,主要有两种处理方式:一种是基于心理学的符号处理方法,模拟人脑的功能即专家系统.通过构造推理网络,符号转换,从而可以进行解释性处理.一种是基于生理学的模拟方法.神经网络旨在模拟人脑的神经系统机构的运作机制来实现一定的功能.以上两种思路也是近年来人工智能领域研究的热点问题,应用到分词方法上,产生了专家系统分词法和神经网络分词法.

1.2 词典分词法

目前国内最流行的分词算法是词典分词法,因为其算法实现简单,分词效果目前要优于其他算法.基于词典的自动分词主要步骤包括分词词典的建立,分词算法的选择及岐义字段处理.在我们基于Lucene的应用系统中选用机械分词算法中的最大匹配算法(MM)作为Lucene中文分词的核心算法.最大匹配算法的实现过程如下:

1.2.1 分词词典的选择.分词词典主要包括两部分内容:一个是词典的内容,即以词语为单位的有序表,另一个是词典的组织形式,它对分词系统的速度有很大的影响.词典构造的好坏对分词系统的分词效果和速度有很大的影响.

1.2.2 分词算法的实现.基于词典的分词方法的思路是先查找字典进行字串匹配,然后再适当地利用部分词法规则进行歧义校正.具体过程为:初始化系统的分词词典,确定词典的最大匹配长度,匹配长度的选取可以根据词典中最长词串来定义;把待分词文本按中文的字为单位导入系统的数据结构中.假设对C1C2C3C4进行分词处理,算法描述如下:

1)取一字符C1在词典中查找C1并保存是否成词标记;

2)再取一字C2判断词典中是否有以C1C2为前缀的词;

3)不存在,C1为单字,一次分词结束;

4)存在,判断C1C2是否为词,并取以C1C2为首的多字词的个数n;

5)n=0,则一次分词结束;

6)否则再取一字Ci判断词典中是否有以C1C2Ci为前缀的词;

7)若不存在,则返回最近一次能够成词的C1C2Ci-1:

8)否则转6);

9)保存当前C1C2Ci,根据匹配信息判断是否有成词的前缀;

10)没有,14);

11)有则匹配该词条并去除前缀后的子串,判断是否成词;

12)不成词则转14);

13)成词则标记为组合歧义字段;

14)从词尾Ci开始进行下一次分词;

上述算法采用的是正向最大匹配分词算法.在系统的实际应用中得到了很好的分词效果.

2 基于Lucene的中文文本分词

Lucene是一个成熟的Apache Jakarta开源项目,它是具有高效性和可扩展性的全文索引引擎工具包.LuceneJava语言编写,可以方便地嵌入到各种应用中,以实现针对应用的全文索引/检索功能.

2.1 Lucene功能介绍

Lucene的设计目标是对多种类型文档提供索引和检索功能,Lucene的组成模块如表1所示.

Lucene的工作原理是首先对待索引和检索的文档进行分词处理,然后在经过分词处理后的文本上建立索引,为以后的检索过程提供能够进行快速检索的索引结构.由此可见文本分词技术在Lucene中起着及其重要的作用,如果不能为Lucene加入好的中文分词功能,就不能对中文文本建立有效的索引以及进行有效的检索.Lucene加入中文分词功能,首先要对负责分词的模块进行扩展,Lucene中的Analysis包专门用于完成文件索引前的分词工作.因此在加入中文分词功能前,必须对Analysis包的代码及其实现的功能进行分析.Analysis包中最基础的类为Token,Token流是分词阶段(analysisprocess)最基础的输出流,英文中可以是一系列的单词组成的流,每一个单词就是一个Token.Token除了记录单词本身的值外,还记录了单词在原文本流中的起点、终点以及位置增量.在索引阶段要把每一个Token转换为一个term(Lucene索引结构的最小单位,可以是词也可以是字).


Analysis包中主要包括AnalyzerTokenStreamTokenizerTokenFilter四个抽象类.他们各自的功能如下:

(1)Analyzer是一个抽象的基类,代码十分简洁.它的作用是把输入的文本(Reader)转换为Tokens.

(2)TokenStream是一个抽象的基类,它是一系列Token的集合.

(3)Tokenizer继承自TokenStream,它的输入是Reader.

(4)TokenFilter继承自TokenStream,它的输入是其他类型的Token.在这些类的基础上Lucene扩展了它们的功能,实现了复杂的英文分词功能.比如在Analyzer的基础上扩展了SimpleAnalyzer,Tokenizer的基础上扩展了LowerCaseTokenizer.

2.2 Lucene中文分词算法实现

Lucene中加入中文分词功能,主要就是在Lucene的四个抽象基类的基础上进行功能扩展.下面以SimpleAnalyzer为例看一下它的代码:

public final class SimpleAnalyzer extends Analyzer {

public TokenStream tokenStream(String fieldName, Reader reader) {

return new LowerCaseTokenizer(reader);

}

}

通过这段代码可以看出SimpleAnalyzer的代码十分简单,它的作用是返回一个LowerCaseTokenizer类型的Token.Lucene加入中文分词功能可以仿照该过程加入自己的分词词典和算法,最后再把其包装成LuceneTokenStream.实现步骤如下:

1)选择分词词典和停用词词典或者根据需要添加一些高频词词典等.

(2)编写分词算法,MM(最大匹配法)、逐词匹配法等.

(3)通过继承Tokenizer类定义自己的MyTokenizer,其目的是把已经经过分词的文本流转换为TokenStream.

(4)通过继承Analyzer定义自己的MyAnalyzer,在类中实现以下方法:初始化词典、调用分词算法、转化文本流为TokenStream(通过引用MyTokenizer的一个实例实现),其目的是返回TokenStream.

在实现中我们采用了知网的分词词典和复旦大学免费提供的停用词词典;算法是经过改进和加工过的MM(最大匹配法),它可以实现中英文的混和分词.

3 结论

Lucene平台在国际上已经得到了广泛的应用,给其加入具有良好分词效果的中文分词功能,对于推进其在国内的广泛应用和发展会起到很大的推动作用.本文实现的正向最大匹配算法经过测试具有良好的分词效果.该算法完善了中英文噪声词典、支持英文、数字、中文(简体)混合分词、常用的数量及人名的匹配.Lucene中加入本文实验得出的中文分词包,实现了良好的中文分词功能.因此,加入中文分词包后的Lucene平台在国内具有良好的推广和应用价值.

参考文献:

[1] 张春霞,郝天永.汉语自动分词的研究现状与困难[J].系统仿真学报,2005,17(1):139~140.

[2] 王伟,钟义信,孙健等.一种基于EM非监督训练的自组织分词歧义解决方案[J].中文信息学报,2001,15(2):38~44.

[3] 黄德根,朱和合,杨元生.基于单词与双词可信度的汉语自动分词[J].计算机研究与发展,2001,增刊:132~135.

[4] 胡俊华,杨波,李金屏.自然语言理解研究略述[J].济南大学学报,2001,(5):58~62.

[5] 曹倩,丁艳,王超等.汉语自动分词研究及其在信息检索中的应用[J].计算机应用研究,2004,(5):71~73.

[6] Gospodnetic O,Hatcher E.Lucene in Action [M].Manning Publications Co.2005.1~182.

[7] Sparck Jones,Karen.Information Retrieval and Artificial Intelligence [R].Artificial Intelligence Volume:114, Issue:12, October,1999.257~281.

[8] Yuan-Yuan Wang,Zhong-Shi He.New Aproach to Chinese Person Names Recognition Based on Part-of-SpeechDetecting [R].In The Proceedings of 2004 International Conference on Machine Learning and Cybernetics.August 26~29.2004.969~972.

[9] Jakarta Lucene Home Page.http://Joakarta.apache.org/lucene/.

[10] Brian Goetz. The Lucene Search Engine Powerful Flexible and Free: JavaWorld [EB/OL]. http://www. javaworld.com/javaworld/jw-09-2000/jw-0915-lucene p.html.2000-09.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值