罗惠峰,郭淑琴

(浙江工业大学 信息工程学院,浙江 杭州 310023)

摘 要: Lucene是一个高效的全文检索工具包,本文主要研究了Lucene的体系架构及其在中文检索上的应用。通过对基于最大匹配算法的中文分词器的设计与改进,并引入文本解析器与构建同义词词库引擎,使得Lucene对中文的检索更加个性化。通过检索结果的对比表明,改进后的中文分词器对检索功能的扩展有了极大的提高。并最终构建出了一个高效的中文全文检索系统。

0 引言

随着网络的发展和数据存储技术的成熟,如何在大量的数据中快速、准确地获取到我们所需要的信息成为一个亟待解决的问题,也是信息检索技术的核心问题。

信息检索的核心是全文检索技术,全文检索是指以各种计算机数据诸如文字、声音、图像等为处理对象,提供按照数据资料的内容而不是外在特征来实现的信息检索手段。当前对全文数据的检索主要有两种方法:顺序扫描法(Serial Scanning)和倒排索引法(Inverted Index)。前者较为原始,对于小数量的数据是最直接和最方便的方法;但随着数据量的增多,倒排索引法具有更快的检索速度和更全的应用范围[1]。Lucene并不是一个完整的搜索引擎应用,而是一个开放源代码的高性能、可伸缩的信息搜索库,可以方便地嵌入到各种应用中,实现针对应用的全文索引/检索功能,并且已经在许多搜索项目中得到了广泛的应用[2]。

中文分词技术作为信息检索的核心技术之一,它的研究与发展促进了全文检索技术的应用。本文主要研究了中文分词的最大匹配算法,并通过该算法对原始中文分词器进行了改进,改进后的分词器更加适用于中文条件下的搜索。

1 Lucene架构及简介

lucene怎么全文检索?基于Lucene的中文分词器的改进与实现(1)

图1描述了基于Lucene的全文检索过程,Lucene对索引的创建和搜索是通过不同的流程来实现。创建索引时,需要通过文件、数据库、Web或人工输入方式来对数据进行采集;其次则需要建立索引的Document,一条Document就类似于数据库的一条记录[3];最后通过这些Document来生成索引。搜索索引时,首先通过用户查询得到用户的查询条件,然后Lucene通过查询条件对索引进行搜索,并将最终经过一定规则排序后的结果返回给用户。目前常见的搜索引擎排序算法有Direct Hit排序算法、PageRank算法、排名竞价服务和词频位置加权算法[4]。

lucene怎么全文检索?基于Lucene的中文分词器的改进与实现(2)

图2为Lucene的逻辑架构图。由图2可以看出Lucene索引和检索时各个模块间的调用关系:当索引文件时,接口模块会先调用语法分析器对文本进行分析,并通过基础结构公共模块将分析后的数据写入索引文件中。用户查询时,同样是通过接口模块将查询语句传递到索引核心模块,该模块负责在底层的存储类中读取索引文件里面的数据,并返回给接口模块[5]。该逻辑图中的部分模块是作为公共类存在的。

2 自定义中文分词器的设计

Lucene架构中的分词器(Analyzer)用于对文本数据进行分词,文本数据的索引创建过程一般包含以下几步:(1)将原文档传递给分词组件(Tokenizer);(2)将得到的词元(Token)传递给语言过滤组件(TokenFilter);(3)最后将得到的语汇单元(Term)传递给索引组件从而建立该词的索引[6]。如图3所示。

2.1 文本解析器的应用

在构建搜索程序时,一个重要的步骤就是从文档中提取文本以用于索引。这就要求搜索程序能够处理多种多样的文档。对于XML或者HTML等文本格式,必须小心处理以避免对其标签进行错误的改写。

由于Lucene只能处理文本内容,而不能直接处理文件,因此对于存储文本的各种文件,Lucene过去采用不同的文档过滤器,并通过这些过滤器从文件中提取文本,同时还需要自己检测文档类型和编码类型[4]。通过引入文本解析器TIKA作为中间模块,实现对文件的文本内容进行提取。除此之外,TIKA还能从大多数类型的文档中提取出元数据[7]。TIKA相当于提供了应对各种文件的中间器,如图4所示。

lucene怎么全文检索?基于Lucene的中文分词器的改进与实现(3)

2.2 分词器的设计思路

经过文本提取后的内容,就可以进行分词操作了。然而Lucene自带的分词器在中文环境下的应用具有很大的局限性。对于英文该分词器采用空格分词,对于中文实际上只是将文本切割为单个字符,并不符合中文的语法及语义。最大匹配算法(MMSEG)是一种常见的、基于词典的分词算法[8]。该算法以正向最大匹配为主,多种消除歧义的规则为辅。它的匹配规则包括正向匹配和复杂匹配;歧义消除规则依次采用最大匹配、最大平均单词长度、单词长度最小方差和单字单词语素最大自由度对语句进行分词,直到只有一种结果或者最后一个规则使用完毕。

该算法强调长度和均衡,体现在以下几个方面:每个词的组合要尽可能长,每个词也要尽可能长,每个词的长度要尽可能接近,每个词的词频也要较为接近。例如,假设C1,C2,C3,…,Cn为一组字符构成的短语字符串,首先搜索词典以确定_C1_是否为单个字,若为单个字则继续搜索_C1C2_,直到在词典中找到最长的单词即为最合理的匹配。取出这个词,并对下一个字符采取同样的操作,直到该字符串最后一个字。在消除歧义方面,定义平均词长:

式中N为词组总字数,M为词语数量。对于字数一定的词组,词语数量越少则平均词长越大,该系列分词后的词语更符合中文语义。当平均词长相同时,继续采用词语长度的变化率(即标准差公式)来判断分词的好坏,定义每个词的长度分别为n1,n2,n3,…,nn,则该短语词语长度变化率为:

