📄 18.txt
字号:
发信人: zrs (tita), 信区: DataMining
标 题: 基于 Web 的数据挖掘
发信站: 南京大学小百合站 (Fri Mar 22 16:25:47 2002)
自动抽取用 HTML、XML 和 Java 编写的信息
Jared Jackson (jjared@almaden.ibm.com)
Jussi Myllymaki (jussi@almaden.ibm.com)
IBM 研究员
2001 年 6 月
不可否认,万维网是到目前为止世界上最丰富和最密集的信息来源。但是,它的结构使它
很难用系统的方法来利用信息。本文描述的方法和工具将使那些熟悉 Web 最常用技术的开
发人员能快速而便捷地获取他们所需的以 Web 方式发布的信息。
在信息时代快速成长起来的万维网导致各种各样的公用信息被大量分发。不幸的是,尽管
作为信息主要载体的 HTML 提供了一种方便地向读者呈现信息的方法,但它可能并不是一
个很好的可以从中自动抽取与数据驱动的服务或应用程序相关的信息的结构。
已经尝试了多种方法来解决这个问题。大多数方法都采用一些专用查询语言的形式把 HTM
L 页面的各个部分映射成代码,而这些代码将 Web 页面上的信息填入到数据库中。尽管这
些方法可能提供一些好处,但大部分会因为以下两个原因变得不切实际:首先,它们需要
开发人员花时间去学习一种无法在其它情况下使用的查询语言,其次,它们还不够健壮到
能处理不可避免的对目标 Web 页面的简单更改。
在本文中,将讨论使用标准 Web 技术—— HTML、XML 和 Java ——开发的一种基于 Web
的数据挖掘方法。这种方法即使不比其它专用方法更强大,也和其它方法不相上下,并且
对于那些已经熟悉 Web 技术的人来说,只需要付出很少的努力就可以收到很好的效果。另
外,本文还附送了许多开始数据抽取所需的代码。
HTML:优点与缺点
HTML 通常是一个很难用程序手段处理的媒体。Web 页面中的大多数内容描述与数据驱动的
系统无关的格式编排,并且,由于要动态添加标题以及编写其它服务器端脚本,所以文档
结构可能在每次连接到页面时都需要进行更改。又因为所有 Web 页面主要部分的格式编排
不合理,所以使问题变得更为复杂,其结果是现在的 Web 浏览器在进行 HTML 语法分析时
非常不严谨。
尽管存在这些问题,但是 HTML 在数据挖掘方面仍然具有优势。您所感兴趣的数据通常可
以用 HTML 树中深度嵌套的单个 <table> 或 <div> 标记隔离开来。这使得抽取过程可以
专门在文档的一小部分内执行。在缺少客户机端脚本的情况下,只有一种定义下拉菜单和
其它数据列表的方法。HTML 的这些方面允许我们在一旦拥有可用格式的数据时能集中精力
于数据抽取。
背景技术
这里描述的数据挖掘技术的关键是把现有的 Web 页面转换成 XML,或转换成 XHTML 可能
更适当,并使用众多工具中的一小部分来处理 XML 结构的数据,以检索出适当的数据。
幸好有一个解决方案可以改正 HTML 页面设计的薄弱之处。Tidy(可以从一些编程语言中
获取的库)是一个免费使用的产品,可用于改正 HTML 文档中的常见错误并生成格式编排
良好的等价文档。还可以使用 Tidy 来生成 XHTML(XML 的子集)格式的这些文档。(请
参阅参考资料)。
本文中的代码示例是用 Java 编写的,并且在编译和运行它们时,需要在您系统的 class
path 中存在 Tidy jar 文件。它们还需要通过 Apache 项目、Xerces 和 Xalan 使 XML
库可用。这两个库都基于 IBM 提供的代码并分别控制 XML 语法分析和 XSL 变换。这三种
库中的每一个都可从 Web 上免费获取,要找到它们,可以追随上述链接或参考本文后面的
参考资料。理解 Java 编程语言、XML 和 XSL 变换将对您理解以下示例有帮助。有关这些
技术的参考资料,可以在本文后面找到。
方法概述和示例简介
我们用示例的方式来介绍数据抽取的方法。假设我们有兴趣跟踪几个月以来每天不同时间
测得的华盛顿州西雅图的温度和湿度级别。假如,没有现成的软件用于报告此类信息以满
足我们的需求,我们仍然拥有从众多公共网站收集此类信息的机会。
图 1 举例说明了抽取的全过程。Web 页面只有在创建了一个可合并到现有数据集的数据集
后才会被检索和处理。
图 1. 概要说明抽取过程
只需要很少的几个步骤,我们就可以拥有一个收集我们信息的合适而可靠的系统。这里列
出这些步骤是为了提供该过程的简要概述,图 1 中显示的是这一过程的较高形式。
标识数据源并把它映射成 XHTML。
查找数据内的引用点。
将数据映射成 XML。
合并结果并处理数据。
这些步骤中的每一步都将加以详细说明,并将提供执行它们所必需的代码。
获取信 XHTML 格式的源信息
为了抽取数据,当然需要知道可以在哪里找到它。在大多数情况下,源信息是显而易见的
。如果要从 developerWorks 收集文章的标题和 URL,我们将使用 http://www.ibm.com/
developerWorks 作为我们的目标。在天气这个例子中,我们有若干可供选择的信息源。我
们将在示例中使用 Yahoo!Weather,但使用其它信息源也具有同等效果。我们将特别跟踪
URL:http://weather.yahoo.com/forecast/Seattle_WA_US_f.html 上的数据。图 2 显
示了这个页面的屏幕快照。
图 2. 华盛顿州西雅图的 Yahoo! Weather Web 页面
在考虑信息源时,牢记以下这些要素非常重要:
信息源是否是在可靠的网络连接上生成可靠的数据?
信息源从现在起将存在多久?一个星期、一个月或甚至一年?
信息源的布局结构有多稳定?
我们寻求能够在动态环境下工作的健壮的解决方案的过程中,在抽取可用的最可靠和最稳
定的信息源时,我们的工作将是最简单的。
一旦确定了信息源,我们在抽取过程中的第一步就是将数据从 HTML 转换成 XML。我们将
通过构造名为 XMLHelper(由 static helper 函数组成)的 Java 类来完成这一任务以及
其它与 XML 相关任务。这个类的全部信息源可以通过以下到 XMLHelper.java 和 XMLHel
perException.java 的链接找到。随着本文的继续展开,我们将构建这个类的方法。
我们使用 Tidy 库提供的函数在 XMLHelper.tidyHTML() 方法中执行转换。这个方法接受
URL 作为一个参数并返回一个“XML 文档”作为结果。当调用此方法或任何其它与 XML
相关的方法时,请仔细检查是否有任何异常。清单 1 中显示了执行这些操作的代码。图
3 显示了代码结果,Microsoft 的 Internet Explorer XML 查看器使用 Weather 页面中
的 XML。
图 3. 转换成 XHTML 的 Yahoo! Weather Web 页面
查找数据的引用点
请注意,无论是在 Web 页面还是源 XHTML 视图中的绝大多数的信息都与我们完全无关。
我们接下来的一个任务是在 XML 树中找出一个特定区域,我们可从中抽取我们的数据而无
需关心外来信息。对于更复杂的抽取,我们可能需要在单个页面上找出这些区域的若干实
例。
完成这一任务的最简单的办法通常是,首先检查 Web 页面,然后使用 XML。只需要看一下
页面,就可以知道我们正在查找的信息位于页面的中上部区域中。即使对 HTML 的熟悉程
度非常有限,也很容易推断出我们正在查找的数据可能都包含在同一个 <table> 元素下,
并且这个表可能总是包含象“Appar Temp”和“Dewpoint”这样的字,无论当天的数据可
能是什么。
记下我们观察到的内容,现在要考虑页面所生成的 XHTML。搜索“Appar Temp”的文本(
如图 4 所示)说明该文本确实在一个包含我们所需的所有数据的表中。我们将把该表作为
引用点或锚。
图 4:通过查找包含文本“Appar Temp”的表找到锚
现在,我们需要找到这个锚的方法。因为我们正准备使用 XSL 来转换我们的 XML,所以可
以使用 XPath 表达式来完成这个任务。我们将使用以下这个普通的表达式:
/html/body/center/table[6]/tr[2]/td[2]/table[2]/tr/td/table[6]
这个表达式指定了从根 <html> 元素到锚的路径。这个普通的方法将导致我们对页面布局
的修改非常容易遭到破坏。较好的方法是根据周围的内容指定锚。通过使用这个方法,我
们把 XPath 表达式重新构造成:
//table[starts-with(tr/td/font/b,'Appar Temp')]
...更好一些,可以利用 XSL 将 XML 树转换成字符串的方法:
//table[starts-with(normalize-space(.), 'Appar Temp')]
将数据映射成 XML
拥有这个锚,我们可以创建实际抽取数据的代码。这个代码将以 XSL 文件的形式出现。X
SL 文件的目的是标识锚,指定如何从锚获取我们正在查找的数据(以简短跳跃的方式),
并且用我们所需的格式构造一个 XML 输出文件。这个过程实际上比想象的要简单得多。清
单 2 给出了将执行这个过程的 XSL 代码,这些代码还可以作为一个 XSL 文本文件获取。
<xsl:output> 元素仅告诉处理器我们希望的的变换结果是 XML。第一个,<xsl:template
> 建立名为 <xsl:apply-templates> 的根元素以搜索锚。第二个,<xsl:template> 让我
们只匹配需要匹配的内容。最后那个,<xsl:template> 在 match 属性中定义锚,然后告
诉处理器跳到我们尝试挖掘的温度与湿度数据。
当然,只编写 XSL,作业将不会完成。我们还需要一个执行转换的工具。因此,我们利用
XMLHelper 类方法对 XSL 进行语法分析并执行这个转换。执行这些任务的方法分别名为
parseXMLFromURL() 和 transformXML()。清单 3 给出了使用这些方法的代码。
清单 3
/**
* Retrieve the XHTML file written to disk in the Listing 1
* and apply our XSL Transformation to it. Write the result
* to disk as XML.
*/
public static void main(String args[]) {
try {
Document xhtml = XMLHelper.parseXMLFromURLString("file://weather.xml");
Document xsl = XMLHelper.parseXMLFromURLString("file://XSL/weather.xsl")
;
Document xml = XMLHelper.transformXML(xhtml, xsl);
XMLHelper.outputXMLToFile("XML" + File.separator + "result.xml");
} catch (XMLHelperException xmle) {
// ... Do Something ...
}
}
合并与处理结果
如果我们只执行一次数据抽取,我们现在已经完成了。但是,我们并不只是想知道某一时
刻的温度,而是要知道若干不同时刻的温度。现在,我们需要做的是反复执行抽取过程,
把结果合并到单个 XML 数据文件中。我们本来可以再次使用 XSL 执行,但我们将为把 X
SL 文件合并到 XMLHelper 类中最后创建一个方法。mergeXML() 方法允许我们把在当前抽
取中获得的数据合并到包含以前抽取数据的档案文件中。
WeatherExtractor.java 文件中给出了用于运行整个过程的代码。我把程序执行调度任务
留给读者,因为执行这些任务的与系统相关的方法通常比简单的编程方法高级。图 5 显示
了每天运行一次 WeatherExtractor,共运行四天的结果。
图 5. Web 抽取的结果
结束语
在本文中,我们已经描述并证明从目前存在的最大信息来源——万维网——抽取信息的强
壮方法的基本原则。我们还讨论了能够使任何 Java 开发人员花最少的精力和具备最少的
抽取经验就可以开始他们自己抽取工作所必需的编码工具。尽管本文中的示例仅集中于抽
取有关华盛顿,西雅图天气的信息,但是这里出现的所有代码几乎都可以在任何数据抽取
中重复使用。事实上,除对 WeatherExtractor 类进行少许更改外,需要为其它数据挖掘
项目进行更改的代码只有 XSL 变换代码(顺便提一下,它从不需要编译)。
这种方法与想象中的一样简单。通过明智地选择可靠的数据源以及在这些数据源中选取与
内容相关但与格式无关的锚,可以使您拥有一个维护成本低廉,可靠的数据抽取系统。并
且,根据经验级别和要抽取的数据量,您可以在一小时之内就能安装与运行它。
参考资料
Tidy for Java 由 Sami Lempinen 维护,并可从 SourceForge 下载。
XML 库、Xerces 和 Xalan 可以从 Apache Project 网站获取。
有关 XML 的更详细信息,developerWorks 提供了一个与该技术相关的专区。
有关 XSL 和 XPath 的教程有很多,可以使用您喜爱的 Web 搜索引擎找到它们。
Jussi Myllymaki 著有一篇有关 ANDES 系统中 Web 搜寻与数据抽取之间关系的论文,刊
登在香港的 WWW10 上。
这里有一些使网站个性化的技术,以及使站点性能最大化的提示。
“管理网站性能”介绍了如何对网站性能从浏览器到数据库服务器以及旧系统,进行微调
。
关于作者
Jared Jackson 自 2000 年 5 月 Harvey Mudd 大学毕业以来一直在 IBM Almaden Resea
rch Center 工作。Jared 还是斯坦福大学“计算机科学”系的研究生。可通过 jjared@a
lmaden.ibm.com 与 Jared 联系。
Jussi Myllymaki 于 1999 年作为“研究职员”加盟 IBM Almaden Research Center,并
从麦迪逊的威斯康星大学获得博士学位。可通过 jussi@almaden.ibm.com 与 Jussi 联系
。
英文原文
http://www-900.ibm.com/developerWorks/xml/x-wbdm/index_eng.shtml
--
※ 来源:.南京大学小百合站 http://bbs.nju.edu.cn [FROM: 218.0.250.175]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -