lucene的几个语言分析器和对中文的反应

 
Lucene是一个全文索引引擎,lucene的工作过程是首先对一个数据源(如数据库,文档等)用语言分析器分析分析出索引单元(token),然后将索引单元用UTF-8编码写入文件。在搜索时候,查找已经建立好的索引文件,从而找出结果。(参见车东的《在应用中加入全文检索功能——基于Java的全文索引引擎Lucene简介》一文,下简称《车文》)
所以在lucene中,建立索引是关键,这方面lucene有一套机制。对于lucene中文应用而言,问题的实质是如何分析出索引单元。就lucene目前的机制,只有采用自动切分的方法分析出索引单元。自动切分的方法不涉及内容,是按书写格式进行的,英文书写用空格或标点符号对单词做了分隔,实现起来比较容易。而中文书写的格式是汉字连续排列,用标点符号做分隔,实现自动切分一般是以一段文字或着一个汉字,还有就是采用覆盖迭代算法来完成。
lucene1.2中带有两个英文语言分析器SimpleAnalyzer(简单的英语语言分析器)和StandardAnalyzer(标准的英语语言分析器),因为java内使用unicode编码,所以这两个分析器是针对unicode进行处理的,因此对中文还是做了处理的。但是,由于中文的特殊之处(或者说与英文的不同之处),虽然可以使用这两个语言分析器,但还是存在问题的。下面是两个分析器对中英文分析的索引结果:

英文例句:This is a test program.
中文例句:月落乌啼霜满天,江枫渔火对愁眠。姑苏城外寒山寺,夜半钟声到客船。
特殊例句:aaa@sina.com

1.SimpleAnalyzer:将英文转换为小写字母,按空格和标点符号切分出英文单词,然后建立索引单元。
英文例句分析结果:
token1=this
token2=is
token3=a
token4=test
token5=program
中文书写格式没有空格,所以对中文按标点符号切分,得到一段中文字符做为索引单元。
中文例句分析结果:
Token1=月落乌啼霜满天
Token2=江枫渔火对愁眠
Token3=姑苏城外寒山寺
Token4=夜半钟声到客船
Email地址分析为:
token1=aaa
token2=sina
token3=com

2.StandardAnalyzer:对英文进行了较为复杂的处理,除了按单词建立索引单元,还能够为Email地址,特殊公司名字(如AT&T),主机名字,缩写格式(如U.S.A)等建立索引单元。对“and","this"等单词做了过滤。
英文例句分析结果:
token1=test
token2=program
StandardAnalyzer也是对中文按标点符号切分,用一段中文字符做为索引单元。
中文例句分析结果:
Token1=月落乌啼霜满天
Token2=江枫渔火对愁眠
Token3=姑苏城外寒山寺
Token4=夜半钟声到客船
Email地址分析为:
token1=aaa@sina.com

3.汉化版的中文语言分析器ChineseAnalyzer其英文分析出的结果如同SimpleAnalyzer,但是对“and","this"等单词做了过滤,可是没有对Email地址等做分析,中文分析用单个汉字做索引单元。
英文例句分析结果:
token1=test
token2=program
中文例句分析结果:
token1=月
token2=落
......
token28=船
Email地址分析为:
token1=aaa
token2=sina
token3=com

4.《车文》中介绍了他的工作,其中有实现覆盖迭代算法的分析器代码,用这个分析器得到这样的结果:
英文例句分析结果:
token1=this
token2=is
token3=a
token4=test
token5=program
中文例句分析结果:
token1=月落
token2=落乌
......
token23=到客
token24=客船
Email地址分析为:
token1=aaa
token2=sina
token3=com

5.lucene-1.2-src中带有StandardTokenizer.jj,修改这个文件,用JavaCC重新编译,可以制作出新的中文语言分析器。《车文》中制作了一个中日韩文字的亚洲语言的StandardTokenizer.jj,它对例句做出的结果:
英文例句分析结果:
token1=test
token2=program
中文例句分析结果:
token1=月
token2=落
......
token28=船
Email地址分析为:
token1=aaa@sina.com

对比上面几种语言分析器的分析结果,可以看出,英文以StandardAnalyzer做出的结果为好,包括修改StandardTokenizer.jj得到的分析器。而对于中文,做出一段汉字索引单元的分析器是几乎无法使用的。你要背不下中文例句中的一句,你就不能搜索到结果,更何况要搜索没有阅读过的资料,谁又能够知道作者文章中的整段的文字是什么呢?对单个汉字作为索引单元的分析器是可以使用的,lucene查询分析器中有一个PhraseSlop参数可以控制查询的匹配,当值为0时,lucene做精确匹配,可以得到很好的结果。当值大于2时,是一种“或”关系地搜索,如“上海”找出“海上”。采用覆盖迭代算法的分析器做出的结果使得汉字之间建立了连系,中文中单个汉字往往不作为一个词,多个字组合在一起才具有较为确定的词意,这样搜索出的结果比较符合中文的语言习惯,覆盖叠代算法的问题是存储容量增加了,另外不能搜索单个字。
通过搜索测试(不严格),感觉用5做出的分析器效果最好。其即英文能处理的细致一点,占用资源不多,中文搜索结果也能令人满意。笔者用lucene-1.2-src的源码制做了两个语言分析器,其英文实现
StandardAnalyzer的功能,中文分别为单个汉字为索引单元和覆盖叠代算法做出的索引单元(均没有对日、韩文字进行处理)。因环境所致,没有严格测试。

- 作者: wuxh 2004年09月5日,星期日 10:10:48

posted @ 2004-12-16 13:17  wuxh  阅读(1322)  评论(0)    收藏  举报