您好,欢迎访问三七文档
1文本搜索摘要:在java环境中使用Lucene搜索库实现对网页的分析和处理并建立索引表,提供查询的接口;分词器采用的是IKAnalyzer,同时具有中英文分词和停用此删除,而且在提供现有的IKAnalyzer分词器上做了小的改动加入了PorterStemming(通过调用函数来实现)。一、开发环境的选择:1.用C#对文本进行处理可用正则表达式来处理英文文档实现文本提取的功能,并进行统计和排序。要进行简单的中文分词只能把文本分为一个字或两个字一段,在此基础上改进的研究中文的语言规范等,而且文本处理之后的倒排表的建立如果用简单的数据结果来实现比较复杂。2.在多重条件的限制下为了快速实现功能,选择现有的搜索库是一个不错的选择,Lucene是一个开源的库,使用也非常的方便,因此用Lucene.net能够快速实现建立索引表和查询的相关的功能。3.为了实现较好的中文分词效果决定采用IKAnalyzer分词器来实现分词的功能,由于IKAnalyzer分词器基于java平台的分词工具没有发布基于.Net平台的版本,从而得出在用java来实现文本搜索是一个快速方便的选择。二、用到的开发工具:Java平台:Java开发工具:eclipse-java-indigo-SR1-win32、搜索库:lucene-4.0.0、分析器:IKAnalyzer2012FF_SRC、索引查看工具:lukeall-4.0.0-ALPHA后期建立服务器做搜索页面:myeclipse-8.6.1-win32、apache-tomcat-7.0.22网页下载工具OfflineExplorerEnterprise6.4.3860ServiceRelease1三、文本搜索的框架2图1四、开发过程:1.英文网页的分析处理:1.1文本提取首先要对网页进行分析处理,在进行分词之前去掉网页的标签以及网页上的一些与我们的文本搜索无关的信息。网页的文本提取有很多的方法例如:lucene项目中的Tika,功能非常的强大,支持office文件、压缩文件、等等很多的文档格式(后期改进可以考虑采用此工具)。由于本文只研究对HTML文件的处理所以只需简单的实现删除网页标签即可,采用正则表达式的方法只用一条语句即可实现非常的方便。将html文档通过以字符串的方式读入,让后通过正则表达式处理,处理前后的效果如图1.1.1、图1.1.2所示。标签都被去掉了,只剩下有用的文本信息。达到了文本提取的功能。提供的图片1.1.1和1.1.2的效果并不是最终效果,还有很多的标点符号没有去掉,需用正则表达式去掉。图1.1.1去掉网页标签前后对比(1)3图1.1.2去掉网页标签前后对比(2)1.2英文分词和去停用词建立索引之前要进行分词,将字符串数组分割为单个的单词,英文单词之间使用空格隔开的因此分词时在空格的位置断开就可。在搜索库lucene中自带了一系列的分析器可以用来对进行文本的单词解析。本文采用的是基于java语言开发的清量级中文分词工具包IKAnalyzer。主要是因为IK对中文的分词效果比较好,使用起来也比较方便。只要将中文停用词、英文停用词以及保留词的三个字典配置到工程中,IK会自动调用进行停用词的删除。如图1.2.1所示,英文分词和停用词的删除的测试效果。从图可以看出字符串中的单词被提取出来而且一些没有实际意义的停用词在这个过程中北去掉了。图1.2.1英文分词1.3英文文本词干提取英文由于时态和词性的不同,单词也会存在差异,这些存在差异的词如果都建立索引,那么会使索引变得比较大,而且这样也不利于索引的建立和用户的查询,大约在几十年前,NB的前人就想出来一套算法来名叫:porterstemmingalgorithm根据这套算法,可以较好的将词性不同的词转化到一个相对的“词根”上来。lucene没有设计专门的porterstemminganalyzer,而是给出了一个filter:PorterStemFilter,这个filter就实现porterstemmingalgorithm算法。可以结合IK分词器,让IK也具有stemming的功能。4图1.3.1词干提取如图1.3.1所示二者结合后的效果,可以看出porterstemming只能实现将单词缩减为词根形式的stemming功能,如:allows变为allow,windings变为wind,connected变为connect有的单词分出来之后不是单词的词干,如:incorporated变为incorpor,generated变为gener,但是这不影响搜索,因为在建立索引和搜索的过程中我们会使用相同的分词器。将单词转变为词根形式,如“drove”到“drive”等。这种操作称为:lemmatization,需要词典的支持,本文不作考虑。构建自己的能过实现stemming功能的分词器,可以在IK的基础上修改代码来实现:如图1.3.2所示。图1.3.2自定义分析器2.中文网页的处理:2.1去标签和英文网页的处理一样,首先要去掉网页的标签和一些网页的控制信息。中文网页的处理效果如图2.1.2所示。从图可以看出并不是“”与“”之间的信息都是有用的,script和style标签同一般的html标签的处理方法就不一样,应该先用如图2.1.1所示的正则表达式过滤这两项再去掉其余的标签,不然会受影响。当然如果可以写出更好的正则表达式会使程序更加的简洁。如果只对中文去标签标点都可以去掉,但是考虑到中英混合的网页的存在,所以去标签是用空格代替,这从图2.2.2上表现出来的就是提取的文本中间有空格,这是因为原先空格的地方存在网页标签。5图2.1.1正则表达式图2.1.2删除网页标签前后对比2.2中文分词和去停用词图2.2.1StandardAnalyzer处理前后对比如图2.2.1所示为lucene库自带的分词器StandardAnalyzer(Version.LUCENE_40)的分词效果图,从图可以看出标准分词器对中文的分词支持并不好,只是把中文分为单个的字,常用的停用词也没用去掉。图2.2.2CJKAnalyzer处理前后对比如图2.2.2所示为lucene库自带的分词器CJKAnalyzer(Version.LUCENE_40)的分词效果图,从图可以看出CJK分词器对中文的分词支持也不好,只是把中文分为两个两个的字组成的词,不只常用的停用词也没用去掉而且还产生了大量的不存在的词。图2.2.3IK处理前后对比6如图2.2.3所示为IK分词器的分词效果图,从图可以看出IK分词器对中文的分词支持不错,分词的结果比较令人满意,而且通过加入停用此表使得大量的无用停用词也能够很好的进行删除处理。利用lucene自带的分词器StandardAnalyzer(Version.LUCENE_40)、CJKAnalyzer(Version.LUCENE_40)与IK分词器的分词效果进行分对比分析可以看出IK分词器可以取得比较好的结果,本分的分词选用的就是IK分词器进行分词。2.3.建立索引表文本处理后就可以通过lucene建立索引表,为查询做准备。创建索引就是将要搜索的数据源的那些信息作为我们的关键信息来存储或者是分析,为搜索留下标记,使用索引就是在搜索的时候根据索引的信息来分析数据源将我们需要的信息提取出来。Lucene中建立索引的方法:源字符串首先经过analyzer处理,包括:分词,分成一个个单词;去除stopword(可选)。然后将源中需要的信息加入Document的各个Field中,并把需要索引的Field索引起来,把需要存储的Field存储起来。将索引写入存储器,存储器可以是内存或磁盘。由于本文在文本预处理之后直接建立索引并查询,因此没有必要在预处理结束之后将文档保存下来再读入加入索引,这样做会降低程序的效率而且增加了文档路径查找的复杂度(在得到查询结果之后,希望能够点击链接来打开原始文档,中间如果保存一次的话需要做路劲的转换)。因此在本文中在文本处理之后就直接进行了分析并添加到了文本。将文件添加到索引的函数如图2.3.1所示。7图2.3.1文件添加到索引的函数图2.3.2索引视图Luke是一个索引查看工具,用lukeall-4.0.0-ALPHA.jar查看索引效果如图2.3.2所示。有了添加文件到索引的函数就可以在此基础上进一步写出添加文件目录中的所有文件到索引的函数,如图2.3.3所示。8图2.3.3目录中文件添加到索引的函数2.4.查询第一步利用IndexSearcher打开索引文件用于后面搜索,其中的参数是索引文件的路径。第二步使用QueryParser将可读性较好的查询语句(比如查询的词lucene,以及一些高级方式luceneAND.net)转化为Lucene内部使用的查询对象。第三步执行搜索.并将结果返回到hits集合.需要注意的是Lucene并不是一次将所有的结果放入hits中而是采取一次放一部分的方式.出于空间考虑。如图2.4.1所示为搜索字符串的函数。然后将搜索的结果进行处理并在页面上显示出来9图2.4.1搜索接口2.5.高亮显示在查询的基础上添加稍作修改就可实现高亮的功能,lucene中高亮显示的方法可以从文本中提取与搜索词匹配的字符串片段组合输出,有不错的效果。当然本文中的高亮显示没有匹配字符串背景高亮的功能,是可以进一步修改的地方,实现高亮功能函数的一部分如图2.5.1所示publicstaticvoidhighlight(StringlightStr)。10图2.5.1实现高亮查询的效果测试:图2.5.2搜索结果(txt)保存到html文档,用浏览器打开显示结果:图2.5.3搜索结果(浏览器)2.6添加文档将lucene包下面的docs目录下的帮助文档大约有5000多个网页文件添加到索引。由于lucene的帮助文档没有检索的功能,加入索引后也可给查询带来方便。如图2.6.1所示“lucene”在处理后索引表中的对应词为“lucen”。但是由于搜索和建索引用的是相同的分词方法,所以不影响搜索,搜索结果如图2.6.2所示。11图2.6.1索引视图图2.6.2对“lucene”的搜索结果之前由于要用到porterstemfilter时由于对lucene的目录结构不是很熟。所以找不到org.apache.lucene.analysis.en.PorterStemFilter这个包,因为他不在常用的核心包里面,想参考PorterStemFilter的用法与遇到了困难。如果能够搜索就会很方便。如图2.6.4所示,很快就能定位。图2.6.3对“PorterStemFilter”的搜索结果12图2.6.4在浏览器中打开搜索结果通过离线浏览工具以百度新闻为起点下载大约700个中文网页也添加的索引,如图2.6.5所示,可以看出排在在最靠前的基本都是数字。13图2.6.5中文索引搜索“人民日报”查看搜索结果如图2.6.6和2.6.7所示。有93个命中结果,我们在程序中取出其中的10个输出。图2.6.6搜索“人民日报”结果14图2.6.6搜索“人民日报”结果(浏览器打开)7.后期服务器的建设为了获得像goole和百度良好的搜索界面,较好的显示搜索结果和提供方便的搜索入口,就要建立服务器有服务器分析网页动态返回给用户。(如果桌面程序就可以不用这个了)在myeclipse中配置Tomcat可以产生动态网页,如图7.1所示。图7.1动态网页产生例程五、总结在此设计过程中了解了搜索引擎的基本框架,学习了lucene库的基本原理和用法,基本完成了一个文本搜索的框架。但Lucene的内容远不只这么多,在15每一个细节都有很多不同的方法,如文档排序,多个词的搜索等。本文为了追求快速的建立框架所以只参考了lucene中帮助文档的最为基本的用法。明白了做研究是一个逐步求精的过程。而且在写此设计报告中发现了本课题中的大量的问题和不足,即使在报告的写作上也有很多不详细的对方。在做搜索界面时,由于没有java的基础之参考网上的资料做了一些配置,但在web中使用已做
本文标题:文本搜索
链接地址:https://www.777doc.com/doc-3684510 .html