基于nutch的新闻主题搜索引擎的设计与实现毕业论文(编辑修改稿)内容摘要:

一个 jj 文本由下面几个部分构成: Options{}部分:这个部分对产生的语法分析器的特性进行说明,例如向前看的 token 的个数 (用来解除冲突 )。 这一部分是可以省略的,因为每一个选项都山东大学本科毕业论文 7 有默认值,当我们没有对某个选项进行说明时,它就采用默认值。 也可以把这些选项作为 JavaCC 命令的参数来启动 JavaCC,可以达到同样的效果。 分析器类的声明:这个部分指定了分析器类的名字,以及其他类中成员的声明。 这个部分是必须有的。 这个部分的声明如下: PARSER_BEGIN(elassname) Classelassname{ } PARSER_END(classname)[8] 词法部分的声明:这里面有四类: SKIP、 TOKEN、 SPECIALJOKEN、 MORE。 其中, SKIP 用来说明被忽略的串, TOKEN 用来说明在词法层次上识别的 token。 在词法声明部分,以 开头的 token 只是在词法分析时使用,不能作为语 法分析的输入,也就是说,它相对词法分析是局部的。 语法声明和动作代码:这一部分生成的代码会直接插入分析器类声明的结束括号之前。 一般而言,语法中的每一个非终结符都对应一个函数。 以上说明的是 jj 文件的组成部分,下面再说明一下 jj 文件中语法的表示方法。 JavaCC 中的语法表示吸收了 UNIX 中正规文法的一些记号: []:其中的内容是可选的。 +:前面的内容出现一次或多次。 :前后构成的闭区间。 *:前面的内容出现 0 次或多次。 ?:前面的内容出现 0 次或一次。 ~:后面的内容的补。 | :前面或后面。 ():改变 运算的优先级,把其中的内容作为一个整体 [9]。 利用 JavaCC 构造中文分析模块: JavaCC 是根据西方语言的形式文法理论设计的,不能直接解决中文问题。 当仔细研究后,发现所谓的“中文问题”实际上就是如何把上下文无关文法转变为上下文相关文法。 EBNF 当然不能解决这个问题。 通过写入 Java 代码,用各种对象和标志变量制作特殊的“上下文”环境,就可以实现 JavaCC 的中文分词。 山东大学本科毕业论文 8 Nutch 原来的脚本在 TOKEN 段进行了精细的刻画,对于英文单词、主机地址、电子邮件地址、数字、缩写等各种格式都进行了考虑。 只需利用中文 分词功能,直接传入中文句子,得到 ArrayList 类型的返回结果。 因此,所做的工作就是事先分出一个全部是中文的字符串,这一点通过下面的定义实现: CHINESE: (CJK)+ (“”| CJK) CJK: [ “ \u3040” “ \u318f“, “ \u3300” “ \u337f”, “ \u3400” “ \u3d2d”, “ \u4e00” “ \u9fff”, “ \uf900”“\ufaff” ] 上面的 CHINESE 的定义为:由汉字开头,包含汉字或空格的最长的字符串,而汉字则定义为 CJK。 CJK 即中国、日本、朝鲜和韩国使用的中国汉字的总称,全称为 CJK Ideographs(CJK 象形文字 ),这是 Unieode 标准所定义的 [10]。 Tomcat 简介 用户一般通过浏览器进行查询,这就需要系统提供 Web 服务器并且与索引数据库进行连接。 用户在浏览器中输入查询条件, Web 服务器接收到用户的查询条件后在索引数据库中进行查询、排列然后返回给用户。 Web 服务器是在网络中为实现信息发布、资料查询、数据处理等诸多应用搭建基本平台的服务器。 在Web 页面处理中大致可分为三个步骤,第一步, Web 浏 览器向一个特定的服务器发出 Web 页面请求;第二步, Web 服务器接收到 Web 页面请求后,寻找所请求的 Web 页面,并将所请求的 Web 页面传送给 Web 浏览器;第三步, Web 服务器接收到所请求的 Web 页面,并将它显示出来。 我们选择 Tomcat 的原因是因为它不仅仅是一个 Servlet 容器,也具有传统的 Web 服务器的功能,是 Apache 基金会的 Jakarta 项目中的一个核心项目,由 Apache、 Sun 和其它一些公司及个人山东大学本科毕业论文 9 共同开发而成。 由于有了 Sun 的参与和支持,最新的 Servlet 和 Jsp 规范总能在Tomcat 中得到体 现。 本系统中用到的 完整地实现了 和 JavaServer 规范 [11]。 由于 Java 的跨平台特性,基于 Java 的 Tomcat 也具有跨平台性。 与传统的桌面应用程序不同, Tomcat 中的应用程序是一个 WAR(Web Archive)文件。 WAR 是 Sun 提出的一种 Web 应用程序格式,与 JAR 类似,也是许多文件的一个压缩包。 这个包中的文件按一定目录结构来组织:通常其根目录下包含有 Html 和 Jsp 文件或者包含这两种文件的目录,另外还会有一个WEBINF 目 录,这个目录很重要。 在 WEBINF 目录下有一个 文件和一个 classes 目录, 是这个应用的配置文件,而 classes 目录下则包含编译好的 Servlet 类和 Jsp 或 Servlet 所依赖的其它类 (如 JavaBean)。 通常这些所依赖的类也可以打包成 JAR 放到 WEBINF 下的 lib 目录下,当然也可以放到系统的CLASSPATH 中,但那样移植和管理起来不方便。 Tomcat 能处理 Html 页面。 在 Tomcat 中,可以利用 Servlet 提供的事件监听器功能,对应用或者 Session 实行监听。 Tomcat 也提供其它的一些特征,如与 SSL集成到一块,实现安全传输。 Tomcat 与应用服务器的主要区别是:应用服务器提供更多的 J2EE 特征,如 EJB, JMS, JAAS 等,同时也支持 Jsp 和 Servlet。 而Tomcat 功能则没有那么强大,它不提供 EJB 等支持。 但如果与 JBoss(一个开源的应用服务器 )集成到一块,则可以实现 J2EE 的全部功能。 既然应用服务器具有Tomcat 的功能,那么 Tomcat 有没有存在的必要呢 ?事实上,我们的很多中小应用不需要采用 EJB 等技术, Jsp 和 Servlet 己经足够,这时如果 用应用服务器就有些浪费了。 而 Tomcat 短小精悍,配置方便,能满足我们的需求。 Nutch 介绍 系统架构 总体上 Nutch 可以分为 2 个部分:抓取部分和搜索部分。 抓取部分抓取页面并把抓取回来的数据做成倒排索引,搜索部分则搜索倒排索引以回答用户的请求。 抓取部分和搜索部分的接口是索引,两者都使用索引中的字段。 抓取部分和山东大学本科毕业论文 10 搜索部分可以分别位于不同的机器上。 下面详细介绍一下抓取部分组成。 抓取部分是由 Nutch 的抓取工具驱动的。 这组工具用来建立和维护几个不同的数据结构: WebDB, segment, index。 1. WebDB。 是一个特殊存储数据结构,保存被抓取网站数据的结构和属性,只被抓取程序使用,搜索程序并不使用它。 WebDB 存储 2 种实体:页面和链接。 页面表示网络上的一个网页,这个网页的 URL 作为标识被索引,同时建立一个对网页内容的 MDS 哈希签名,跟网页相关的其它内容也被存储,主要包括:页面中的链接数量 (外链接 )、页面抓取信息 (在页面被重复抓取的情况下 )、表示页面级别的分数 Score。 链接表示从一个网页的链接到其它网页的链接。 因此 WebDB 可以说是一个网络图,页面作为节点,链接是边。 WebDB 由以下数据组成: a、爬行数据库 (crawdb):包含所有 Nutch 已知的 URL,这个 URL 是否被爬过,如果被爬过,是什么时候。 b、链接数据库 (linkdb):这里面包含的信息是每个 URL 己知的链接信息。 WebDB 里有 4 个文件,在物理视图上是文件夹: pagesByURL:按 URL 排序的 page 对象数组 pageSByMDS:按 MD5 排序的 page 对象数组 linksByURL:按 URL 排序的 Link 对象数组 linksByMDS:按 MD5 排序的 Link 对象数组 2. segment。 被索引的网页集合。 每个 segment 由 5 个文件夹组成,如果建立了索引就是六个文件夹。 其中每个文件夹是一个 ArrayFile 对象。 Segment 的Fetehlist 保存的是从 WebDB 中生成的抓取程序使用的 URL 列表。 Fetcher 文件夹里保存的是抓取状态信息,输出数据是从 fetchlist 中抓取到的网页。 Fetcher的输出数据先被索引,索引后的结果存储在 segment中。 文件夹 Content里保存抓取回来的网页内容,包括 头信息和其它元信息。 搜索时,如果选查看缓存页面,就从此处读数据。 parse_data 文件夹里保存的是从 网页中解析出来的一些数据,例如元数据。 parse_text 文件夹中保存从网页中解析出来的文本数据。 Segment 的生命周期是有限制的,当下一轮抓取开始后它就没有用了。 默认的重新抓取间隔是 30 天。 因此可以删除超过这个时间期限的山东大学本科毕业论文 11 segment,而且也可以节省不少磁盘空间。 Segment 的命名是日期加时间,因此很直观的可以看出他们的存活周期。 3. index。 索引系统中所有被抓取的页面,它并不直接从页面产生,而是合并很多小的 segment 的索引。 Nuteh 使用 Lueene 来建立索引,但 Lucene 的 segment的概 念和 Nutch 的 segment 概念是完全不同的。 简单来说 Lucene 的 segment是 Lucene 索引库的一部分,而 Nutch 的 Segment 是 WebDB 中被抓取和索引的一部分。 抓取过程详解 抓取是一个循环的过程:抓取工具从 WebDB 中生成了一个 fetchlist 集合;抽取工具根据 fetchlist 从 Web 上下载网页内容;根据抽取工具发现的新链接更新WebDB;然后再生成新的 fetchlist,周而复始。 这个抓取循环在 Nutch 中经常指:generate/fetch/update 循环 [12]。 一般来说同一域名下的 URL 链接会被合成到同一个 fetchlist。 当同时使用方法多个工具抓取的时候,这样做就不会产生重复抓取的现象。 Nutch 遵循 Robots Exclusion 协议,可以用 定义保护私有网页数据不被抓去。 此抓取工具的组合是 Nutch 最外层的,也可以直接使用更底层的工具。 上述 过程分别详述如下,括号内是底层工具的名字: 创建一个新的 WebDB (admin db create) 把开始抓取的根 URL 放入 WebDB (inject) 从 WebDB 的新 segment 中生成 fetchlist (generate) 根据 fetchlist 列表抓取网页的内容 (fetch) 根据抓取回来的网页链接 URL 更新 WebDB (updatedb) 重复上面 35 步直到达到指定抓取层数 用计算出来的网页 URL 权重 scores 更新 segments (updatesegs) 对抓取回来的网页建立索引 (index) 在索引中消除重复的内容和重复的 URL (dedup) 合并多个索引到一个大索引,为搜索提供索引库 (merge) 在创 建了一个新的 WebDB 后,抓取循环 generate/fetch/update 就根据第二步山东大学本科毕业论文 12 指定的根 URL 在一定周期下自动循环了。 抓取循环结束后,生成一个最终的索引 (第 7 步到第 10 步 )。 第 8 步中每个 segment 的索引都是单独建立的,之后才消重 (第 9 步 )。 第 10 步就大功告成,合并单独的索引到一个大索引库。 Dedup 工具可以从 segment 的索引中去除重复的 URL。 因为 WebDB 中不允许重复的 URL,也就是说 fetchlist 中不会有重复的 URL,所以不需要对 fetchlist执行 dedup 操作。 默认的抓取周期 是 30 天,如果已经生成的旧 fetch 没有删除,而又生成了新的 fetch,还是会出现重复的 URL 的。 当只有一个抓取程序运行的时候是不会发生上述情况的。 在爬虫中,抓取是最主要的操作,其作用就是抓取网页,但抓取的单位不是单个网页,而是同属于一个 segment 的网页集合。 下面我们仔细分析下这个类。 Run()函数逐个实例化抓取线程 FetcherThread 对象,然后触发各个线程的 start()函数,在其初始化 threadCount 个线程并等待线程结束后或者出现大的异常后,此函数调用 close()结束输入输出流。 FetcherThread 是 Fetcher 类的一个内部类它继承于 , Thread 类,只有一个实体方法 run()和三个静态函数:handleFetch(), handleNoFetch(), logError()。 ()实例。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。