(人工智能)基于Lucene与Heritrix的搜索引擎构建(4)
图3.8 系统总体架构
以下是对架构设计的叙述:
(1) Heritrix爬虫系统
主要是应用Heritrix爬虫抓取资源,而这些并不属于这此工程开发任务,所以不纳入设计开发。
(2) 索引建立子系统
主要是建立索引,及其周边一些操作。要设计索引建立子系统,必须要了解索引建立过程,领域模型中已经可以看出此子系统的大概框架,首先要利用文件爬虫将资源目录下的所有文件路径收集起来,再经过文件过滤器将自己感兴趣的文件路径得到,得到的路径经过正文抽取器将数据抽取出来,这样就可以利用抽取出来的数据进行索引建立。在熟悉了搜索引擎建立的过程后,可以对其架构进行设计,可以在流程中看出资源文件就像是一批材料,索引建立子系统就像是工厂,将材料加工输出成品,所以可以将该流程设计成流水线形式,可以将资源路径作为流水线上的材料,疵品被剔除掉,经过流水线的一系列操作后,索引最后输出。
(3) 用户接口子系统
用户接口子系统是用户利用用户接口子系统进行搜索,这部分可能设计到的技术是Ajax,Lucene Searcher等,利用Ajax的用户操作与服务器响应异步化特性,可以实现局部数据传输,只将用户所需要的信息返回即可,这样大大降低了服务器和客户端交互量,用户可以创建接近本地桌面应用的直观、丰富和动态的Web用户界面。
3.3 系统详细设计
在框架设计中,简要的设计出来了各个子系统的整体流程,下面则是对索引建立子系统和用户接口子系统的设计。
3.3.1 索引建立子系统
(1) 实体设计
实体的设计的目的是封装资源抽取出来的数据,这样有利于使用和传递数据。在实体设计的上层是Entity,它继承自Object类,是所有实体的父类。在本项目中只设计了三个实体:Movie、Text和Image,分别对应影视、网页和图片。实体关系图如图3.9所示。 [版权所有:http://DOC163.com]
图3.9 实体之间关系图
[来源:http://Doc163.com]
(2) 抽取器设计
提到正文抽取技术,当今流行的技术有基于分装器的网页文本信息抽取技术、基于统计的网页正文抽取技术和基于数据挖掘思想的网页正文抽取技术。
① 基于分装器的网页文本信息抽取技术,该方法属于传统的网页信息抽取方法。它使用分装器(wrapper)来抽取网页中感兴趣的数据。分装器(也称为:包装器)是一个程序,它根据一定的信息模式识别知识从特定的信息源中抽取相关内容,并以特定形式加以表示。
② 基于统计的网页文本信息抽取技术,该方法克服了传统的网页内容抽取方法需要针对不同的数据源构造不同的包装器的缺点,具有一定的普遍性。该方法对网页正文信息的抽取依赖阈值P和T,阈值P决定了选择网页正文的文本块。
③ 基于数据挖掘思想的网页正文抽取技术,这类方法把数据挖掘技术应用到对网页自由文本的处理中,大大提高对网页正文(文章)抽取的准确率,突破了数据挖掘技术在应用方面对结构化数据的依赖,是一种很好的正文抽取技术。但仍然有一些普遍性问题有待进一步改善。
三种技术中基于数据挖掘的网页正文抽取技术实现难度很大,在此次项目中不加以考虑,所以采用前两种技术。在现今比较流行的开源项目中,HtmlParser是基于分装器的技术,而基于统计的技术要自己来分析设计一种算法。这种算法的开发也是接下来的重要任务之一。
在抽取器设计中,影视和图片的抽取器基于分装器技术,而网页抽取器是基于统计技术,出于这样的考虑是因为影视和图片在网页中的结构比较固定,比如说图片,一般都封装在img标记中,这样利用分装器很容易就可以抽取出来,而对于网页的抽取就不那么容易了,大量的网站中的网页结构不是相同的,存在很大的差异,不适合利用分装器抽取,所以选取了更为便捷的方式,基于统计的抽取技术。抽取器之间的关系图如图3.10所示。 [资料来源:http://Doc163.com]
图3.10 抽取器之间关系图 [来源:http://www.doc163.com]
(3) 中文正文抽取算法设计
对于影视和图片的抽取利用基于分装器的方法,只要目标网页结构比较稳定,并对目标网页进行分析,就很容易利用HtmlParser进行内容抽取。
对于基于统计的方法算法设计思路如下:
设计中涉及的数据结构有树和栈:树用于存储Html文件中每个标记块中的内容,类中应该包含对树节点的一些操作;栈利用栈将Html文件建立数据树。在用输入流读取文件的时候,将开始标记放入栈中,继续读取数据,直到对应的结束标记出现,这个就是一个内容块,将其放入树节点中,这样就可以很方便的将Html文件构造成一树结构。
树结构已经构造出来就可以进行统计分析,将内容块中的正文通过有效算法筛选出来,在这里利用了标准方差,它表示了一组数据的波动性,如果波动越大,方差值越大,反之,方差越小。其实这种方法总结起来就有两个条件:内容块长度相对较大并且除去这个内容块剩下的内容块长度波动相对较小。主要的思路是利用循环,每次都取出当前未选块中长度最大的块作为候选块,再计算剩余块长度的标准方差,上一次得到的方差值(第一次是所有内容块的方差值)与本次得到的值相减,如果这个值是最大的说明它就是含有正文的内容块。
(4) 索引建造器设计 [资料来源:http://Doc163.com]
这里要基于Lucene检索工具包的支持,Lucene提供了从索引建立到搜索的一系列工具,这可以使开发者方便的开发一个索引建立及搜索的框架。提到Lucene,不得不提及其中两个最重要的概念:Document和Field,Lucene将Document设计为逻辑文件,存储各种各样的Field,而Field存储的是数据源的数据内容,任何与索引文档相关的操作都是在Document和Field的基础上完成的。
在Document设计过程中使用Factory模式,DocumentFactory可以根据对象进行识别然后建立对应的Document。
在Lucene索引建立过程中,需要有分析器对数据进行分词过滤。一个标准的分析器由两部分组成一部分时分词器,另一部分是过滤器。一个分析器往往由一个分词器和多个过滤器组成。
提到分词,尤其是中文分词,是建立索引的重点,也是难点,因为中文是世界上最复杂的语言之一,想对中文进行完全精确的分词,能够正确的表达其内在的含义,几乎是不可能的。所以建立索引的重点又落到分词上来。现在比较流行的分词方式有单字分词、二分法和基于词典三种,其中单字就是将中文文本分词时,以字为单位进行切分,但是这种方法需要复杂的单字匹配算法,以及大量的CPU运算;二分法就是将每两个字当作一个词语进行切分,然后建立索引,这种方式会产生一些无词义的词条,这样就会浪费当量的索引空间;基于词典的分词是通过构造一个常用词词典来对所遇到的文本进行词语的切分。Lucene中提供了几种中文分析器其中StandardAnalyzer是基于单字分词技术,另外在中文分词中中科院的ICTCLAS分词是网上被人提及最多的一个分词软件。它是基于词典分词技术。还有一种也在中文分词中应用比较多的就是JE分词,它也是基于词典分词技术,它的亮点在于它提供了API,可以添加新词。在本项目中,将三者都整合了进来。索引建立器关系图如图3.11所示。