变化率越小,则说明该方法下的分词效果越好。最后,对于单字词和连接词的判断,采用的方法是计算词组中的所有单字词词频的自然对数,然后将得到的值相加,取总和最大的词组。例如A_BBB_C(单字词词频,A:3,C:7),DD_E_F(单字词词频,E:5,F:5)表示两个词组,A、C、E、F表示不同的单字词,如果不取自然对数,单纯就词频来计算,这两个词组是一样的,但实际上不同的词频范围所表示的效果也不同,所以这里取自然对数:

ln Fa ln Fc<ln Fe ln Ff

即:ln 3 ln 7<ln 5 ln 5(3)

比如:设施_和_服务,设施_和服_务,在文本中,“和”字作为单字的词频越高,则第一种分词方法的可能性就越大。

基于以上所述的分词算法,对示例语句“我是一名大学生”进行分析,并标明分词后的语汇单元的属性,如图5所示。

由图5各项属性可知,当文本被语汇单元化了之后,相对于前一个语汇单元的位置信息将以位置增量值保存,默认值为1。如果位置增量大于1,则表明两个语汇单元之间有被TokenFilter过滤掉的停用词。基于以上分词算法,可以构建同义词引擎,该同义词能满足与原词汇具有相同的词汇偏移量,并且通过堆栈的方式设置0位置增量来表示插入的同义词,那么就可以实现基于Lucene的中文同义词分词器的改进。这种改进使得在搜索时,输入任何一个同义词,都能得到相匹配的结果。

3 Lucene应用测试实例及分析

根据前文所述的自定义中文分词器的设计方案,将该分词器集成到Lucene分词模块中去,并通过对比最大匹配算法分词器(MMSegAnalyzer)以及封装好的自定义中文分词器(MyAnalyzer)来进行测试。自定义中文分词器部分代码如下,构造该类时将同义词引擎传入,并加载绝对路径下的词典。

public class MyAnalyzer extends Analyzer {

private SamewordContext samewordContext;

//构造时把同义词引擎SamewordContext传入

public MyAnalyzer(SamewordContext swc){

samewordContext=swc;

}

@Override

public TokenStream tokenStream(String fieldName,Reader reader){

Dictionary dic=

Dictionary.getInstance("D:\\Java\\mmseg4j-1.8.5\\data");

//分词器采用最大匹配算法分词器

return new MySameTokenFilter(new MMSegTokenizer(new MaxWordSeg(dic),reader),samewordContext

首先测试文本解析器TIKA的解析性能,通过对比TXT文本与被解析后的PDF文档在Lucene中和Windows中对中文词组“工具”的识别条数、索引和检索时间,表明结合了文本解析器TIKA的Lucene具有较强的实用性。本文所用测试文本为世界科技百卷书及中华学生百科全书共200册,数据量约30 MB,系统为Windows 7 SP2。测试结果如表1所示。

由表1可得知,使用Lucene对文件内容创建索引并进行搜索,其检索效率与Windows自带检索功能相比,具有更快的算法实现。在搜索速度上,两种方式的速度差别并不大,主要差别在于索引创建的过程。该实验结果很好地证明了最大匹配算法在中文分词上的优越性,以及TIKA对文本内容的解析性能。

接下来对搜索系统的完备性进行测试。首先通过同义词引擎将一组词汇定义为相关同义词,这使得在检索某一词汇时,即使文档本身中不包含该内容,但只要包含了该词汇的相关同义词,即可获得检索结果。该方法是基于前述的位置信息和偏移信息等语汇单元属性。定义同义词:文明=文化=中华文明,并通过自定义分词器建立索引并检索这些词汇,检索结果如表2所示。

lucene怎么全文检索?基于Lucene的中文分词器的改进与实现(4)

由表2测试得知,当文本解析器与自定义分词器被引入Lucene之后,检索响应度和检索满意度均有较高提升,可以更方便快捷地实现用户对数据的管理与检索。

4 结束语

通常使用功能完备性、分词准确性、检索速度、查全率来评价搜索系统的性能。通过上述测试实例的对比发现,结合了改进后的自定义中文分词器的搜索系统,对以上性能指标均有较高提升。当然,该分词器算法主要是根据最大匹配算法,通过词典的加载来完成同义词引擎的构造。将来的研究方向:可以结合中文语义及概率统计智能化得出同义词词根,从而根据词根使得搜索系统更加丰富化、人性化,并将其应用在网络数据检索、网站搜索功能等方面。

参考文献

[1] .基于Lucene倒排索引性能的研究与优化[D].昆明:昆明理工大学,2013.

[2] 李永春,丁华福.Lucene的全文检索的研究与应用[J].计算机技术与发展,2009,20(2):12-15.

[3] 罗刚.解密搜索引擎技术实战Lucene&Java精华版[M].北京:电子工业出版社,2014.

[4] 高乐,张健.基于网页分块的搜索引擎排序算法改进[J].浙江工业大学学报,2005,33(3):272-275.

[5] 林碧英,赵锐,陈良臣.基于Lucene的全文检索引擎研究与应用[J].计算机技术与发展,2007,17(5):186-190.

[6] 刘冰凌.基于正向最大匹配算法的优化算法ImpFMMseg的实现[D].武汉:中南民族大学,2010.

[7] CUTTING D. The Lucene search engine powerful flexible and free[M]. Newyork: John Wiley Sons, 2000.

[8] MCCANDLESS M. Lucene in Action[M].牛长流,肖宇,译.北京:人民邮电出版社,2011.

,