一种新闻网页正文信息的提取方法
技术领域
本发明属于网页信息分析处理技术领域,具体涉及一种新闻网页正文信息的提取方法。
背景技术
互联网的飞速发展使网络即Web上的信息量每天都以惊人的速度增加,许多企业常常需要各种信息,通常会从网络上大规模搜集信息,因而海量信息的采集成为每个企业都要关心的问题。因为目前的信息处理技术都是针对纯文本格式的内容的,而Web上的信息主要是以静态Html形式存在的,如何把Web上采集的Html形式的信息转换成有利用价值的文本格式的信息,方便后续的信息处理,成为亟待解决的技术问题。
Web上信息的重要表现形式就是新闻,每天,各大门户网站都会新增大量的各种新闻,如何采集这些新闻信息,就成为Web信息采集的重要问题。通常,一个新闻网页中,除了包括主要新闻的内容(通常称之为网页正文)外,还包括大量的与新闻内容无关的信息(比如广告、网页导航信息、版权信息等,为方便,下面将这些与新闻无关的信息统称为广告),如何从新闻网页中准确提取新闻,去除与新闻信息无关的广告等其他信息,并最大程度地避免由网页改版所带来原网页抓取方法失效的问题也正是目前需要解决的技术问题。
目前网络上绝大部分新闻信息都来自于重要的门户网站,而这些网站的新闻网页往往都是由模版后台生成的,其风格和样式在某段时间内是相同的。目前互联网上的网页绝大部分是用HTML语言编写的。Html语言提供的标记主要是用来控制网页内容的显示格式的,如<table>,<tr>,<td>,<th>是用来绘制表格的;<li>,<ol>,<ul>是用来表示列表的,这些标记的使用没有什么规律,网页设计人员可以随便设计。但是不同种类的数据一般是放在不同的显示单元中的。经过实际分析各大网站的新闻网页,结果显示需要提取的新闻类网页中的正文信息绝大部分是存在于Html标记“<table>”和“<div>”之中的。
传统的网页数据提取方法,是通过包装器来提取网页中感兴趣的数据的。包装器根据信息模式识别知识从固定的信息源中抽取相关内容,并以固定形式加以表示。早期,最简单的包装器是通过人工分析欲提取信息的目标网页的结构特征,然后编写有针对性的软件来实现的,这种方法人工干预大,代价很高;后来又引进了一些模式识别的算法,但至今,包装器所需的信息模式识别知识的获取还是一个费时费力且需要较高智能的工作,因此,目前网页数据抽取研究工作的热点之一就是探索简易的获得构造一个包装器所需规则的有效方法。目前利用包装器的系统有TSIMMIS系统,XWRAP系统等。
TSIMMIS系统中的包装器需要人工来书写数据抽取规则。规则被放在专门的文件中,规则的形式是[variables,source,pattern]。其中,variables保存抽取结果,source保存输入,pattern保存了数据在source中的模式信息;variables可以用作后面的规则的source,文件中最后一个规则执行结束后,variables中保存了最后的抽取结果。这种需要人工书写规则的方法,费时、费力,而且容易出错,不易维护。
XWRAP系统中的包装器采用了半自动化的方法来获取数据抽取规则。它提供了友好的人机交互界面,用户可以根据系统的引导来完成数据抽取规则的编写,最终,系统生成一个针对特定数据源的用java语言编写的包装器。在进行数据抽取之前,XWRAP系统会对网页进行检查,修正其中的不符合规范的语法错误和标记,并把网页解析成一棵树。
上面介绍的几种包装器都是针对某一个固定网页架构来按固定的规则或模式来抽取数据,有比较大的局限性。由于网页结构的复杂性及不规范性,并且一旦网页改版,网页架构改变,原先适用的包装器就不能再适用了,这是包装器的严重缺点,即一个包装器的实现一般只能针对一个信息源。如上所述,目前的网页数据抽取工具,都需要针对特定的数据源来编写对应的包装器或抽取规则。所以,如果信息是来自很多信息源,就需要很多包装器,这样包装器的生成及维护就成了一种复杂的工作。对于网络上大量存在的结构风格各不相同的新闻类网页的正文信息抽取这样的任务来说,使用包装器的代价是很大的。
《基于统计的网页正文信息抽取方法的研究》(中文信息学报,第18卷,第5期)公开了一种新闻类网页正文抽取方法。该方法根据新闻类网页的正文大部分存储在table中的特点,首先对网页进行规范化预处理,然后根据HTML标记把网页表示成一棵树,再找到HTML树中包含的所有table节点,去掉HTML标记,得到不含HTML标记的字符串。如果得到的字符串中所含有的中文字符的数量大于预先设定的阈值,则把该table节点作为候选。最后,对每个table节点按照由它得到的字符串的长度进行降序排序,排在前面的table节点便是需要抽取的正文信息。该方法具有以下不足之处。
(1)采用该方法抽取的正文信息不完整:因为新闻类网页的正文信息不仅存在与table中,而且也存在与div中;此外,新闻的信息不仅包括正文信息,而且也包括标题信息,对于标题信息的抽取,该方法并未涉及。
(2)采用该方法抽取的正文信息不够准确,效率也不高:因为选取候选table节点的方法中阈值的设定很难把握,阈值的大小对于正文信息的抽取影响很大,因此如果阈值设定不合适,则抽取的正文信息将很不准确;即使选取了合适的阈值,仅仅通过将字符串中含有的中文字符的数量大于阈值的table节点就作为候选,这种提取正文信息的方法是不够准确的。此外,阈值的设定需要通过大量的试验,从而也影响了提取的效率。
发明内容
针对现有技术中存在的缺陷,本发明的目的是提供一种新闻网页正文信息的提取方法,该方法对于那些新闻网页的正文均存在于“<table>”或“<div>”之中的数据信息而言,能够实现对由各种不同结构的模版生成的一系列新闻网页的内容的自动提取,能够提高网页信息提取的效率、完整性和准确率。
为达到以上目的,本发明采用的技术方案是:一种新闻网页正文信息的提取方法,包括以下步骤:
(1)对网页进行规范化预处理,使之符合Html语言标准,然后依据Html语言中的<table>和<div>标记,解析所有新闻网页的Html数据,得到Html树;
(2)将由从同一站点抓取的由模版生成的并且时间相邻的两个网页的Html树的各层次数据做对比,把坐标相同,所包含信息也相同的table节点或div节点剔除;
(3)将Html树中各层次的table节点内的数据进行细化识别,区分出标题信息和内容信息;
(4)重组处理后的Html树中各个节点内的数据,提取所需的数据信息。
更进一步,为使本发明具有更好的效果,步骤(1)中解析所有新闻网页的Html数据,构建Html树时,采用如下方法:
1)初始化一个空数组T,用于保存Html树中的各个table结构体;
所述的table结构体用来表示table节点,形式如下:
struct Table
{
此table节点的坐标;
此table节点所包含的信息;
};
上述table节点的坐标即table节点在整个Html树中的位置用一个向量来表示,即每一个table节点均与一个向量v=(n1,n2,n3,...,nk)相对应,v的第i个分量ni的含义是Html树中第i层的第ni个节点;
2)初始化一个栈,设从栈底到栈顶元素依次标记为a[0],a[1],a[2],a[3],...,且0=a[0]=a[1]=a[2]=a[3]=...;并设置一个栈元素指针p,指向栈顶元素,由于初始时栈内没有元素,可假设p指向一个虚拟元素a[-1];
3)扫描待处理的Html文档,如果遇到<table>标记,即遇到一个新的table节点时,将栈元素指针p向上移一格,然后将栈元素指针p指向的元素的值加1,设此时栈元素指针p指向的栈元素为a[k],那么table节点A的坐标就是从栈底元素a[0]到a[k]所构成的序列,即向量(a[0],a[1],a[2],...,a[k]),由此得到table节点A的坐标;
4)如果遇到</table>节点,即一个table节点结束时,将栈元素指针p向下移一格,此时构造一个新table结构体,把当前table节点的坐标和所包含的信息存于此table结构体中,然后把此结构体添加到数组T的末尾位置;
5)如果遇到其它字符,设栈元素指针p指向的栈元素为a[k],那么当前正在扫描的table节点的坐标就是从栈底元素a[0]到a[k]所构成的序列,即向量(a[0],a[1],a[2],...,a[k]),把此字符添加到坐标为(a[0],a[1],a[2],...,a[k])的table节点所包含的信息里。
6)如果还没有扫描到Html文档末尾,则继续扫描,转入第3)步,否则结束,返回保存了Html树层次信息的数组T。
更进一步,为使本发明具有更好的效果,步骤(2)中过滤数据,删除不需要的数据信息时,采用如下的方法:
设C和D是由相同模板生成的两个发布时间相邻的新闻网页,
1)经过步骤(1)后得到网页C的结构体数组为T1;
2)经过步骤(1)后得到网页D的结构体数组为T2;
3)遍历T1中每个table结构体,对T1中每个结构体,设为S1进行如下操作:
a)遍历T2,在T2中找到与S1坐标值相同的结构体,设为S2;
b)判断S1包含的信息是否与S2包含的信息中相同(链接文字除外),则在T1中删除S1,在T2中删除S2。
更进一步,为使本发明具有更好的效果,步骤(3)中将Html树中各层次的table节点内的数据进行细化识别,区分出标题信息和内容信息时,采用如下的方法:
1)对table节点内的结构体,判断该结构体信息中有没有标题元素;
2)如果该结构体的标题元素多于1个,那么取第一个作为本结构体的标题,如果没有标题元素,说明本table结构体标题为空。
更进一步,为使本发明具有更好的效果,步骤(4)中重组处理后的Html树中各个节点内的数据时,采用如下方法:
1)初始化一个空字符串S;
2)遍历table结构体数组T中每个table结构体,把每个table结构体包含的信息添加到S中;
3)删除S中的Html标记,删除Html标记后的S1即为所需提取的新闻网页的正文内容。
本发明的效果在于:采用本发明所述的方法,能够处理从通过模板来生成网页的新闻站点的信息采集任务,能够迅速自动提取目标新闻网页的正文内容,即使网页改版,也不需要重新编写程序,人工干预大大降低,从而极大地提高了网页信息提取的效率、完整性和准确率。
本发明之所以具有以上效果,是由于本发明所述的方法采用了一种的新的解析Html树的方法,可以高效准确地知道Html中每个table节点的坐标和所包含的信息;如果网页改版,也能迅速的解析新模版的树形结构信息,然后比较由新模版生成的网页,仍能准确抽取新闻正文信息。
附图说明
图1是本发明的流程图;
图2是本发明具体实施方式中解析Html树的流程图。
具体实施方式
下面结合实施例及附图,进一步阐明本发明所述方法。
以从新浪新闻的体育频道抓取下来的按时间顺序排列好的1000个新闻网页中提取正文信息为例,如图1所示,一种新闻网页正文信息的提取方法,包括以下步骤:
(1)对1000个网页用第三方网页净化工具(比如可以使用tidy工具),进行规范化预处理,使之符合Html语言标准,然后依据Html语言中的<table>和<div>标记,解析所有新闻网页的Html数据,得到Html树;
解析所有新闻网页的Html数据,构建Html树时,采用如下方法:
由于在本发明中,Html标记<table>和<div>作用是相同,因此本发明以<table>为例来阐述,<div>的情形完全类同于<table>。以如下的Html片段为例(如上所述,只标出所关心的<table>节点,//是注释),阐明本发明所涉及的述语:
<table>//第一个<table>节点开始
Text1
<table>//第二个<table>节点开始
Text2
<table>//第三个<table>节点开始
Text3
</table>//第三个<table>节点结束
Text4
</table>//第二个<table>节点结束
<table>//第四个<table>节点开始
Text4
</table>//第四个<table>节点结束
</table>//第一个<table>节点结束
将每个table开始符(以<table>为标志)和结束符(以</table>为标志)之间的Html内容作为一个table节点,那么从上面的片段可以看出,每个table节点里面还可以嵌套其它table节点,比如第三个table节点里面就嵌套在第二个table节点里面。
如果一个table节点A嵌套在另一个table节点B里面,那么A叫做B的子节点,B叫做A的父节点。
将位于一个table节点A开始符和结束符之间,且不位于此节点任何子节点开始符和结束符之间的Html内容叫做A包含的信息。
将一个table节点所对应的向量称为此table节点在Html树中的坐标。
上述Html片段中,第二个table节点包含的信息为Text2和Text4,第三个table节点包含的信息为Text3。
用直观的形式表达Html树状层次的嵌套信息,即利用一个向量来表示所关心的table节点在整个Html树中的位置。每一个table节点均与一个向量v=(n1,n2,n3,...,nk)相对应,v的第i个分量ni的含义是Html树中第i层的第ni个节点。如果一个table节点对应向量是(1,2,3),那么就说明此table节点是Html树第一层第一个table节点的第二个子节点的第三个子节点。
上述Html片段中第三个和第四个table节点的坐标分别为(1,1,1)和(1,2)。
采用结构体的形式来表示table节点,形式如下:
struct Table
{
此table节点的坐标;
此table节点所包含的信息;
};
将Html文档转换为各个table节点的结构体时,采用如下方法:
1)初始化一个空数组T,用于保存各个table结构体;
2)初始化一个栈,设从栈底到栈顶元素依次标记为a[0],a[1],a[2],a[3],...,且0=a[0]=a[1]=a[2]=a[3]=...;并设置一个栈元素指针p,指向栈顶元素。由于初始时栈内没有元素,可假设p指向一个虚拟元素a[-1];
3)扫描待处理的Html文档,如果遇到<table>标记,即遇到一个新的table节点时,将栈元素指针p向上移一格,然后将栈元素指针p指向的元素的值加1,设此时栈元素指针p指向的栈元素为a[k],那么table节点A的坐标就是从栈底元素a[0]到a[k]所构成的序列,即向量(a[0],a[1],a[2],...,a[k]),由此得到table节点A的坐标;
4)如果遇到</table>节点,即一个table节点结束时,将栈元素指针p向下移一格,此时构造一个新table结构体,把当前table节点的坐标和所包含的信息存于此table结构体中,然后把此结构体添加到数组T的末尾位置;
5)如果遇到其它字符,设栈元素指针p指向的栈元素为a[k],那么当前正在扫描的table节点的坐标就是从栈底元素a[0]到a[k]所构成的序列,即向量(a[0],a[1],a[2],...,a[k]),把此字符添加到坐标为(a[0],a[1],a[2],...,a[k])的table节点所包含的信息里。
6)如果还没有扫描到Html文档末尾,则继续扫描,转入第3)步,否则结束,返回保存了Html树层次信息的数组T。
(2)将由相同模版生成的Html树的各层次数据做对比,过滤数据,删除不需要的数据信息;
在本实施例中,首先将所有网页按时间顺序排序,设网页集合为S,从网页集合S中取出时间相邻的两个网页W1,W2;解析网页W1,W2的Html树,得到每个网页中table节点的坐标和其所包含的信息;比较W1,W2的Html树,过滤数据,删除不需要的信息,具体采用如下方法:
1)经过步骤(1)后得到网页W1的结构体数组为T1;
2)经过步骤(1)后得到网页W2的结构体数组为T2;
3)遍历T1中每个table结构体,对T1中每个结构体,设为S1进行如下操作:
a)遍历T2,在T2中找到与S1坐标值相同的结构体,设为S2;
b)判断S1包含的信息是否与S2包含的信息中相同(链接文字除外),则在T1中删除S1,在T2中删除S2。
(3)将Html树中各层次的table节点内的数据进行细化识别,区分出标题信息和内容信息;
经过步骤(2)后,不需要的广告信息已经被删除,但是还需要对未被过滤的table结构体进行内容的细化识别,识别出标题信息和内容信息,通常新闻的标题一般都以大号黑体形式出现,这在Html中,是通过<th>,<b>,<strong>,<h1>,<h2>等标记实现的,这些元素可称之为标题元素。因此可以采取以下具体步骤,来实现table结构体内容的细化识别。
1)对table节点内的结构体,判断该结构体信息中有没有标题元素;
2)如果该结构体的标题元素多于1个,那么取第一个作为本结构体的标题,如果没有标题元素,说明本table结构体标题为空。
(4)重组处理后的Html树中各个节点内的数据,提取所需的数据信息。
由步骤(1)得到的table结构体数组T经过步骤(2)和步骤(3)的处理后,数组T里面的每个结构体的信息都已经被识别了,下面要做的就是把这些数组T里面的每个table结构体所包含的信息合并起来,可采用如下方法:
1)初始化一个空字符串S;
2)遍历table结构体数组T中每个table结构体,把每个table结构体包含的信息添加到S中;
3)删除S中的Html标记,删除Html标记后的S1即为所需提取的新闻网页的正文内容。
试验效果证明,本方抓取新闻网页的准确率很高,在存在改版情况下,仍能达到98%以上的准确率,而且时间效率高。
本发明所述的方法并不限于具体实施方式中所述的实施例,本领域技术人员根据本发明的技术方案得出其他的实施方式,同样属于本发明的技术创新范围。