师信息页面:在 keyword 中键入关键词 <inurl:faculty -filetype:pdf>,表示搜索 URL 地址中含有 faculty,且文件类型不是 pdf 的结果,site 中键入<(2)中获得的学院地址> “www.ce.cmu.edu”。得到 falculty 的 URL 地址。 2.2 WEB 页面的分析和信息提取 基于 WEB 页面结构分析的包装器利用 Apache 的开源项目——HTMLParser,使用的版 本为 1.6。HTMLParser 是一个简单而功能强大的 Java HTML 解析器库,可以分析和处理 WEB 文档的内容,包括一些通用的服务器端标签。 2.2.1 基类:Extractor.java 基类主要包括三个函数: (1) insert(),向 Lucene 的索引插入课程信息的函数 (2) count(),统计 Lucene 的索引收录的项(document)的数目,以便看出一次运行添加了 多少个课程 (3) getDescription(String url),通过分析指定 link 在 Schedule Of Classes 的 WEB 页面结 构来获得课程简介,算法伪代码见图 2: (4)1. 根据 2.1 获得的 URL 地址初始化 HTMLParser 的分析器 parser,设置编码方式 2. 根据 WEB 页面结构选择适合的 Filter,比如本页面要提取课程简介,则该节点必定含有关键词 Description,因此选用 StringFilter coursefilter = new StringFilter("Description") 3. NodeList nodelist =过滤得到的所有 Description 节点 4. if (nodelist.size() == 0) { //dexcription 不存在,相当于本页不存在,因为只要页面存在就必定含有 Description 结点 return null; //说明本 URL 地址的页面不存在} 5. else(dexcription 存在) { 重置 HTMLParser 的 parser,根据 WEB 页面结构选择更加精确的 filter //通过对页面的源码分析发现课程简介的源码组织方式都为 //<P><font size="2" face="helvetica,arial">课程简介</font> //因此设置用 AndFilter 将 filter 设置为必须同时满足三个条件 AndFilter andfilter =结点名为<font>+有父结点<p>+有 size=2 的属性 nodelist = 过滤得到的符合 andfilter 的所有节点 foreach(符合条件的节点) if (长度(String.length)大于 50) { //课程简介长度字数必大于 50,过滤字数小于 50 的节点 return des; } 图 2 getDexcription()函数伪代码 Fig2 pseudocode of function getDescription()
2.2.2 学院包装器类 CivilAndEnvironmental.java 继承(extends)于 Extractor.java 主要包括两个函数: (1) getTeachers(),通过分析 WEB 页面结构获得教师信息,并存储于 teacherList, 伪代码见图 3:
1. 初始化 teacherList,数据,类型为 ArrayList
2. 根据 WEB 页面结构选择 filter,教师名的结点形式为< strong >教师名< /strong >,因此选用含有 strong
属性的 TagNameFilter filter = new TagNameFilter("strong")
3. NodeList nodelist =过滤得到的所有<strong>节点
4. foreach(节点)
String temp=<strong>节点的 firstChild
if (temp 是教师名字,要过滤掉不以字母开头的节点) {
if(有教师主页信息){
teacher = temp; //提取教师姓名元数据
teacherHome = prefix + first name +后缀.htm; //提取教师主页地址元数据
} else(没有教师主页信息) {
教师主页地址默认为 prefix,不为 teacherHome 赋值
teacher =temp; //提取教师姓名元数据}
将提取到的该名教师的信息加入到 teacherList 中去
图 3 getTeachers()函数伪代码 Fig3 pseudocode of function getTeachers() (2) getCourses(String page, String suffix),通过分析 page 的页面结构获得课程名称以及 教授该门课程的教师的 First Name,然后在 teacherList 中查找教师的全名及教师主页。对每 一个课程,调用基类的 getDescription()获得课程简介。当课程的所有信息都取到值后,调用 基类的 insert()函数,将该课程插入到索引中去。算法伪代码见图 4: 2.2.3 索引维护类 抽取 WEB 页面数据并将写入 Lucene 的索引之后,为了提高精度和准度,编写了索引 维护类。 遍历索引 , DeleteRepeated 删除 name 和 url 两 个值都相 等的项; SelectRealOnesForCMU 根据卡耐基梅隆大学课程编号的统一形式,用正则匹 配 [0-9]{2}-[0-9]{3},(即判断索引中的 name 域的值是否以“两个数字”+“-”+“三个数字”开头), 如果不是,说明不是卡耐基梅隆大学课程的索引项,删除该项。
1. 调用 setInfor()函数,设置了每一门课程的公共信息,本例为学校和学院
2. 初始化 HTMLParser 的分析器 parser,并设置编码方式
3. 分析 WEB 页面结构来选择合适的 filter,课程编号均含有 12-,因此选用
StringFilter courseFilter = new StringFilter("12-");
4. NodeList nodelist =过滤得到的所有课程编号节点;
5. foreach(课程编号节点)
提取元数据课程名称=课程编号节点+“ ”+课程名节点;
提取元数据教师 first name=课程编号节点之后的 nextSlibing 节点,即教师 first name 节点;
教师名=根据 first name 在 teacherList 中查找得到的教师全名;
教师主页=根据 first name 在 teacherList 中查找得到的教师主页;
提取元数据课程链接 = prefix+课程编号(不带“-”)+suffix;
提取元数据课程简介=getDescription(课程链接);
调用基类中的函数将抓取到的课程信息插入 Lucene 的索引
图 4 getCourses()函数伪代码 Fig4 pseudocode of function getCourses() 3.算法性能 以卡耐基-梅隆大学的三个学院为例,来分析本系统算法的查全率 P(Precision),F 度量(F-measure)。 F 度量让用户在查全率和查准率上求得平衡。我们认为垂直搜索应该给用户提供准确的 信息,因此查准率的重要性大于查全率。据此,选择查准率和查全率的重要程度值 =0.5, 代表 P 的重要程度是 R 的 2 倍。 图 5 为 F 度量柱状图的比较。表 1 为 R,P,F 具体的值。从图 5 可以看出,由于本文利用 HTMLParser 进行基于 WEB 页面结构的课程元数据信息抽取,查准率很高,均接近 100%, 查全率均在 95%以上。但是在“课程介绍”这个元数据项上, F 度量明显低于其他域。分析 其原因是课程介绍比其他项在 WEB 页面上的结构有更多变化。 表 1 中,元数据项学校和学院是预设的,因此不作为性能分析的参考项。第一行数据为 Carnegie Institute of Technology(CIT,样本 432),第二行数据为 Mellon College of Sciences (MCS,样本 600,未提供教师信息),第三行数据为 College of Fine Arts(CFA,样本 120)。 表 1 查全率,查准率,F-度量的比较 Tab.1 Comparison of Recall,Precision,F-measure
4.系统实现 本文的 Model-View-Controller 框架的实现基于 Struts1.1。Struts 是开发基于 MVC 模式 的应用架构的经典开源框架,是利用 Java Servlet 和 JSP 构建 Web 应用的一项非常有用的技 术。并且利用 AjaxTags(AjaxTags 项目是在现有的 Struts HTML 标记库的基础上,添加对 Ajax 支持)的 autocomplete 实现类似于 Google Sugget 的即时搜索功能;利用 dom4j 通过对 xml 文 件的读写实现实现“Latest Keywords”(最近搜索关键词)的功能。 索引的建立和搜索基于 Apache 的开源项目——Lucene,使用的版本为 2.2。Lucene 是 一个开放源代码的全文检索引擎工具包,即一个全文检索引擎的架构,提供了完整的查询引 擎和索引引擎,部分文本分析引擎。本文查询的实现调用和扩展于 Lucene 的查询函数,如 IndexSearcher 的 TermQuery 词条搜索,QueryParser 字串搜索 上一页 [1] [2] [3] 下一页
|