ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:131.57KB ,
资源ID:7060679      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7060679.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(一种全文检索技术的思路和实现.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

一种全文检索技术的思路和实现.docx

1、一种全文检索技术的思路和实现河南农业大学本科生毕业论文(设计) 题 目 一种全文检索技术的思路和实现 学 院 经济与管理学院 专业班级 信息管理与信息系统 2006级1班 学生姓名 刘盈凯 指导教师 王彩霞 撰写日期: 2010 年 5 月 5 日中文摘要为了全面有效的获取到知识,从古到今人们一直在不断的探索各种不同的信息检索方式。本文从信息检索领域的一个小处即从本地文件系统出发的全文检索。本文正文部分首先对全文检索进行了介绍,分析了当前国内全文检索领域发展存在的问题,提出了笔者对全文检索的看法,并根据笔者的思路开发了一套较为完整的系统,在此基础上引出本系统的开发思路,通过流程图辅以实现代码和

2、思路的方式,剖析了程序的核心思路和算法。重点讲述了系统在切词、建立索引、索引同步、检索过程等部分。本系统采用SrpingMVC框架,全面采用面向对象的方式进行开发,设计较为合理。在切词效率和检索效率方面性能优越。可以说是一个较为完善的中文全文检索系统。关键词:信息系统,全文检索,倒排索引 1.引言在图书馆学和情报学领域,信息被定义为事物(Thing)或记录(Record)。信息检索也并不是web所特有的一个研究课题,早在本世纪50年代,当计算机被图书馆等部门用于存储和管理文档时信息检索就作为一个研究领域而诞生了。随着计算机技术的飞速发展,各种全文检索产品也踊跃出现,但几乎所有的全文检索产品都被

3、作为商业机密保护起来了,笔者在阅读了相关理论知识的基础上做了该领域具体的实践工作,并且形成了一个较为完善的全文检索系统,本系统切词采用正向最大模式切词,建立索引采用的是倒排索引技术,排序使用TF-IDF的统计方法,达到的目的就是简单,迅速,准确的找到用户所需要的信息。本检索系统采用java做为实现语言,采用WEB的方式进行信息检索,适用于各种实现静态化的网站系统和文本(包括html,txt,pdf,word)形式的文件系统。本文的索引策略参考了很多资料,其中也包括该领域比较有名的Lucene。总之,搜索将成为编程领域的热门话题。2.全文检索技术和系统开发的背景由于RDBMS自身底层结构的缘故使

4、得它管理大量非结构化数据显得有些先天不足,特别是查询这些海量非结构化数据的速度较慢,在排序方面也存在非常严重的问题。而通过全文检索技术就能高效地管理这些非结构化数据。而全文检索技术正为了解决这些问题而产生的,全文检索是一个全文检索克服了RDBMS的模糊查找的局限性。具有快速,全面的特点。本系统是在全文检索领域的一个尝试,由于知识水平的有限在一些较为关键的地方存在问题。本文将在后文中一一介绍。2.1全文检索的概念和现状一个站点内容积累在万级以上,站内全文检索就会是用户定位最主要的手段,而关键词检索是用户最熟悉的方法。因此基于数据库的传统WEB应用在全文检索需求还是很大的。 但是可怕的%like%

5、数据库操作可能会吃掉数据库服务器90%以上的CPU。Oracle MSSQL等数据库服务器中数据库内置的全文检索基本上都不太适合WEB应用。而数据库另外一个的弊端在于对于条件简单的查询返回结果集非常大:数据库并不知道如何面向用户最关心的的头100条结果进行优化。根据以前的统计:头100条结果往往已经可以满足95以上用户需求。全文检索是一种将文件中所有文本与检索项匹配的文字资料检索方法。目前主流的RDBMS提供了全文检索的功能,检索的效率成了人们关注的重点,目前关系型数据库的检索一般是应用在进行字段查询的系统中,而非全文检索。全文检索是当前搜索引擎的核心技术之一,全文检索是指计算机索引程序通过扫

6、描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先简历的索引进行查找,并将查找的结果反馈给用户的检索方式。这种思想来源于书目索引。目前的全文检索尚缺乏对web后台数据库内容查询的支持,用户所需的深层次信息无法获得,这是一个web搜索引擎目前不能做到的,也是小型网站和信息系统正需要的。本系统在扩展到检索数据库方面留有接口。目前的全文检索大都是商业化的全文检索,web搜索引擎都是商业化的搜索引擎,因为其运营成本极高。另外一种越来越受到关注的全文检索是垂直搜索引擎,垂直搜索引擎可以实现行业内主题的精准搜索。近年来,情报界的学者已经对文献信息

7、检索进行了大量的理论探讨与实践,本系统是在参考了大量的理论文章的基础上进行实践的。目前主流的全文检索模型有倒排索引、署名文件、位图等,其中以倒排索引模型的综合性能最好,应用也最为成熟。本系统使用的是倒排索引模型。2.1.1倒排索引倒排索引是从数目索引中受到启发而诞生的,文本可以用一系列的关键词来描述。倒排索引为每个关键词建立一个索引,关键词是文本中的所有词(根据词库切词而得到)。本系统中使用word表来存储这些关键词,在关键词的属性中存放了本关键词在文章中的位置信息。 基于关键词的的索引过程要借助于“词库”,从文本中分离出有意义的词,也就是去除无意义的词“停止词”。这一过程通常被称为“切词”,

8、对于中文来说,分词算法很不简单。这是索引过程中的关键技术。笔者将在后文详细介绍系统中的实现方法和存在的问题。2.1.2按词检索方法全文检索的方法主要分为按字检索和按词检索两种。按字检索式指对于文章中的每一个字都建立索引,检索时将词分解为字的组合。对于各种不同的语言而言,字有不同的含义,比如英文中字与词实际上是合一的,而中文中字与词有很大分别。按词检索指对文章中的词,即语义单位建立索引,检索时按词检索,并且可以处理同义项等。英文等西方文字由于按照空白切分词,因此实现上与按字处理类似,添加同义词处理也相对容易。中文等亚洲文字则需要切分词,以达到按词检索的目的,关于这方面的问题,是当前全文检索技术尤

9、其是中文检索技术中的难点,本系统在建立索引时为检索提供了较为便捷的方法,即通过TF-IDF算法排序实现和倒排索引的索引模型实现达到快速、准确查找到所需内容。2.1.3 目前该领域的一些研究成果 目前最活跃的全文检索工具就是lucene,lucene是一个相当优秀的全文检索工具包,封装了大量的主要方法。在分词领域有中科院ictclas4j中文分词系统、IKAnalyzer、paoding、等开源分词工具包。这些都是优秀而且成熟的产品。与之相比本系统在切词性能上比IKAnalyzer快,但是比paoding慢,在检索速度上比lucene快。2.2系统目标和技术架构2.2.1系统目标本全文检索系统是

10、为了降低全文检索的难度,本系统适用于中小型不同架构实现静态化的网站系统和基于文件系统的信息系统,这个本系统的首要目的。二是达到面向中文的精确切词。三是保证快速查找到目标数据。这三方面对系统性能要求很高,就是系统应该在检索效率和质量上达到要求。系统本地运行一万组数据测试,每组平均长度为56个字符的情况下,分词用时1.17秒。这是一个比较优秀的成绩。同样的数据使用Lucene和IK分词器需要4.23秒。2.2.2技术架构本系统开发环境为:操作系统:windows xp sp3开发语言:JavaWeb 服务器: Apache Tomcat 6.0.24数据库: Mysql 5.xIDE:MyEcli

11、pse 7.5内存:1GCPU: Intel Pentium Dual-Core E5300 2.6GHZ系统的软件设计架构为 J2EE中的Spring框架。数据库级别的操作中使用原生的JDBC操作,达到最高效的操作,并且大量的使用了批量化的数据库操作。3.系统核心算法实现 全文检索系统包含索引子系统和查询子系统。衡量系统查询质量的标准有查全率和查确率两种。查全率是衡量某一检索系统从文献集合中检出相关文献成功度的一项指标,即检出的相关文献与全部相关文献的百分比。在全文检索系统中,查全率是指检出的相关文献与系统中相关文献的百分比。查确率则用来衡量搜索系统过滤非相关文档的能力。 3.1索引算法及其

12、实现3.1.1切词算法实现目前的全文检索技术,对于亚洲文字来说最理想的分词方法就是基于一个词库的按词进行的分词方法。按词分词是为了进行以词为单位的检索。这个方法的原理就是使用自己已经建立好的词的集合通过一种算法去匹配目标内容,当词库中的词与目标内容的词匹配的时。将词切分出来。这其中词库的建设是一个关键的部分。词库将在对系统内容进行索引的时候发回十分重要的作用。这是因为在对系统建立索引的阶段,索引项是基于词库对被索引内容进行分词操作而取得的。不同行业对词库的要求也是不一样的,因此选择一个适合自己系统的词库是非常重要的环节。随着网络的高速发展,信息资源也向海量方向不断的发展,崭新的术语层出不穷,同

13、时旧的术语概念也被赋予了新的含义。本全文检索系统采用的是自己做的词库,其实词库是搜索的关键因素,本文旨在尝试性的讲清楚思路。本系统词库有大约23万个中文词汇。这是一个极小的词库,理论上讲,词库越大,检索的查全率就越高。本词库虽小但是是一个可扩展的词库,包含了基本词库(base.dic)、计量单位、姓氏、公司企业、地名和国际组织等17种不同种类的词库。在中文里面“的”“在”、“你”、“我”、“他”、“的”等等一些常用词,这些词因为使用频率过高,几乎每个网页上都存在,所以各种检索系统里面都将这一类词语全部忽略掉。还有一些是特殊符号,或者是标点符号,为了系统的安全性,系统将特殊符号当做停止词来处理。

14、本系统共有停止词122个。本系统中切词接口Cutter是文本切割类的根接口,主要有三个方法:一个事将句子切成词返回集合类,一个是设置编码,另一个是关键词高亮的方法。图1中文切词技术属于自然语言处理技术范畴,对于一句话,人可以通过自己的知识来明白哪些是词,哪些不是词,但如何让计算机也能理解?其处理过程就是切词算法。 现有的分词算法可分为三大类:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。本系统采用基于字符串匹配的分词方法,这种分词方法简单,易用,对于构建非商业的全文检索来说。是非常实用的。但是也应该看到,这只是在一定程度上满足了人们的需要,但还远远不够。正向最大切词算法来自

15、于最大匹配算法思想,对于文本中的ABC,AW,ABW,ABC ! W W为词典,那么切词的结果是 AB C。正向最大匹配方法是把一个句子中最长的词给切分出来,下面举例说明这个过程:本文将反复使用下面这句话进行测试:“河南农业大学是一所学风很好的本科院校”。这是本系统中切词算法的执行过程。每次去掉一个汉字字符,直到找到一个在词库中最大的词。下面这段代码完成了正向匹配算法。Override public Collection cutSentenceToWord(String s) ArrayList words = new ArrayList(); while (s != null & s.len

16、gth() 0) boolean isChanged = false; for (int j = s.length(); j 0; j-) String subS = s.substring(0, j); if (dict.isExist(subS) words.add(subS); s = s.substring(j-1, s.length(); isChanged = true; break; if (s.length() 1) s = null; else if (!isChanged) words.add(s.substring(0, 1); s = s.substring(1, s.

17、length(); return words; 测试(JUnit)方法:Testpublic void testCutSentenceToWord() String tString =河南农业大学是一所学风很好的本科院校; SimpleCJKCutter cjkCutter = new SimpleCJKCutter(); cjkCutter.cutSentenceToWord(tString);河南农业大学是一所学风很好的本科院校 (省略部分结果) 河南农业大学是 河南农业大学得到“河南农业大学”一词以后就把河南农业大学这个词放入到存放本语句词汇里面去,切掉“河南农业大学”继续上面的过程直到

18、字符串长度为0为止。这个算法即是正向最大匹配算法。切词技术是信息检索中一个技术非常深的领域。但是这种基于规则的字符串匹配算法的准确率直接与词典相关(即歧义性问题),并且不能识别各种未登录词。所以分词准确度受到很大限制。“相关性”主要是指检索系统针对用户的信息需求从文档集合中检出的文档与用户需求之间的一种匹配关系。这是对“相关性”概念的一种粗泛的描述,切词的效果可以反映出检索程序提供信息相关性的水平。下面是本系统切词结果和商业搜索引擎切词结果的对比: 本切词算法的切词结果:河南农业大学 一所 学风 很好 本科院校 微软Bing的切词结果:河南 农业大学 是 一 所 学风 很 好 本科 院校XX的

19、切词结果:河南农业大学是一的本科 这里只是列出了一个例子,并不能说明检索系统的功能的问题。这个例子达到了笔者的设计要求:能够把句子切分为日常需要的词。 由于语言的不断变化, 新的词语词汇不断的出现,词库的动态维护也是建立检索系统的重要之处。在实际的操作中很难动态的维护词库,而且动态维护词库后对于新增词和已经建立的索引又有不一致的地方。这种机械的切词方法很难做到把语言中的各种意思表达出来。 3.1.2 建立索引 索引操作是所有检索系统的核心概念:为了进行快速查找,就需要把数据处理成一种高效的,可交叉的查找表格式。 大部分信息系统希望对自己的文章内容进行检索,这样会更加准确的检索到所需要的信息。另

20、一种方式是写程序遍历文件系统或者数据库,来匹配所需要的信息。这种做法在数据非常大的情况下效率很低。在图书管管理中对整个图书馆的书籍建立索引可以快速准确的找到每一本图书。同样的,对一个拥有庞大数据的信息系统建立索引页可以快速的找到包含某一个词语或者某一句话的那篇文章。建立索引的过程,在系统中只要调用ISearchIndexService.createIndex();方法就可以建立索引,事实上这是一个比较复杂的过程,这个方法完成的功能是将数据转换为文本,分析文本并将分析后的文本存入索引数据库中。系统中提供了Html转化为文本的方式。对于其他形式的文档,没有提供。Html文本解析使用了htmlpar

21、ser工具包,通过这个开源工具包,可以得到过滤掉Html标签的文本。把文本封装到Page类里,即可实现进行切词建索引的操作,下面的流程图可以明确的说明这些过程。图2系统主要通过以下三个接口来完成建立索引的操作。图2在一个比较完善的信息检索系统中应该实现定时的去更新自己的索引。本系统在定时任务方面做了尝试,但是并没有完成。笔者在这方面的尝试源自于更加开放式的想法,对于一个信息系统文件系统本系统可以检索,对于另一个也是可以检索的。如果实现同时执行不同的任务或者是可以管理不同的任务。这就意味着本系统可以对外提供服务,对不同的信息系统进行服务。这将是一个功能强大的信息检索系统。出于可扩展性的考虑,笔者

22、在索引的过程中增加了一个job的标识,这意味着每一个job都是一个单独的任务。这个标识的添加使本系统变的庞杂而不易控制。3.1.3 排序算法 系统使用了TF-IDF(term frequencyinverse document frequency)统计方法对结果进行排序,TF-IDF是一种用于资讯检索与资讯探勘的常用加权技术。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随著它在文件中出现的次数成正比增加,但同时会随著它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜寻引擎应用,作为文件与用户查询之间相关程度的度量或

23、评级。除了TF-IDF以外,因特网上的搜寻引擎还会使用基于连结分析的评级方法,以确定文件在搜寻结果中出现的顺序。本系统实现了一种得到TF-IDF值的方法。系统中采用对文件频率取对数的公式实现了该统计方法。改方法在Searchservice. calculateTFIDF(double, double)中实现。其getAllPageNum()方法是得到系统中所有文章的数目。 protected double calculateTFIDF(double tf,double pageNum) double idf = Math.log(this.getAllPageNum()/pageNum); d

24、ouble tfidf = tf*idf; return tfidf; 3.2索引数据结构和索引数据存储算法 本小节介绍了倒排索引在系统中的实现方法和数据库操作时的原则。3.2.1索引数据表结构及表之间关联关系建立索引是完成本系统的首要任务也是最关键的任务。本系统提供了page和word两个类,来支持这个索引的过程。下面是这两个类的在数据库中的结构。图3这两给表是系统中索引实体存在的数据表。Page存放了文件的url、内容、标题、拥有词的数量和任务Id(系统扩展)。Word表是保存了系统中所有可以被检索的词的表。其中wordindex最重要,这个字段存放了一个词出现在哪篇文章的哪个位置,以及他

25、的重要性(TF-IDF值)。这两张表反映本系统中采用了倒排索引。Word表中的每一个词都包含了该词语在page表中所有的位置信息,这是一个一对多的关系。倒排索引时信息检索系统中比较通用的做法。3.2.2索引数据插入方法笔者尝试了单条数据插入和批量插入两种方法,得到的结论是,批量插入可能会导致内存紧张,尤其是在进行大量文本批量插入的时候。现在系统采用的策略是每个文本插入一次。对word表进行批量的插入。纵然是单文件插入,也可能导致内存紧张。这与JVM的设置有关。在此不赘述。 在插入的时候系统采用了缓存表的方式对数据进行插入。这种插入方式在更新的时候安全性高。3.2.3索引数据更新方法 在对索引库

26、进行插入的时候,如果库中已经存在某个词语,那么应该更新这个单词所在的那条记录。在笔者的实践中直接把所有的词语项插入word表,可能会导致数据库崩溃。而且这是一个非常复杂的sql语句。笔者选择了使用缓存表的策略。这样会更加安全。索引数据更新的过程:将词语项存入缓存表wordtmp,从缓存表将word表中不存在的数据插入到word表,从wortmp表中删除已经插入到word表的数据,得到临时表中所有在word表中存在的数据,将数据更新到word表中。3.3索引模式实现方法 本系统索引模式有两种,一种是完全模式,一种是增量的模式,两种模式通过实现接口:createIndex(String job,

27、String urls, String indexModel, String indexType , String fileTypes, String jobDir);来完成两种不同方式的任务。参数:Job 任务标识Urls 索引地址数组:例如d:/project/jobx, d:/project/jobx/channel使用绝对路径indexModel 索引模式 indexType 索引文件模式:最大化索引:Constans.INDEX_TYPE_MAX 最小化索引Constans.INDEX_TYPE_MINfileTypes 文件类型 以;分割jobDir: 针对该job的附加索引文件目

28、录说明: Constans : 全局常量类, 系统用到的常量都定义在该类中。3.3.1完全索引模式实现 完全模式是完全的删除本任务下的所有page和word记录重新建立新的索引库。系统中使用Constants.INDEX_MODEL_FULL来代表该索引模式。这个功能是一个全文检索系统所应该具备的基本功能,根据本系统的特点,完全模式实现中不仅仅是删除了索引库中的索引,也删除了相应的索引问标志文件,就是以“.index”结尾的文件。下面流程图清晰的说明了这一完全索引模式任务执行的流程。图43.3.2增量索引模式实现增量索引模式是指在对索引库进行更新的时候采取的一种索引模式,该模式以增量的模式索引

29、用户文件系统,两种文件可以被本模式索引到,一种是经过修改的,一种是用户系统中新增的文件。另外,被删除的文件应该同步的删除其在索引库中的索引。对于用户每一个修改过的文件系统都应该对其重新建立索引,在系统的设计中,每一个被索引过的数据源文件A都有一个在服务器项目根目录下的一个对应的索引文件B,在索引过后,A的修改时间一定小于B的创建时间。如果在索引过后A文件被修改,那么系统应该对其进行重新索引。对于每一个被索引的文件都是如此。被删除的文件应该删除掉其在数据库中的索引,遍历jobDir 中的.index 文件 ,查询与该文件相对应的目标文件是否存在,如果不存在则删除目标文件的索引。图54.检索方法实

30、现信息检索在全文检索中是面向用户的环节,也是全文检索的目的所在。无论系统如何设计,最终都是为了信息检索。为用户提供服务,因此,信息检索是在系统架构基础上,一个全文检索的关键部分,全文检索的好坏对用户来说,取决于检索系统,包括信息检索的界面,功能,响应速度,方便程度,信息更速度等。4.1检索过程本系统信息检索过程可以用下面的流程图来描述。图6 如前文所述,分不同任务的索引是设计本系统时的一个目标,未完全完成。不过带有任务标识的检索方法已经实现。在检索的过程中根据不同的任务进行区分是十分简单的,而且对程序的执行效率没有任何影响。各个任务之间是彼此隔离的。4.2关键词高亮因为系统使用的是同一个切词方

31、法,所以对同一段文字来说系统切词得到的结果是相同的。根据这个原理可以得到如下的关键词高亮方法。参数:text:命中结果 query:用户输入文字 c: 颜色 返回值:加高亮后的命中结果public String highlight(String text, StringBuffer query, Color c) for (Cutter cutter : cutterBox) String sentences = cutArticleToSentence(text); Collection keywords = cutter.cutSentenceToWord(query); StringBuffer tempText = new StringBuffer(text.length() + text.length(); for (String sentence : sentences) tempText.append(cutter.highlight(

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1