软件工程毕业设计(论文)基于opencms的中文搜索研究

上传人:无*** 文档编号:42550597 上传时间:2021-11-26 格式:DOC 页数:35 大小:1.25MB
返回 下载 相关 举报
软件工程毕业设计(论文)基于opencms的中文搜索研究_第1页
第1页 / 共35页
软件工程毕业设计(论文)基于opencms的中文搜索研究_第2页
第2页 / 共35页
软件工程毕业设计(论文)基于opencms的中文搜索研究_第3页
第3页 / 共35页
点击查看更多>>
资源描述
论文题目: 基于opencms的中文搜索研究 学 院: 计算机与信息学院 专业年级: 软件工程 学 号: 姓 名: 指导教师、职称: 2012 年 5 月 Research Simplified Chinese Search Module Base On OpenCms College: Computer and Information Science Specialty and Grade: SoftWare Engineering , 2008 Number: 081181064 Name: Wang Feifei Advisor: Professor Chen Changjiang Submitted Time: May, 2012 福建农林大学本科毕业论文目 录中文摘要IAbstractII1引言12论文背景23实际分析33.1OpenCms中搜索的现状33.1.1、OpenCms现状33.1.2、OpenCms隐患33.2目前可用开源搜索引擎的分析和筛选43.3优化成中文搜索引擎的步骤43.3.1、中文搜索引擎43.3.2、中文搜索难点53.4中文分词算法的分类的筛选53.4.1、字符串匹配分词53.4.2、理解分词方法63.4.3、统计分词方法63.5中文分词中的难题73.5.1、歧义识别73.5.2、新词识别83.5.3、应用现状83.6可以嵌入OpenCms项目中的中文搜索工具的筛选83.6.1、StopAnalyzer93.6.2、StandardAnalyzer93.6.3、SimpleAnalyzer93.6.4、WhitespaceAnalyzer93.6.5、KeywordAnalyzer93.6.6、CJKAnalyzer93.6.7、ChineseAnalyzer93.6.8、PerFieldAnalyzerWrapper103.6.9、IKAnalyzer103.6.10、JE-Analysis103.6.11、ICTCLAS4J103.6.12、Imdict-Chinese-Analyzer103.6.13、Paoding Analysis103.6.14、MMSeg4J103.6.15、IKAnalyzer113.6.16、Paoding(庖丁解牛分词)113.6.17、MMSEG4J113.6.18、盘古分词123.7嵌入OpenCms项目的中文搜索引擎的注意事项144解决方案204.1分析OpenCms代码构架204.2分析OpenCms代码中搜索实现部分224.3添加IKAnalysis中文支持包进入OpenCms的项目234.4添加配置切换文件中对IKAnalysis的支持235探索研究256结束语267参考文献27致谢28II中文摘要本论文描述了OpenCms这一个开源的项目在中国的实施情况并且在落地本土化的前景和之中会遇到的问题。通过其中内嵌的Lucene搜索引擎未能很好的支持中文搜索而进行了一个分析,并指出了中文搜索在OpenCms本土化中的重要作用,且在本论文中对于中文搜索的现有前景和如何在OpenCms这一框架中嵌入中文分词搜索器进行了一个分析和模型的搭建,并且通过嵌入一个中文分词搜索器对Lucene的搜索原理有所了解,并且对于Lucene搜索中的中文分词的分词过滤,语法表达式等等有了深入的了解,也对于以后在算法的搜索方面有所了解。关键词:OpenCms;本土化;Lucene;中文分词;分词器AbstractThis paper describes the OpenCms, an open source project implemented in China, landing the localization of the prospects and problems encountered among. An analysis of the Lucene search engine is not well embedded in the support of Chinese search, and pointed out the important role of the Chinese search in the localization of OpenCms, and in this paper for Chinese search existing prospects and how to sub-word search device carry out a an analysis and model of the structures embedded in the OpenCms this framework, Chinese, and by embedding a Chinese word Finder the Lucene search principle, be understanding, and the Lucene search Chinese sub-word of the sub-word filter syntax expressions, and so an insight into the algorithm search for later understanding.Key words: OpenCms; Localization; Lucene,Word AnalysisII1 引言CMS是Content Management System的缩写,意为"内容管理系统",它具有许多基于模板的优秀设计,可以加快网站开发的速度和减少开发的成本。CMS的功能并不只限于文本处理,它也可以处理图片、Flash动画、声像流、图像甚至电子邮件档案。CMS其实是一个很广泛的称呼,从一般的博客程序,新闻发布程序,到综合性的网站管理程序都可以被称为内容管理系统。根据不同的需求,CMS有几种不同的分类方法。比如,根据应用层面的不同,可以被划分为:一 重视后台管理的CMS二 重视风格设计的CMS三 重视前台发布的CMS等等。就目前已经存在的各种CMS来说,最终界面上都是大同小异,但是在编程风格与管理方式上来讲却是千差万别。就CMS本身被设计出来的出发点来说,应该是方便一些对于各种网络编程语言并不是很熟悉的用户用一种比较简单的方式来管理自己的网站。这虽然是本身的出发点,但由于各个CMS系统的原创者们自己本身的背景与对“简单”这两个字的理解程度的不同,就造成了现在没有统一的标准群雄纷争的局面。简而言之,CMS就是可以让你不需要学习复杂的建站技术,不需要学习太多复杂的HTML语言,你就能够利用CMS构建出一个风格统一功能强大的专业网站。而OpenCms这一框架就是在这一环境下应用而生的,但是OpenCms这一框架在实际 使用中还是有一些各式各样的问题,所以,本论文就从对于中文搜索支持这一个方面进行分析和提出解决方案。1福建农林大学本科毕业论文2 论文背景OpenCms2,3是1999年发布的,瑞典互联网顾问Framfab支持它。Framfab在欧洲六个国家设有分支机构。德国Framfab是OpenCms项目的主要发起人。对于OpenCms的咨询和支持可以在Framfab以及其他的欧洲公司(比如Alkacon)那里获得。现在,OpenCms已经被LGT Bank of Lichtenstein、BP South Africa、和UNICEF Netherlands以及其他很多用户采用。OpenCms作为一个Java为基础的企业级CMS系统,其本身跟其他同类型的CMS框架相比而言的优势在于:OpenCms可以非常容易的帮助建立和管理复杂的网站而无需专业的HTML知识。当使用一个复杂的模板引擎来规划站点,它提供一个类似于我们熟知的office应用的所见即所得编辑器来帮助使用者创建内容。OpenCms是一个完全开源的软件,它不需要任何许可费用。 6OpenCms基于JAVA和XML语言技术,因此它适合完全融入到现有的系统内部。OpenCms可以非常好的运行在一个完全的开源环境中(例如:Linux、Apache、Tomcat、MySQL). 当然,也可以很好的运行于商业环境下(例如:Windows NT、IIS、BEA Weblogic、Oracle DB)。这样一个优秀的开源Cms框架在中大型企业中的市场地位和市场占有率本应该是举足轻重的。但实际上在中国,应用和了解OpenCms这一框架的人并不多,而在欧洲的很多国家,它是一个政府企业相当喜欢的一个开源框架。导致出现这种现状的原因归结起来有下面的几点:一、 国人对于Java的开源Cms项目的代码编写门槛抱有望而却步的态度:中国市场上面的大多数Cms框架是asp或者php这种相对直观且容易上手的语言进行编写的,而Java编写的Cms框架对于从事php和asp多年的国内开发者来说,转换起来有一定的门槛。二、 在OpenCms中,其自身已经通过Template的方式解决了建站的问题,但是由于国人的英文水平参差不齐,导致接受纯英文的Cms框架有一定的难度。三、 也是我们本论文要讨论的问题就是:OpenCms在对于中文的很多地方的支持都有一些问题。而重中之重是在搜索中对于中文分词的检索和解析是很不准确的。导致搜索出来的结果是牛头不对马嘴。这样的一个现状很明显的导致了OpenCms在中国市场上的占有率基本为0的一个惨状。本文就从OpenCms的搜索引擎中对于中文搜索的现状,中文搜索的本土化和可行性进行分析,并且通过一小部分代码来说明此项目的可行性和成品对于OpenCms项目的作用。3 实际分析3.1 OpenCms中搜索的现状3.1.1、OpenCms现状OpenCms目前的最高版本是8.0.2由于这个是属于新发布的测试版,功能不是非常稳定,可能有一些不确定的隐藏Bug,故本论文描述的是在8.0.1这一相对稳定的版本下面的OpenCms的搜索模块的功能。4,5目前的OpenCms搜索功能的界面如图3-1显示:图 31 搜索界面这是符合国人的网站浏览习惯的,故在界面的部分是不需要进行任何修改的。建站模版出来的样式和实现的样式还是挺好的,而单独的搜索页面的样式也不需要进行特殊的改变,表面上看来搜索中文是没有问题的,其实里面暗藏着地雷。3.1.2、OpenCms隐患OpenCms的Api中明确说明了OpenCms使用的全文搜索引擎是Lucene这一功能强大的开源全文搜索引擎,并没提到说在Lucene中有使用第三方的包,这引起了我的质疑,所以我通过OpenCms的源码发现了下面的一段注释,在OpenCms的源代码的package org.opencms.search.galleries.CmsGallerySearchAnalyzer这个类中明确显示了这样的一个内容,如图3-2:图 32配置文件这明确显示了多语言分析器中没有对于中文的关键词进行分析和解释的工作。这就产生了一系列的隐患:一、 中文的关键词,如“的”,“和”,“与”,“跟”等等的在中文语境有有特殊意义的词在目前的OpenCms中是被当作一个全词来进行搜索的,这样会导致搜索如“小明的小狗”的时候不会搜索出“小狗”,“小明”等这样的按照等级来分的资料,而有可能搜索出“小明的牙膏”,“小明的小时候”这种和语境完全不同的结果,这跟客户希望实现的搜索会产生大相径庭的结果。二、 上面的这种情况还是比较好的。下面来描述一个更糟的场景:假设这是一个医药网站,这其中的药名有一些英文单字和中文夹杂着,药品搜索要求的是一个准确性,而最可怕的事情会出现,由于它只支持中文的单字搜索,要全意思才能解释搜索出所需要的单词,故这样会导致很多的药品是搜索不出来的。这在实现上是一个很不可靠的过程。故基于OpenCms中的Lucene搜索引擎没有对于中文搜索有很好的支持,而OpenCms本身的开源性和可插拔性就允许了我们对OpenCms的Lucene搜索引擎进行处理。而个人想到的两种方式有:一、 用其他第三方中文搜索引擎替换Lucene,并且实现多语言搜索。二、 在Lucene搜索引擎中加入第三方的支持软件,实现多语言搜索1。3.2 目前可用开源搜索引擎的分析和筛选通过在网络的资料的汇总和整理发现:目前的开源搜索引擎框架Lucene的占有率是最大的,也是最完美的,故上文中的用第三方的开源框架来代替Lucene是不可行的。如果使用付费的框架来进行开源项目的开发有悖于开源项目GPL的原则。故只能在Lucene上面进行扩展,并且实现中文分词的效果。Lucene官方的FAQ中明确说明了其在中文搜索中的不足和无能为力的态度。并且在进行大数据量数据库搜索中的能力也表示不是很乐观。故本文中没有讨论Lucene对于海量数据存储的性能问题的负载均衡的考量。仅仅从中文搜索这一实现类关注点进行关注。通过搜索参考资料得出的结论是,目前可用的搜索引擎框架的不二人选是Lucene,而这也减轻了开发人员在进行OpenCms的扩展的时候的代码量,而下面就要对如何在Lucene上面进行中文搜索引擎的扩展进行一系列的搜索,测试和使用了。3.3 优化成中文搜索引擎的步骤3.3.1、中文搜索引擎中文搜索引擎目前大多数做的还是在全文检索引擎上面加入中文分词器的实现方式。全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式7。主要分为按字检索和按词检索两种。按字检索是指对于文章中的每一个字都建立索引,检索时将词分解为字的组合。对于各种不同的语言而言,字有不同的含义,比如英文中字与词实际上是合一的,而中文中字与词有很大分别。按词检索指对文章中的词,即语义单位建立索引,检索时按词检索,并且可以处理同义项等。英文等西方文字由于按照空白切分词,因此实现上与按字处理类似,添加同义处理也很容易。中文等东方文字则需要切分字词,以达到按词索引的目的,关于这方面的问题,是当前全文检索技术尤其是中文全文检索技术中的难点。其难点在于:3.3.2、中文搜索难点1与英文为代表的拉丁语系语言相比,英文以空格作为天然的分隔符,而中文由于继承自古代汉语的传统,词语之间没有分隔。古代汉语中除了连绵词和人名地名等,词通常就是单个汉字,所以当时没有分词书写的必要。而现代汉语中双字或多字词居多,一个字不再等同于一个词。例如英语:'Knowledge is power“,可自然分割为 Knowledge/ is/ power 三个词。而汉语里:“知识就是力量”,由于没有词语之间的分隔符,书写时无法切分成:知识/ 就是/ 力量2在中文里,“词”和“词组”边界模糊8现代汉语的基本表达单元虽然为“词”,且以双字或者多字词居多,但由于人们认识水平的不同,对词和短语的边界很难去区分。例如:“对随地吐痰者给予处罚”,“随地吐痰者”本身是一个词还是一个短语,不同的人会有不同的标准,同样的“海上”“酒厂”等等,即使是同一个人也可能做出不同判断,如果汉语真的要分词书写,必然会出现混乱,难度很大。故实现中文搜索引擎的步骤就是在Lucene框架上面嵌入一个中文分词的工具。3.4 中文分词算法的分类的筛选现有的分词算法可分为三大类:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。3.4.1、字符串匹配分词这种方法又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;常用的几种机械分词方法如下:1)正向最大匹配法(由左到右的方向);2)逆向最大匹配法(由右到左的方向);3)最少切分(使每一句中切出的词数最小);4)双向最大匹配法(进行由左到右、由右到左两次扫描)还可以将上述各种方法相互组合,例如,可以将正向最大匹配方法和逆向最大匹配方法结合起来构成双向匹配法。由于汉语单字成词的特点,正向最小匹配和逆向最小匹配一般很少使用。一般说来,逆向匹配的切分精度略高于正向匹配,遇到的歧义现象也较少。统计结果表明,单纯使用正向最大匹配的错误率为1/169,单纯使用逆向最大匹配的错误率为1/245。但这种精度还远远不能满足实际的需要。实际使用的分词系统,都是把机械分词作为一种初分手段,还需通过利用各种其它的语言信息来进一步提高切分的准确率。一种方法是改进扫描方式,称为特征扫描或标志切分,优先在待分析字符串中识别和切分出一些带有明显特征的词,以这些词作为断点,可将原字符串分为较小的串再来进机械分词,从而减少匹配的错误率。另一种方法是将分词和词类标注结合起来,利用丰富的词类信息对分词决策提供帮助,并且在标注过程中又反过来对分词结果进行检验、调整,从而极大地提高切分的准确率。对于机械分词方法,可以建立一个一般的模型,在这方面有专业的学术论文,这里不做详细论述。3.4.2、理解分词方法这种分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。3.4.3、统计分词方法从形式上看,词是稳定的字的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。因此字与字相邻共现的频率或概率能够较好的反映成词的可信度。可以对语料中相邻共现的各个字的组合的频度进行统计,计算它们的互现信息。定义两个字的互现信息,计算两个汉字X、Y的相邻共现概率。互现信息体现了汉字之间结合关系的紧密程度。当紧密程度高于某一个阈值时,便可认为此字组可能构成了一个词。这种方法只需对语料中的字组频度进行统计,不需要切分词典,因而又叫做无词典分词法或统计取词方法。但这种方法也有一定的局限性,会经常抽出一些共现频度高、但并不是词的常用字组,例如“这一”、“之一”、“有的”、“我的”、“许多的”等,并且对常用词的识别精度差,时空开销大。实际应用的统计分词系统都要使用一部基本的分词词典(常用词词典)进行串匹配分词,同时使用统计方法识别一些新的词,即将串频统计和串匹配结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。另外一类是基于统计机器学习的方法。首先给出大量已经分词的文本,利用统计机器学习模型学习词语切分的规律(称为训练),从而实现对未知文本的切分。我们知道,汉语中各个字单独作词语的能力是不同的,此外有的字常常作为前缀出现,有的字缺常常作为后缀(“者”“性”),结合两个字相临时是否成词的信息,这样就得到了许多与分词有关的知识。这种方法就是充分利用汉语组词的规律来分词。这种方法的最大缺点是需要有大量预先分好词的语料作支撑,而且训练过程中时空开销极大。到底哪种分词算法的准确度更高,目前并无定论。对于任何一个成熟的分词系统来说,不可能单独依靠某一种算法来实现,都需要综合不同的算法。例如,海量科技的分词算法就采用“复方分词法”,所谓复方,就是像中西医结合般综合运用机械方法和知识方法。对于成熟的中文分词系统,需要多种算法综合处理问题。而由于OpenCms中的项目搜索量不是非常大,不需要进行基于统计的机器学习的算法和基于理解的算法,只要通过物理顺序进行分词操作就基本上可以在性能上最优,并且在用户体验上得到最大化的效果的方式。3.5 中文分词中的难题有了成熟的分词算法,是否就能容易的解决中文分词的问题呢?事实远非如此。中文是一种十分复杂的语言,让计算机理解中文语言更是困难。在中文分词过程中,有两大难题一直没有完全突破。93.5.1、歧义识别歧义是指同样的一句话,可能有两种或者更多的切分方法。主要的歧义有两种:交集型歧义和组合型歧义,例如:表面的,因为“表面”和“面的”都是词,那么这个短语就可以分成“表面 的”和“表 面的”。这种称为交集型歧义(交叉歧义)。像这种交集型歧义十分常见,前面举的“和服”的例子,其实就是因为交集型歧义引起的错误。“化妆和服装”可以分成“化妆 和 服装”或者“化妆 和服 装”。由于没有人的知识去理解,计算机很难知道到底哪个方案正确。交集型歧义相对组合型歧义来说是还算比较容易处理,组合型歧义就必需根据整个句子来判断了。例如,在句子“这个门把手坏了”中,“把手”是个词,但在句子“请把手拿开”中,“把手”就不是一个词;在句子“将军任命了一名中将”中,“中将”是个词,但在句子“产量三年中将增长两倍”中,“中将”就不再是词。这些词计算机又如何去识别?如果交集型歧义和组合型歧义计算机都能解决的话,在歧义中还有一个难题,是真歧义。真歧义意思是给出一句话,由人去判断也不知道哪个应该是词,哪个应该不是词。例如:“乒乓球拍卖完了”,可以切分成“乒乓 球拍 卖 完 了”、也可切分成“乒乓球 拍卖 完 了”,如果没有上下文其他的句子,恐怕谁也不知道“拍卖”在这里算不算一个词。3.5.2、新词识别命名实体(人名、地名)、新词,专业术语称为未登录词。也就是那些在分词词典中没有收录,但又确实能称为词的那些词。最典型的是人名,人可以很容易理解。句子“王军虎去广州了”中,“王军虎”是个词,因为是一个人的名字,但要是让计算机去识别就困难了。如果把“王军虎”做为一个词收录到字典中去,全世界有那么多名字,而且每时每刻都有新增的人名,收录这些人名本身就是一项既不划算又巨大的工程。即使这项工作可以完成,还是会存在问题,例如:在句子“王军虎头虎脑的”中,“王军虎”还能不能算词?除了人名以外,还有机构名、地名、产品名、商标名、简称、省略语等都是很难处理的问题,而且这些又正好是人们经常使用的词,因此对于搜索引擎来说,分词系统中的新词识别十分重要。目前新词识别准确率已经成为评价一个分词系统好坏的重要标志之一。3.5.3、应用现状目前在自然语言处理技术中,中文处理技术比西文处理技术要落后很大一段距离,许多西文的处理方法中文不能直接采用,就是因为中文必需有分词这道工序。中文分词是其他中文信息处理的基础,搜索引擎只是中文分词的一个应用。其他的比如机器翻译(MT)、语音合成、自动分类、自动摘要、自动校对等等,都需要用到分词。因为中文需要分词,可能会影响一些研究,但同时也为一些企业带来机会,因为国外的计算机处理技术要想进入中国市场,首先也是要解决中文分词问题。在中文研究方面,相比外国人来说,中国人有十分明显的优势。分词准确性对搜索引擎来说十分重要,但如果分词速度太慢,即使准确性再高,对于搜索引擎来说也是不可用的,因为搜索引擎需要处理数以亿计的网页,如果分词耗用的时间过长,会严重影响搜索引擎内容更新的速度。因此对于搜索引擎来说,分词的准确性和速度,二者都需要达到很高的要求。目前研究中文分词的大多是科研院校,清华、北大、哈工大、中科院、北京语言学院、东北大学、IBM研究院、微软中国研究院等都有自己的研究队伍,而真正专业研究中文分词的商业公司除了海量科技以外,几乎没有了。科研院校研究的技术,大部分不能很快产品化,而一个专业公司的力量毕竟有限,看来中文分词技术要想更好的服务于更多的产品,还有很长一段路。因此在寻找优秀的分词器的过程中,考量的三个关键的要素就是:一、 能够最优的解决歧义识别的结果;二、 能够最快的掌握新词的搜索;三、 能够在运行速度上进行最优级的操作,提供最完美的用户体验3.6 可以嵌入OpenCms项目中的中文搜索工具的筛选目前市面上的中文分词工具有很多,而由于是基于Lucene的,故必须是Java编写的中文开源分词工具。基于Lucene的分词方法如下10:3.6.1、StopAnalyzerStopAnalyzer能过滤词汇中的特定字符串和词汇,并且完成大写转小写的功能。但是在中文中的实现不是很好,故基本上忽略。(这是英文分词中最常用也是最基本的分词方法,Lucene原生的分词方式)。3.6.2、StandardAnalyzerStandardAnalyzer根据空格和符号来完成分词,还可以完成数字、字母、E-mail地址、IP地址以及中文字符的分析处理,还可以支持过滤词表,用来代替StopAnalyzer能够实现的过滤功能。(目前的最主流的英文分词方式,Lucene原生的分词方式)3.6.3、SimpleAnalyzerSimpleAnalyzer具备基本西文字符词汇分析的分词器,处理词汇单元时,以非字母字符作为分割符号。分词器不能做词汇的过滤,之进行词汇的分析和分割。输出地词汇单元完成小写字符转换,去掉标点符号等分割符。在全文检索系统开发中,通常用来支持西文符号的处理,不支持中文。由于不完成单词过滤功能,所以不需要过滤词库支持。词汇分割策略上简单,使用非英文字符作为分割符,不需要分词词库的支持。3.6.4、WhitespaceAnalyzerWhitespaceAnalyzer使用空格作为间隔符的词汇分割分词器。处理词汇单元的时候,以空格字符作为分割符号。分词器不做词汇过滤,也不进行小写字符转换。实际中可以用来支持特定环境下的西文符号的处理。由于不完成单词过滤和小写字符转换功能,也不需要过滤词库支持。词汇分割策略上简单使用非英文字符作为分割符,不需要分词词库支持。3.6.5、KeywordAnalyzerKeywordAnalyzer把整个输入作为一个单独词汇单元,方便特殊类型的文本进行索引和检索。针对邮政编码,地址等文本信息使用关键词分词器进行索引项建立非常方便。3.6.6、CJKAnalyzerCJKAnalyzer内部调用CJKTokenizer分词器,对中文进行分词,同时使用StopFilter过滤器完成过滤功能,可以实现中文的多元切分和停用词过滤。在Lucene3.0版本中已经弃用。3.6.7、ChineseAnalyzerChineseAnalyzer功能与StandardAnalyzer分析器在处理中文是基本一致,都是切分成单个的双字节中文字符。在Lucene3.0版本中已经弃用。(由于已经弃用,并且如果没被弃用也对于处理来说有很多不足,基本上是忽略的)3.6.8、PerFieldAnalyzerWrapperPerFieldAnalyzerWrapper功能主要用在针对不同的Field采用不同的Analyzer的场合。比如对于文件名,需要使用KeywordAnalyzer,而对于文件内容只使用StandardAnalyzer就可以了。通过addAnalyzer()可以添加分类器。(这个很常用到,也是OpenCms项目中目前用到的方式)3.6.9、IKAnalyzer实现了以词典为基础的正反向全切分,以及正反向最大匹配切分两种方法。IKAnalyzer是第三方实现的分词器,继承自Lucene的Analyzer类,针对中文文本进行处理。3.6.10、JE-AnalysisJE-Analysis是Lucene的中文分词组件,需要下载。3.6.11、ICTCLAS4Jictclas4j中文分词系统是sinboy在中科院张华平和刘群老师的研制的FreeICTCLAS的基础上完成的一个java开源分词项目,简化了原分词程序的复杂度,旨在为广大的中文分词爱好者一个更好的学习机会。3.6.12、Imdict-Chinese-Analyzerimdict-chinese-analyzer 是 imdict智能词典 的智能中文分词模块,算法基于隐马尔科夫模型(Hidden Markov Model, HMM),是中国科学院计算技术研究所的ictclas中文分词程序的重新实现(基于Java),可以直接为lucene搜索引擎提供简体中文分词支持。3.6.13、Paoding AnalysisPaoding Analysis中文分词具有极高效率和高扩展性。引入隐喻,采用完全的面向对象设计,构思先进。其效率比较高,在PIII 1G内存个人机器上,1秒可准确分词100万汉字。采用基于不限制个数的词典文件对文章进行有效切分,使能够将对词汇分类定义。能够对未知的词汇进行合理解析。3.6.14、MMSeg4Jmmseg4j 用 Chih-Hao Tsai 的 MMSeg 算法(http:/technology.chtsai.org/mmseg/ )实现的中文分词器,并实现 lucene 的 analyzer 和 solr 的TokenizerFactory 以方便在Lucene和Solr中使用。 MMSeg 算法有两种分词方法:Simple和Complex,都是基于正向最大匹配。Complex 加了四个规则过虑。官方说:词语的正确识别率达到了 98.41%。mmseg4j 已经实现了这两种分词算法经过上面的筛选,只有下面的几个是我们能用的市面上优秀的中文分词工具的:3.6.15、IKAnalyzerIKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,IKAnalyzer已经推出 了3个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IKAnalyzer3.0则发展为 面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。目前最新的3.2.8版本,且目前的IK是不支持Lucene4的。采用了特有的“正向迭代最细粒度切分算法“,具有60万字/秒的高速处理能力。采用了多子处理器分析模式,支持:英文字母(IP地址、Email、URL)、数字(日期,常用中文数量词,罗马数字,科学计数法),中文词汇(姓名、地名处理)等分词处理。对中英联合支持不是很好,在这方面的处理比较麻烦.需再做一次查询,同时是支持个人词条的优化的词典存储,更小的内存占用。支持用户词典扩展定义针对Lucene全文检索优化的查询分析器IKQueryParser;采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高Lucene检索的命中率11。3.6.16、Paoding(庖丁解牛分词)庖丁中文分词库是一个使用Java开发的,可结合到Lucene应用中的,为互联网、企业内部网使用的中文搜索引擎分词组件。Paoding填补了国内中文分词方面开源组件的空白,致力于此并希翼成为互联网网站首选的中文分词开源组件。 Paoding中文分词追求分词的高效率和用户良好体验。Paoding's Knives中文分词具有极高效和高扩展性。引入隐喻,采用完全的面向对象设计,构思先进。高效率:在PIII 1G内存个人机器上,1秒 可准确分词100万汉字。采用基于不限制个数的词典文件对文章进行有效切分,使能够将对词汇分类定义。能够对未知的词汇进行合理解析3.6.17、MMSEG4Jmmseg4j用Chih-Hao Tsai 的MMSeg算法实现的中文分词器,并实现lucene的analyzer和solr的TokenizerFactory以方便在Lucene和Solr中使用。 MMSeg 算法有两种分词方法:Simple和Complex,都是基于正向最大匹配。Complex加了四个规则过虑。官方说:词语的正确识别率达到了 98.41%。mmseg4j已经实现了这两种分词算法。1.5版的分词速度simple算法是 1100kb/s左右、complex算法是 700kb/s左右,(测试机:AMD athlon 64 2800+ 1G内存 xp)。1.6版在complex基础上实现了最多分词(max-word)。“很好听” -> "很好|好听" “中华人民共和国” -> "中华|华人|共和|国" “中国人民银行” -> "中国|人民|银行"。1.7-beta 版, 目前 complex 1200kb/s左右, simple 1900kb/s左右, 但内存开销了50M左右. 上几个版都是在10M左右.3.6.18、盘古分词1) 盘古分词是一个中英文分词组件。作者eaglet 曾经开发过KTDictSeg 中文分词组件,拥有大量用户。作者基于之前分词组件的开发经验,结合最新的开发技术重新编写了盘古分词组件。2) 功能a) 中文分词功能i. 中文未登录词识别盘古分词可以对一些不在字典中的未登录词自动识别ii. 词频优先盘古分词可以根据词频来解决分词的歧义问题iii. 多元分词盘古分词提供多重输出解决分词粒度和分词精度权衡的问题iv. 中文人名识别输入: “张三说的确实在理”分词结果:张三/说/的/确实/在理/输入 “李三买了一张三角桌子”分词结果:李三/买/了/一张/三角/桌子/v. 强制一元分词输入 “张三说的确实在理”分词结果: 张(0,1)/张三(0,5)/三说的(1,1)/三(1,1)/说(2,5)/的(3,5)/确(4,1)/确实(4,5)/实(5,1)/在(6,1)/在理(6,5)/理(7,1)/vi. 繁体中文分词输入"我的選擇"分词结果: 我/的/選擇/vii. 同时输出简体和繁体输入"我的選擇"分词结果:我(0,5)/的(1,5)/选择(2,1)/選擇(2,5)/viii. 中文词性输出盘古分词可以将以登录词的中文词性输出给用户,以方便用户做进一步处理。ix. 全角字符支持盘古分词可以识别全角的字母和数字b) 英文分词英文单词通常都是靠空格等符号分割,这个比较简单,盘古分词分英文自然也没有什么问题。i. 英文专用词识别一些英文简写是字母符号混合,或者是字母数字混合,这个分词起来就不能按照空格符号这样分割了,对于字母符号混合的如 U.S.A ,只要将这个词录入到字典中,盘古分词就可以分出整词。对于字母和数字混合的,盘古分词会自动作为整词输出。ii. 英文原词输出iii. 英文大小写同时输出iv. 其他功能v. 停用词过滤对于一些标点符号,连词,助词等有时候需要在分词时过滤掉,盘古分词提供一个 StopWord.txt 文件,用户只要将需要过滤的词加入到这个文件中,并将停用词过滤开发打开,就可以过滤掉这些词。c) 设置分词权值盘古分词可以让用户对如下特性设置自定义权值i. 未登录词权值ii. 最匹配词权值iii. 次匹配词权值iv. 再次匹配词权值v. 强行输出的单字的权值vi. 数字的权值vii. 英文词汇权值viii. 符号的权值强制同时输出简繁汉字时,非原来文本的汉字输出权值。d) *用户自定义规则e) 字典管理盘古分词提供一个字典管理工具 DictManage 通过这个工具,你可以增加,修改,和删除字典中的单词f) 动态加载字典通过字典工具增加,修改,和删除字典中的单词后,保持字典,盘古分词会自动将新的字典文件加载进去,而不需要重新启动。g) 关键词高亮组件Lucene 提供了一个关键词高亮组件,但这个组件对中文的支持不是特别好,特别是如果还有多元分词的情况,处理的就更不好。盘古分词提供了一个针对中文和英文的关键词高亮组件 PanGu.HighLight ,其对中文的支持要好于Lucene 那个高亮组件。同义词输出(后续版本提供)性能指标Core Duo 1.8 GHz 下单线程 分词速度为 390K 字符每秒,2线程分词速度为 690K 字符每秒。其他说明:盘古分词提供的字典包括17万个中文常用单词,但这个字典依然不够完整,如果要分词更准确,需要适当维护一下这个字典。中文人名的识别能力取决于 ChsSingleName.txt, ChsDoubleName1.txt, ChsDoubleName2.txt 这三个文件,它们分别表示单子人名,双字人名的首字和双字人名的尾字,如果有的人名没有分出来,需要维护这三个文件。 经过分析发现。在上面的四个分词工具中,难度都不算复杂,但是在现在的用途和现在的例子中,IKAnalysis的速度是比较令人满意的,并且配置起来相对比较简单,开发门槛较低,对于Lucene初学者和对于OpenCms的使用来说,IKAnalysis是相对比较简单和比较容易实现的。故采用IKAnalysis来进行OpenCms的中文分词器的集成。3.7 嵌入OpenCms项目的中文搜索引擎的注意事项在选用了IKAnalysis作为OpenCms的中文分词工具后,就要对于OpenCms进行Lucene的集成了,集成的时候的注意事项有,由于原来OpenCms是有做了一个StopAnalyzer的分析,所以,我们要做的是把StopAnalyzer替换成IkAnalysis来做。而这两个分析器的方法由于要保持可移植性,所以保持了一致的特点,这个在之前是始料未及的。这样的开发模式也减少了开发者的难度,但是由于要支持可扩展性,尽量不要把原来的StopAnalyzer给去掉,所以,我的构思是在配置文件中进行切换的。而配置文件,即.properties文件是OpenCms推荐的xml形式的配置文件,而OpenCms的配置文件编辑界面是很人性化的。如图3-3就是一个opencms基于搜索引擎的配置界面图 33所见即所得编辑器故这也很容易让IKAnalysis集成进OpenCms。嵌入中文IKAnalysis的时候的注意事项:1、 保持原有代码,并且在提供的接口上进行再重写:保持原来的代码的优势是在于对原来代码的模块化的保持。并且不把自己的代码已有的代码混淆,以便形成模块化的边界,可以支持直接把代码提炼出来就可以移植到其他的Lucene框架的功能。2、 嵌入的时候由于OpenCms的编码格式是Unicode,已经完美支持了各种语言,故在IKAnalysis中也应该把所有的配置的charset改成Unicode,这个经过实验,在IKAnalysis对原来的功能是没有影响的。IKAnalysis使用了正向迭代最细粒度切分算法,这种算法支持细粒度和智能分词两种切分模式,具体的实现效果是这样的:假设句子是“张三说的确实在理”在智能分词的模式下显示的结果是:“张三|说的|确实|在理”最细粒度分词结果:张三|三|说的|的确|的|确实|实在|在理,而第一种的分词所付出的时间代价比较大,第二种方法付出的空间代价比较大。在这二者中选择就要根据现实状况来决定了。故需在配置文件中配置使用哪种模式来支持。这个必须可以在后台进行切换和设置的。 只要记住上面的几个重点。就可以进行OpenCms中集成的Lucene加入中文分词器的工作了。下面的一部分是描述如何加入中文分词器。 而IKAnalyser的优点不仅仅于此:举个例子,用户搜索“永和服装饰品”,对于分词器而言,它会切分出“永和”“和服”“服装”“装饰”“饰品”等。但分词器没有判断的能力(实际上,目前所有的分词器,即便有部分排除歧义的功能,也不完善),如果强制分词器进行排歧义处理,则可能会得出完全错误的结果。IK则是尝试给出所有可能的方案,在IKQueryparser 中,它不是简单的返回所有分词结果的组合,而是建立起一个分词树,将有可能的组合放在一起,它的输出会类似于这样:(“永和” && “服装” && “饰品”) | (“和服”&& “装饰”), 通过这个搜索逻辑去索引中进行匹配,在现实中,我们完全可以假设只有合理的词元会搭配在一起, 那么,不合理的搭配,它的就可能不会出现,或者即使出现,但匹配度较低。 因此,IK3.0又给出了一个IKSimilarity的相似度评估器,来提高多词匹配的优先度,这样的搜索,就能形成高匹配度的文档,出现在前面,低匹配度的在后面,不合理的匹配就不出现的结果。这个也是自己的项目实战经历了。IKSimilarity是实现了lucene Similarity的接口的,在进行搜索前,使用IndexSearch的API进行设置就好,这个在IK3.0的DEMO中有详细的例子说明,至此,IK3.0在尽可能保证文档召回率的前提下,实现了相关文档搜索匹配度的优先。当然,这不能绝对意义上杜绝不正确信息被搜索出来(PS:就目前各大主要搜索引擎的实现也是这样的)。在分词器的设计中,应该说不尽是IK,其他分词器的作者也是绞尽脑汁的想了很多, 但目前还没有特别完美的方案。对IK而言,我也收到了来至各方面用户的反馈,有用在互联网搜索领域的,有用于企业内部搜索的,还有做语言分析的,但就我个人的感觉而言,目前很难在一个分词器中,实现多种目标。和其他的分词器相比:JE-MManalyzer:它的算法具有歧义分析,比较适合做垂直搜索和信息挖掘。他的中文名称是“极易”,开发者的理念是-简单即是美。 中科院的分词器:中科院的分词器很牛,其切分结果明显基于语义分析。 paoding:paoding的结构设计的非常灵活,适合于对其进行开源改造。 mmseg4j:单从mmseg4j 的项目介绍上看,它是一个很纯粹的基于词典分词的实现,既有细粒度的切分,也有最大长度的切分。应该说,是一个学习词典分词的很好的典范。该算法适合与互联网用户的搜索习惯和企业知识库检索,用户可以用句子中涵盖的中文词汇搜索,如用“人民”搜索含“人民币”的文章,这是大部分用户的搜索思维;不适合用于知识挖掘和网络爬虫技术,全切分法容易造成知识歧义,因为在语义学上“人民”和“人民币”是完全搭不上关系的。分词效果:1.实现中文单词细粒度全切分 如:中华人民共和国 0 - 2 = 中华 0 - 4 = 中华人民 0 - 7 = 中华人民共和国 1 - 3 = 华人 2 - 4 = 人民 2 - 7 = 人民共和国 4 - 6 = 共和 4 - 7 = 共和国2.实现对专有名词的识别和切分(人名,公司名) 如:陈文平是XX动力通讯科技有限公司董事长 0 - 3 = 陈文平 <- 人名,非汉语词汇 4 - 6 = XX <- 公司名,非汉语词汇 6 - 8 = 动力 8 - 10 = 通讯 10 - 12 = 科技 12 - 14 = 有限 12 - 16 = 有限公司 14 - 16 = 公司 16 - 18 = 董事 16 - 19 = 董事长 18 - 19 = 长3.对数词和量词的合理切分 如:据路透社报道,印度尼西亚社会事务部一官员星期二(29日)表示,日惹市附近当地时间27日晨5时53分发生的里氏6.2级地震已经造成至少5427人死亡,20000余人受伤,近20万人无家可归。 0 - 1 = 据 1 - 4 = 路透社 4 - 6 = 报道 。 18 - 20 = 官员 20 - 22 = 星期 20 - 23 = 星期二 22 - 23 = 二 24 - 26 = 29 24 - 27 = 29日 26 - 27 = 日 28 - 30 = 表示 31 - 33 = 日惹 33 - 34 = 市 。 40 - 42 = 27 40 - 43 = 27日 43 - 44 = 晨 44 - 45 = 5 44 - 46 = 5时 45 - 46 = 时 46 - 48 = 53 46 - 49 = 53分 48 - 50 = 分发 。 52 - 54 = 里氏 54 - 57 = 6.2 54 - 58 = 6.2级 57 - 58 = 级 58 - 60 = 地震 。 66 - 70 = 5427 66 - 71 = 5427人 71 - 73 = 死亡 72 - 73 = 亡 74 - 79 = 20000 79 - 81 = 余人 81 - 83 = 受伤 84 - 85 = 近 85 - 87 = 20 85 - 89 = 20万人 87 - 89 = 万人 89 - 93 = 无家可归最大匹配分词算法实现类 : org.mira.lucene.analysis.MIK_CAnalyzer效果测试命令行:java -classpath IKAnalyzer.jar;lucene-core-2.0.0.jar org.mira.lucene.analysis.MIK_CAnalyzer 中华人民共和国香港特别行政区 分词效果: 例子:中华人民共和国香港特别行政区 0 - 7 = 中华人民共和国 7 - 14 = 香港特别行政区 例子:据路透社报道,印度尼西亚社会事务部一官员星期二(29日)表示,日惹市附近当地时间27日晨5时53分发生的里氏6.2级地震已经造成至少5427人死亡?,20000余人受伤,近20万人无家可归。 1 - 4 = 路透社 4 - 6 = 报道 7 - 12 = 印度尼西亚 12 - 14 = 社会 14 - 16 = 事务 18 - 20 = 官员 20 - 23 = 星期二 24 - 27 = 29日 28 - 30 = 表示
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!