基于Lucene的中文分词算法研究与实现
2014-02-22徐有健
徐有健
(华南理工大学,广东广州,510006)
基于Lucene的中文分词算法研究与实现
徐有健
(华南理工大学,广东广州,510006)
本文重点研究了如何改进中文分词算法,并根据新的中文算法,设计出可以满足Hadoop文件系统可视化文件搜索引擎研究的中文分析器MyAnalyzer。
lucene;Hadoop;搜索;中文分词
1 研究背景
作为中文信息处理的基础,中文分词分析器的效率和准确度对搜索引擎研究至关重要。中文分词的准确性会直接影响到中文搜索引擎的准确率和工作效率。目前,中文搜索引擎技术比西文搜索引擎技术落后一段距离的原因就在于中文搜索需要经过分词程序,西文引擎的分词分析器不适用于中文分词。比如Lucene自带的StandardAnalyzer分析器,英文分词的效果非常好,但是在中文分词方面是将每一个汉字当做一个词,对中文分词并没有实用价值。至于Lucene自带的另外两种内置分析器,SmartChineseAnalyzer和CJKAnalyzer,虽然可以实现中文分词,但是分词效率比较低,尤其是CJKAnalyze,会产生大量的无用分词。由于Hadoop本身不带有可视化文件系统管理功能,要建立基于Lucene的Hadoop文件系统可视化搜索引擎,就要研究如何改进Lucene中文分词器,使其满足项目需要。
2 基于Lucene的Hadoop文件系统可视化文件搜索中的中文分词算法实现
2.1 中文分词模块设计
2.1.1 中文分词模块框架设计
设计一个高性能实用化的中文分词模块对实现引擎搜索结果的准确性和快捷性具有重要的意义。设计中文分词模块框架时要考虑到分词速度、分词精确度和系统维护的便利性。根据三个考虑要素,设计中文分词框架如图1-1所示。设计的分词框架包括词典、分词器和性能评测三个模块。
图1 -1
2.1.2 中文分词算法设计
为了适应人们的日常阅读习惯与写作习惯,本中文分词模块中文分词算法设计采用了最佳匹配法的分词算法。最佳匹配法分为正向的最佳匹配法和逆向的最佳匹配法,以“长词优先”原则为核心,按照在词频的大小顺序对词典中的词条进行排列。正向最佳匹配算法的形式定义为:对于文本中的字符串ABC,A∈Z,AB∈Z,ABC不属于Z,Z为字典,那么这串字符就切分为AB/C。例如,一封毛泽东亲笔信原稿,采用正向最佳匹配法时则划分为一封/毛泽东/亲笔信/原稿。逆向最佳匹配法与正向最佳匹配法相反,从句子或者文章末尾开始处理。具体的算法设计如下:
(1)正向最佳逐字匹配算法
采用正向最佳逐字匹配算法,要坚持“长词优先”原则,即当一个汉字字符出现多种切分结果时,取含有长度最长的词条切分结果。运用长词优先原则,有利于缩短对分词词典的检索时间,提高分词速度。运用正向最佳逐字匹配算法进行分词的设计思路为:首先,在词典中搜索字符串的最前面的字符,形成以该首字字符节点为根的词典树,将该字符串与词典树进行匹配,一次匹配一个字符,匹配成功则继续向下匹配,否则就回溯,找到上一个可以成词的字,即终止标识符为“T”,形成分词结果。具体描述如下:
输出:切分出的单词集合S
Step1:在首字散列中定位待查询汉字符串首字据待查询字符串的首字的Unicode值。如果字符节点为根的词典树存在,则得到子树节点的指针,并通过子树节点的指针找到子节点表,记录该节点的层数k,i=i+1,转Step2。如果不存在,则单独成词,将该字添加到单词集合S中,指向,重复Step1。
Step3:判断该节点组词标识是否为T,如果是,则转Step4;如果不是,则i=i+1,找到该节点的子节点表,转Step2。
Step4:判断该节点是否为叶子节点,如果是,若i<n,将添加到单词表S中,i=i+1,转Step1;若i=n,将添加到单词表S中,算法结束。如果不是,i=i+1,记录该节点层次 k,转 Step2。
与传统的正向最佳逐字配算法相比,这种正向最佳逐字配算法减少了分词过程中试探性查询的次数,无需预知待查询词的长度,实现一次匹配完成分词,极大地提高了分词的效率。以“今天我们要上学”为例,假设词典的最长词长为5。
一般的最大匹配分词算法的查找过程为:
用本文设计的最大匹配算法的查找过程为:
今天我们要上学我们要上学要上学上学。
通过比较,一般的最大匹配分词算法的查找次数为12次,本文的最大匹配算法为4次,大大减少了查找的次数,提高了查找的效率。
(2)逆向最佳逐字匹配算法
逆向最佳逐字匹配算法的原理与正向最佳逐字匹配算法基本相同,因此不以加赘述。与正向最佳逐字匹配算法不同的是,逆向最长匹配的分词算法是从右至左,从字符串后面进行扫描,需要配合逆向最长匹配的词典结构进行使用。
2.1.3 词典设计
为了实现中文分词模块的顺利使用,要结合分词算法设计出词典。
首先,要统计中文中的词的字数个数的频率,根据频率制定各字数的词条。一般来说,中文词中,字数为2的词语数量比较多,多字(四个字以上)的使用频率比较低。其次,为了配合正向最佳逐字匹配算法使用,要设计出正序词典机制。词典中首字的索引值即为首字的 Unicode 编码。词典的第一层要建立起以词语首字为索引的首字散列表,使各个首字相同的词语采用同一根节点的词典结构。除了词语的首字外,剩余部分在内存中采用树的形式存放。最后,为了配合逆向最佳匹配算法,要设计出逆序词典作为使用基础。逆序词典结构与正序词典结构完全相同,但是要将每个词条的顺序颠倒,建立起存储词语尾字W以及在每个W下记录了以尾字W为词尾的所有词汇的首字散列表。
2.2 中文分词机制的实现
实现分词机制首先要实现分词预处理,将需要分词的内容转换为分词模块可以处理的文本格式。其次,通过Lucene的工具包中的Analayzer类工具,实现设计的中文分词模块。由于Lucene自带的SmartChineseAnalyzer和CJKAnalyze不能满足引擎中的中文分词需要,因此要开发出新的中文分析器。本文将新的分词算法加入到Lucene当中开发出适合需要的MyAnalyzer,通过MyAnalyzer实现新设计的中文分词算法。
2.3 分词性能测试
2.3.1 分词速度测试
(1)实验方法: 以经过分词预处理后得到的纯文本为速度测试材料,通过计算分词的速度与质量对分词模块的分词性能进行测试。
(2)实验方案:文本长度从500字符开始,以1500个字符为一个递增区间,分别计算每次分词所耗的时间。
(3)实验数据测量:由于实验环境无法达到理想状态,同一个文本每次切分所耗费的时间并不完全相同导致记录时间有误差,为了使实验数据更加接近标准数据,要对每个文本进行反复测试,取数据的平均值。
(4)实验结果:经过反复测验,获得实验数据如表1-3
(5)数据分析:从表1-3可以看出,分析器的分词速度一直都保持在20字/ms至25字/ms的速度之间。以这个速度,本分词模块每秒钟处理字符数在20000到250000之间,可以满足现在中文搜索引擎对速度的要求。
表1 -3
2.3.2 分词精准度测试
(1)实验方案:随机选择一个句子,通过MyAnalyzer、SmartChineseAnalyzer和CJKAnalyze三种分析器进行分词,对结果进行比较,判断新设计的中文分词模块的精准度。
(2)实验步骤:①选择了“2008年12月26日,中国海军首批护航编队踏上了远洋护航的漫长征程。”作为分词文本
②参与实验的分析器包括MyAnalyzer、SmartChineseAnalyzer和CJKAnalyze
(3)实验结果:MyAnalyzer的分词结果是 2008/年/12/月/26/日/中国/海军/首批/护航/编队/踏上/了/远洋/护航/的/漫长/征程/
SmartChineseAnalyzer的分词结果是年/月/日/中/国/海/军/首/批/护/航/编/队/踏/上/了/远/洋/护/航/的/漫/长/征/程/
CJKAnalyze的分词结果是2008/年/12/月/26/日中/中国/国海/海军/军首/首批/批护/护航/航编/编队/踏上/上了/了远/远洋/洋护/护航/航的/的漫/漫长/长征/征程/
(4)实验结论:通过对分词结果进行对比,可以发现MyAnalyzer的分词准确性最高,具体体现在:SmartChineseAnalyzer将中文外的其他字符种类都给过滤掉了。CJKAnalyze保留了其他种类的字符,但是产生了许多无用的切分。相比之下,MyAnalyzer保留了中文外的其他字符种类,并且分词字数不限于两个字数,准确率较高。因此,MyAnalyzer可以满足Hadoop文件系统可视化文件搜索引擎设计的需要。
3 结束语
关于中文分词的算法,目前仍然没有完美的设计方案,可以完美兼顾中文分词的准确性与高效率,而是或多或少会存在一定的局限性。但是,通过比较各种分词算法的优劣,并不断对分词算法加以改善,取长补短,终有一日可以整合出一个效率高、准确率高的分词方法,推动中文引擎技术的发展。
[1] 戴洪,蒋静,樊程,等.一种基于LUCENE的中文分词算法研究[J].青岛大学学报:自然科学版,2011(3):53-58.
[2] 赵珂,逯鹏,李永强.基于Lucene的搜索引擎设计与实现[J].计算机工程,2011(16):39-41.
[3] 赵旭,王庆桦.向LUCENE搜索引擎中加入中文同义词查询[J].科技信息,2011(7):60-61.
Lucene the Chinese word segmentation algorithm and implementation of research-based
Xu Youjian
(South China University of Technology,Guangzhou,510006)
This paper is aimed at improving Chinese word segmentation module.According to the new Chinese word segmentation module,an analyzer named MyAnalyzer that can process Hadoop file System research is developed.
lucene;Hadoop;search;Chinese word