




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章 信息检索系统及其关键技术3.1 信息检索系统简介信息检索系统是利用信息检索技术(如全文检索等)帮助用户查找特定信息的一种工具。它能够对信息进行正确的表示、存储和组织,同时还提供对于信息的访问方式。在这里,信息的概念很宽泛,它可以是一篇文章,一段文本,一个网页,一封邮件,一张照片,甚至是一些虚拟信息的集合。3.2 信息检索的过程检索的整个过程包括:构建文本库,建立索引,进行检索。1. 构建文本库在开发检索功能前,一个信息检索系统需要做些准备工作。首先,必须构建一个文本数据库。这个文本数据库用来保存所有用户可能检索的信息。在这些信息的基础上,确定检索系统中的文本模型。文本模型是被系统所认可的一种信息格式,这种格式应当具有可识别、冗余度低等特点。当然,在系统的运作过程中,文本数据库的信息可能会不断地发生变化。2. 建立索引有了文本模型后,就应该根据数据库内的文本建立索引。索引可以大大提高信息检索的速度。目前有多种索引的建立方式,采用哪种方式取决于信息检索系统的规模。大型信息检索系统(如百度、google这样的搜索引擎)均采用倒排的方式来建立索引。3. 进行搜索在为文本建立索引之后,就可以开始对其进行搜索。通常由用户提交一个检索请求,该请求被分析,然后在索引中检索并返回结果。3.3 lucenelucene是一个开源全文检索工具包,它是apache软件基金会jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。3.3.1 lucene结构分析lucene作为一个优秀的全文检索引擎,其结构具有强烈的面向对象特征。首先是定义了一个与平台无关的索引文件格式,其次通过抽象将其核心组成部分设计为抽象类,具体的平台实现部分设计为抽象类的实现,此外与具体平台相关的部分比如文件存储也封装为类,经过层层的面向对象式的处理,最终达成了一个低耦合高效率,容易二次开发的检索引擎。lucene的结构和源码组织结构如图3.1所示:图3.1 lucene结构和源码组织结构从图中可以看出,lucene由基础结构封装、索引核心、对外接口三大部分组成。其中直接操作索引文件的索引核心又是系统的重点。lucene的将所有源码分为了7个模块(在java语言中以包即package来表示),各个模块所属的部分也如图3.1所示。3.3.2 lucene索引的建立索引是信息检索引擎工作的第一步,只有建立了索引才能进行信息检索。lucene用document逻辑文件和field域来组织各种数据源。document向lucene提供原始的要索引的文本内容,lucene从document中取出相关的数据源,并根据属性配置进行相应的处理,建立索引。索引过程如下:(1) 创建一个indexwriter用来写索引文件,它有几个参数,index_dir就是索引文件所存放的位置,analyzer便是用来对文档进行词法分析和语言处理的。(2) 创建一个document代表我们要索引的文档。(3) 将不同的field加入到文档中。我们知道,一篇文档有多种信息,如题目,作者,修改时间,内容等,不同类型的信息用不同的field来表示。(4) indexwriter调用函数adddocument将索引写到索引文件夹中。3.3.3 lucene的搜索lucene建立了功能强大的索引机制为搜索服务,这是因为在检索系统的使用中,用户体验最深的还是搜索部分。如果这一部分的性能无法达到用户要求,那么软件就没有太大的意义。搜索过程如下:(1) indexreader将磁盘上的索引信息读入到内存,index_dir就是索引文件存放的位置。(2) 创建indexsearcher准备进行搜索。(3) 创建analyer用来对查询语句进行词法分析和语言处理。(4) 创建queryparser用来对查询语句进行语法分析。(5) queryparser调用parser进行语法分析,形成查询语法树,放到query中。(6) indexsearcher调用search对查询语法树query进行搜索,得到查询结果存放在topscoredoccollector。3.3.4 中文分词中文分词是处理中文信息的基础与关键。由于lucene自带的分词器对英文的分词效果较好,但对中文的分词效果并不如意。为了使检索系统能更好的处理中文信息,本文采用了ikanalyzer作为分词器。ik analyzer是一个开源的,基于java 语言开发的轻量级的中文分词工具包。从2006年12月推出1.0 版开始, ikanalyzer已经推出了3个大版本。最初,它是以开源项目luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的ikanalyzer 3.x 则发展为面向java 的公用分词组件,独立于lucene 项目,同时提供了对lucene 的默认优化实现。ikanalyzer的特性:l 采用了特有的“正向迭代最细粒度切分算法“,具有60 万字/秒的高速处理能力。l 采用了多子处理器分析模式,支持:英文字母(ip 地址、email、url)、数字(日期,常用中文数量词,罗马数字,科学计数法),中文词汇(姓名、地名处理)等分词处理。l 优化的词典存储,更小的内存占用。支持用户词典扩展定义l 针对lucene 全文检索优化的查询分析器ikqueryparser;采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高lucene 检索的命中率。第四章 信息检索系统的分析与设计4.1 系统功能需求随着科技的发展,电脑的应用越来越普遍,人们的学习工作几乎都不能离开电脑。而笔记本电脑由于其轻便和时尚性,受到人们普遍的喜爱。但是,在购买笔记本时,我们需要详细地了解所买型号笔记本的外表及各种功能,为此我们往往要去各个商家挑选。为了方便,需要提供一个专门的笔记本电脑信息查询系统,能让用户轻松的获取各种型号笔记本的详细参数与外观。该系统提供一个良好的用户界面,用户查询时,系统能根据用户查询语句精确地给出查询信息,能够较好地理解用户的查询语句。4.2 系统开发平台设计本系统采用的是eclipse6.5+mysql5.1+tomcat5.5的开发环境。l eclipse是一个开放源代码的、基于java的可扩展开发平台。在开发时搭配使用myeclipse进行开发。myeclipse企业级工作平台是对eclipse ide的扩展,利用它可以在数据库和j2ee的开发、发布,以及应用程序服务器的整合方面极大地提高工作效率。它是功能丰富的j2ee集成开发环境,包括了完备的编码、调试、测试和发布功能,完整支持html css、javascript、struts、spring、sql、hibernate和jsf。l mysql是最受欢迎的开源sql数据库管理系统,它由mysql ab开发、发布和支持。mysql服务器支持关键任务、重负载生产系统的使用,也可以将它嵌入到一个大配置的软件中。本文采用的是当前的稳定版本5.1。l tomcat是一个免费的、开放源码的、支持jsp和servlet的web服务器。tomcat是一个小型的轻量级应用服务器,在中、小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试jsp程序的首选。它运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能。目前tomcat5.5是较稳定的版本,而且eclipse也很好的支持该版本的集成,所以本文采用tomcat5.5进行开发。此外,本系统所应用到的其它开源工具为:struts1.2、spring2.5、hibernate3.1,网络爬虫heritrix1.14.3,网页解析工具htmlparser2.0,全文检索工具包lucene3.0,中文分词软件ikanalyzer3.0。4.3 系统的组成结构整个系统由三个部分组成:网页采集分析模块、索引与数据库模块、web搜索界面模块。其中网页采集与分析分别由开源工具网络爬虫heritrix和网页解析器htmlparser完成;由lucene完成索引系统,并将索引与数据库关联;web查询界面基于ssh框架设计完成。模块组成结构如图4.1所示。图4.1 系统模块结构图4.4 网页抓取分析模块设计4.4.1 站点选择从技术角度看,选择网站的主要依据有:(1) 网站能够被heritrix爬虫抓取。因为有的网站使用了反爬虫技术,防止未经授权的爬虫对面页进行抓取。(2) 网站的信息不是用javascript动态生成的。这种动态生成的内容需要在浏览器中运行生成,是爬虫无法获取到的。(3) 网站的面页结构不应该经常变化,最好是使用一种模版动态生成的。这样有利于在分析面页时,使用较为简单的方式从网页中解析数据。除了上述3点技术方面的因素,在选择网站时,也应当尽量选择那些访问量较大、产品信息比较齐全的网站。这样,有利于数据完整性。基于上述各因素的考虑,本文选择太平洋电脑网()作为主要抓取目标。系统将通过人工分析和爬虫软件抓取太平洋网站的所有笔记本的页面信息和图片,对抓取的网页和图片经过处理后,供建立搜索索引使用。4.4.2 扩展和定制heritrix分析太平洋网站笔记本网页url特点可知:笔记本面页url已/notebook/开头。笔记本品牌面页url的正则表达式为:/notebook/+wd+/ $例如苹果为:/notebook/apple/具体某型号产品面页url的正则表达式为:/notebook/+wd+/d5,6.html$例如苹果macbook pro 15(mc373ch/a):/notebook/apple/411413.html产品详细参数面页url的正则表达式为:/notebook/+wd+/d5,6_detail.html$例如苹果macbook pro 15(mc373ch/a)详细参数:/notebook/apple/411413_detail.html产品页的产品图片url都是以.jpg结尾。通过对网站url分析,可以总结出我们要抓取的面页url的规律,只要抓取产品面页和产品详细信息面页及产品图片即可。因此,要扩展heritrix来实现上述抓取策略。heritrix有多个扩展点,本文选择扩展frontierscheduler来抓取特定的内容。frontierscheduler是heritrix的一个postprocessor,它的作用是将extractor中分析得出的链接加入到frontier中,以待继续处理。扩展代码如下:protected void schedule(candidateuri cauri)/取得uri字符串string url = cauri.tostring();try/uri选择策略/匹配 具体型号urlpattern pattern_model = ppile(model_url);matcher matcher_model = pattern_model.matcher(url);/匹配 型号详细参数urlpattern pattern_detail = ppile(detail_url);matcher matcher_detail = pattern_detail.matcher(url);/url是产品面页/详细参数面页/jpg图片/dnsif(/matcher_detail.find()|matcher_model.find()|url.endswith(.jpg)|url.indexof(dns:)!=-1)getcontroller().getfrontier().schedule(cauri);elsereturn;catch(exception e)e.printstacktrace();finally4.4.3 网页解析工具htmlparser对于抓取到的网页,需要经过解析,提取出需要的信息以便更好的建立索引和创建数据库。本文html解析器是htmlparser,htmlparser是一个开源的java库,它提供接口,支持线程和嵌套的解析html文本。htmlparser提供了两种访问html结点的方法:visitor模式和filter模式,本文采用了filter模式。filter模式通过设置一定的过滤条件,对每个结点进行过滤,返回一个符合规则的节点列表。org.htmlparser.filters包含所有已经实现的filter类型,定义了16种filter。例如要解析一个网页中所有包含图片的链接,分析可得该节点中具有链接标签名”a”,并且它的字节点中还必须包含图片标签名”img”,则过滤器的定义为:nodefilter filter = new andfilter(new tagnamefilter(a),new haschildfilter(new tagnamefilter(img)4.4.4 网页信息结构化在抓取到笔记本产品各种信息的html文本后,需要用htmlparser对html文本解析,得到建立索引所需的各种信息。处理后的的文件如图4.2所示。图4.2 处理后产品的信息格式从图中可以看出文件的格式如下:第一行是笔记本品牌(包括中文和英文名称);第二行是笔记本具体型号;最后一行则是该笔记本的对应图片文件名,图片名是经过hash后的字符串;其余部分则是该笔记本的详细参数。将所有笔记本产品的信息按上述格式存储,以便建立索引。4.5 数据库与索引设计4.5.1 数据库设计本文数据库结构简单,只有一个数据表来存储笔记本产品的各种信息,数据库各字段含义如表4.1所示。表4.1 数据库字段含义字段名字段含义id主键name品牌名称,如”苹果”type型号,如” ibook g4 m9627ch/a”content笔记本产品的详细信息abstractcontent详细参数的摘要,供建立索引时使用创建数据库的sql语句如下:create database searchdb;use searchdb;create table product ( id int auto_increment, name varchar(128), type varchar(128), content varchar(20000), abstractcontent varchar(512),);4.5.2 索引设计在使用lucene建立索引时,需要定义lucene的document格式。索引中的信息应当尽量少,只要能够满足用户检索要求就可以了。本文中,为document构建了4个field:/当前产品在数据库中的idfield indentifier = new field(id,id + ,field.store.yes,field.index.not_analyzed);/产品的品牌field name = new field(name,product.getname(),field.store.yes,field.index.analyzed);/产品型号field type = new field(type,product.gettype(),field.store.yes,field.index.analyzed);/将笔记本产品的name、type、abstractcontent信息综合起来,默认的检索域field all = new field(all,text,field.store.yes,field.index.analyzed);上述4中filed中,前3个与数据库的内容有直接的对应关系,而最后一个filed则是将name、type这两个filed拼接起来并添加了abstractcontent来进行保存,为用户提供一个检索时的默认filed。这种方式占用了索引空间,但却避免了使用多域搜索带来的性能损失,还可提高检索的全面性。4.6 web检索模块设计web检索模块基于ssh设计实现,由struts作为控制器,spring作为业务层,hibernate作为数据持久层,结构如图4.3所示。图4.3 基于ssh的web检索模块结构图从图中可以看出,用户的请求会发送给actionservlet,用户数据通过actionform bean传递给action,由action类来通过spring的ioc容器访问hibernate的dao,dao负责数据库的交互,然后再返回jsp面页将查询结果进行显示。 第五章 信息检索系统的实现5.1 网页抓取的实现在抓取任务开始前,需要对抓取的内容进行详细地分析,确定种子,即开始抓取的网页。本文中为了能尽量获取全部的产品信息,直接将需要抓取的面页(包括产品面页、详细参数面页、图片)的url作为抓取的种子,这就需要找出所有产品的具体url。在太平洋电脑网上提供了站内搜索功能,当输入查询某品牌的笔记本就能得到站内所有该品牌标记本的信息的面页,当然面页中也包含这些笔记本的产品面页的url,这就提供了抓取的种子。依次查询各个品牌的笔记本,将查询结果面页保存到本地,然后用htmlparser解析得到其中产品面页的url,写入种子文件。图5.1 查询结果面页源代码从网页源代码中可以发现解析网页时可以得到该品牌所有笔记本产品的产品面页和详细参数面页的url。其中产品详细参数面页url的节点形如:全部参数在解析时的过滤器为:nodefilter filter = new andfilter(new tagnamefilter(a),new andfilter(new hasattributefilter(target,_blank),new hasparentfilter(new andfilter(new tagnamefilter(div),new hasattributefilter(class,line2);在用htmlparser解析得到过滤的节点后,只需得到该linktag的href属性值即为某一型号笔记本的详细参数面页url,而由于产品面页与详细参数面页的url只相差”_detail”,所以只需将详细参数的url去掉_detail就可得到产品面页的url。这样就可得到该品牌所有笔记本信息面页的url,也即得到了该品牌的抓取url种子。按照上述方法获取所有品牌的抓取种子。在获取抓取种子后,就可以创建heritrix抓取任务。以webui方式启动heritrix任务时的主要配置如下。extractor,它主要用是于解析当前获取到的服务器返回内容,这些内容通常是以字符串形式缓存的。在这个队列中,包括了一系列的工具,如解析html、css等。在解析完毕,取出页面中的url后,将它们放入队列中,等待下次继续抓取。在本文中,使用两种extractor,即extractorhttp和extractorhtml。如图所示。图5.2 extractor配置writer,主要是用于将所抓取到的信息写入磁盘。通常写入磁盘时有两种形式,一种是采用压缩的方式写入,在这里被称为arc方式,另一种则采用镜象方式写入。当然处理起来,镜象方式要更为容易一些,因此,在本文中用镜象mirror方式。如图所示。图5.3 writer配置postprocessor,在整个抓取解析过程结束后,进行一些扫尾的工作,比如将前面extractor解析出来的url有条件的加入到待处理队列中去。如图所示。图5.4 postprocessor配置5.2 建立lucene索引和数据库在抓取网页后,就可以用解析得到的笔记本产品信息文件目录中的文件来填充数据库和建立索引。为了提高性能和简化数据库操作,本文使用了hibernate来进行数据库处理。hibernate对应数据库的pojo类为product类。向数据库中插入记录的代码如下:public int addproduct(product product) throws hibernateexceptionsession session = null;transaction tx = null;trysession = hibernatesessionfactory.getsession();tx = session.begintransaction();session.save(product);mit();catch(hibernateexception e)if(tx != null)tx.rollback();throw e;finallyhibernatesessionfactory.closesession();return(product.getid();建立索引时,遍历产品信息文件目录中的每个文件,通过文件内容建立一个product类,用hibernate将product对象插入数据库。再使用该product 创建定制好的lucene的document,然后调用lucene的indexwriter的adddocument方法,把生成的产品document加入到索引中去。演示代码如下:bufferedreader reader = new bufferedreader(new filereader(productfile);string url = reader.readline();string name = reader.readline(); /获取品牌名string type = reader.readline().replaceall(-, );type = type.replaceall(_, ); /获取型号string imageuri = ;string updatedtime = fname.substring(fname.lastindexof(-)+1, fname.lastindexof(.);stringbuffer content = new stringbuffer();string line = reader.readline();while(line != null & !line.equals(extractor.separator)content.append(line).append(rn);line = reader.readline();imageuri = propertyconfiguration.getproductimagedir() + reader.readline();/生成一个product对象product p = new product(); p.setname(name.trim(); p.settype(type);p.setimageurl(imageuri);p.seturl(url);p.setupdatedtime(updatedtime);string content_str = content.tostring(); /制作产品的信息摘要 p.setcontent(content_str);if(content_str.length() summary_length)p.setabstractcontent(content_str.substring(0, summary_length-1);elsep.setabstractcontent(content_str);/存入数据库,并返回idint id = insertdb(p);/向索引中加入product对象buildindex(p,id);5.3 web查询功能的实现在建立索引和完善数据库后,还不能直接给用户使用,一个真正的信息检索系统还需要一个良好用户界面。所以,还要在数据库和lucene索引的基础上搭建一个合理的web平台,构建一个真正的web信息检索系统。5.3.1 数据持久层的实现数据持久层的开发中,要创建hibernate的持久化类和映射文件,并在spring的applicationcontent.xml中进行配置,然后开发配置hibernate dao层productdao.java。典型代码如下:public class productdao extends hibernatedaosupport implements iproductdao /向数据库中加入对象public int addproduct(product product) throws hibernateexceptionsession session = null;transaction tx = null;trysession = hibernatesessionfactory.getsession();tx = session.begintransaction();session.save(product);mit();catch(hibernateexception e)if(tx != null)tx.rollback();throw e;finallyhibernatesessionfactory.closesession();return(product.getid();/从数据库中
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO/IEC 29110-3-2:2018/AMD1:2025 EN Systems and software engineering - Lifecycle profiles for Very Small Entities (VSEs) - Part 3-2: Conformity certification scheme - Amendm
- 课件模板人物高清
- 综合材料手工培训大纲
- 高考成语教学课件
- 保险新人培训会
- 沃尔玛防损培训
- 广东会计制度自考试题及答案
- 广东国贸自考试题及答案
- 兰州法院考试题及答案
- 课二考试题及答案
- 药肥登记管理办法
- 商混公司生产部管理制度
- 水果供应链协议
- 美容师(皮肤管理师)技能测试题库及答案
- 考古学复习资料与题库
- 铝粉代加工铝锭合同范本
- 餐前礼仪教学课件
- 手术室工人的工作职责
- 拥军活动策划方案
- 社区治理志愿服务课件
- 养老服务机构客户服务管理制度及流程体系
评论
0/150
提交评论