第八章 页面分析
在本信息采集的URL和页面的过滤判定过程中,主要处理HTML页面。因此,在页面分析中我们所做的工作主要包括对HTML页面进行语法分析,提取出正文、链接、链接的扩展元数据及其它相关内容;再把这些内容进行简单的加工和一致性处理;最后将处理结果保存在中间信息记录库中以供URL过滤处理和页面过滤处理。
因为采集到页面的语法分析基于HTML(Hypertext Markup Language)协议[RFC 1866]。整个语法分析过程可以看作两个层次,即SGML(标记文法)层和HTML标记层。文法层将页面分解成正文、标记、注释等不同的语法成分,再调用标记层处理正文和标记。同时标记层维护着当前正文的各种状态,包括字体、字型等,这些状态由特定标记产生或改变。
在系统中使用的标记文法分析器的基本原理是:由标记文法构造状态转换表,根据输入流中的当前字符(无需向前看)切换状态,当到达特定状态时执行相应语义操作。这里先介绍几个概念,然后分别讨论对主要语法成分的处理:
l 文本。文本是页面的初始状态,此状态下的所有字符(除了导致切换到其它状态的)都构成页面正文的一部分交由标记层根据当前正文状态处理和保存。
l 标记。标记是出现在正文中以字符“<”开始,字符“>”结尾的一个字符串。语法分析器在遇到“<”后就创建一个标记结构,并将后续的标记名称、标记中的参数等一一填入该结构中,其中参数由多个参数名/值对组成。当遇到“>”表示标记结束,将分析出的标记结构传递给标记层。标记层在根据标记名和参数做相应动作,包括修改正文状态等。若在“<”后紧跟着字符“/”,则表明此标记是个结束标记,分析器区分开始和结束标记,但两者的配对由标记层实现。对标记的处理在后面讨论标记层时会进一步论述。
l 注释。分析器判断“<!”打头的标记并统计模式“--”的个数从而识别页面中的注释,注释直接被忽略而不作任何处理。
l 转义字符。文本中出现的形如“&#nnn”或“&xxx”(末尾可能有附加的字符“;”)的,分析器将其作为转义字符处理,查找相应对照表后将对应字符添加入正文中。
尽管URL已经被预测为和主题相关,但此URL所指向的实际页面却可能与预测结果相差甚远,这就导致了采集到的页面有相当大一部份与主题无关,因此,我们需要对页面进行主题相关性判断,通过判断结果过滤掉无关页面,从而提高整个数据集中页面与主题的平均相似度值,或者说提高基于主题的Web信息采集的准确率。
为此,我们需要在页面分析时提取出页面中的正文。页面的正文提取方法较简单。正文和标记都作为独立的语法成分传递给标记层,标记层根据标记区分出页面标题和内容,并根据系统需要合并出页面的正文。目前还未考虑不同字体或字型的正文的差别。也就是说,在读取页面时,找到标记<body>和</body>,将这两个标记中间的内容去除其中的所有标记即可。
对抓取到的页面需要分析其中的链接,并对链接中的URL进行必要的转换。首先判别页面类型,显然只有类型为“text/html”的页面才有必要分析链接。页面的类型可由应答头分析得出,有些WWW站点返回的应答信息格式不完整,此时须通过分析页面URL中的文件扩展名来判别页面类型。遇到带有链接的标记如<A>、<AREA>、<FRAME>等,就从标记结构的属性中找出目标URL,并从成对的该标记之间抽取出正文作为该链接的说明文字(扩展元数据)。这两个数据就代表了该链接。
对一个页面中的链接提取工作流程如下:
1) 从页面文件队列中取出一个页面文件,如果应答头中未说明文件类型,根据URL中的文件扩展名补充完整。如果页面文件队列为空,跳转到7)。
2) 判断页面是否为text/html/htm/shtml文件,如果不是,抛弃此文件,转入1),否则转入3)。
3) 从文件头按顺序读取文件,遇到如下标记<a href=……> <area href=……> <base href=……> <frame src=……> <img src=……> <body background=……> <applet code=……>等,记录其中的URL连接。如果遇到文件结束符,则跳转到7)
4) 将提取出来的URL链接按照预先定义的统一的格式补充完整。(页面链接中给出的URL可以是多种格式的,可能是完整的、包括协议、站点和路径的,也可能是省略了部分内容的,或者是一个相对路径)
5) 记录下<a href=……> <area href=……> <base href=……> <frame src=……> <img src=……> <body background=……> <applet code=……>等后面对此链接的说明信息。在URL与主题的相关性判定那一章中,我们要用到此信息,并把它定义为扩展元数据。
6) 存储此URL及其扩展元数据,跳转到2)。
7) 页面URL提取完毕。
此算法中,不但提取了已采集页面中的URL,并且同时提取了每个URL的扩展元数据信息,在下一章,我们将看到对扩展元数据的应用。
如图8.1所示,页面中标题的提取分为三步:1).判断正文开始的位置,从文章开头开始,逐段扫描,直到某一段长度不小于设定的正文最小长度,就假定这段为正文中的一段。2). 由正文位置向前搜索可能是标题的一段,根据字体大小、是否居中、颜色变化等特征找出最符合的一段文字作为标题。3). 由所给参数调整标题所在的段,使标题提取更准确。句法、语义、统计分析标题段stTitlePara的前后几段,以准确确定标题段的真实位置;向前或向后调整几段,追加前一段或后一段。
判断正文开始的位置 |
由正文位置向前搜索可能是标题的一段 |
由所给参数调整标题所在的段,使标题提取更准确 |
标题 |
图8.1页面中标题的提取
在基于主题的Web信息采集系统中,最核心的问题就是对从页面分析中得到的URL和这些页面进行主题相关性判定。
从已经采集到的页面中得到的URL很多,其中有相当一部分并不相关于待采集的主题。为了能够在采集的同时能够有效地剪枝,我们需要对已有信息进行分析,预测出URL所指向页面的主题相关度,并对不相关的URL进行剔除。因此,我们也把URL与主题的相关性判定叫做URL过滤或URL预测。根据主题页面在Web上的分布特征Sibling/Linkage Locality,直观的想法是用已采集到页面的主题去预测此页面中链接所指向的页面主题。也就是说,如果本页面与主题相关,则页面中的链接(不包括噪音链接)都被预测为与主题相关,这显然存在着相当大的误预测。进一步的研究发现,每个链接附近的说明文字(例如 anchor信息)对此链接所指向的页面主题有着相当高的预测能力,对预测为相关的链接有很高的准确性。但问题是由于说明文字的信息有限,往往会漏报许多主题相关的链接,或者说在提高了URL预测的准确率的同时,降低了URL预测的召回率(资源发现率)。为了缓解这一问题,我们在预测算法中又加入了由链接关系所决定的链接重要程度这一概念,通过发现重要的链接,在降低相关性判定阈值的同时,选进一些相关度不高但重要性高的链接作为预测,以此来提高召回率,同时又较少的降低了准确率(重要URL往往能够带来更高的召回率)。为此,我们在扩展元数据判定和链接分析判定的基础上,提出了自己判定算法IPageRank方法。
为了进一步提高采集页面的准确率,我们对采集到的页面进行了主题相关性判定,并通过计算此页面与主题的相关度值是否小于判定为相关的阈值来对页面进行剪裁。我们也把页面与主题的相关性判定叫做页面过滤。基于主题的Web信息采集的一个目标就是找到采集的准确率和召回率的最佳结合点。但采集的准确率和召回率(或资源发现率)却是一对矛盾问题,也就是说,在提高准确率的同时,就会降低召回率;反之,提高了召回率,就会降低准确率。一个解决这对矛盾的有效办法就是:先提高采集页面的召回率,也就是降低URL过滤时的阈值(增加无关误判,减小相关误判),使较多的URL进入采集队列被采集;然后在采集到后进行页面与主题的相似度比较,去除无关页面。这样就获得了较高的最终采集准确率和采集召回率。最终,我们选择了经典的向量空间模型对页面与主题之间的相关度进行计算。
下边,我们分别具体论述我们系统中采用的URL与主题的相关性判定算法和页面内容与主题的相关性判定算法。
我们在权衡了性能和效率后,选在了利用扩展元数据加权的IPageRank算法来进行URL与主题的相关性判定。
通过观察我们发现:尽管PageRank方法对发现重要页面有很强的能力,但是它发现的重要页面是针对广泛主题的,而不是基于一个具体的主题。因此,一个被大量无关于主题的页面群指向的页面的PageRank值就比一个由少量相关于主题的页面群指向的页面的PageRank值高,这个现象对基于主题的采集来说是不合理的。但是,对于一个被大量相关于主题的页面群指向的页面的PageRank值高于一个由少量相关于主题的页面群指向的页面的PageRank值这个现象来说,我们却要加以利用。为此,我们对PageRank方法进行了改进:在链接关系的基础上,加入一定的语义信息权重,以使得所产生的重要页面是针对某一个主题的,这就形成了IPageRank算法。
改进的方法主要有两个方面。第一,是对算法中的公式进行改进;第二,是对PageRank算法的启发式步骤进行改进。
首先让我们再看一下PageRank算法的公式:
公式9.1
其中A为给定的一个网页,假设指向它的网页有T1,T2,…,Tn。令C(A)为从A出发指向其它网页的链接数目(当把Web看作一个有向图时,C(A)就是指节点A的出度),PR(A)为A的PageRank值,d为衰减因子(通常设成0.85)。
然后再让我们回顾一下RW算法公式9.2和RWB算法公式9.3:
公式9.2
在公式9.2中,M(url)指与此URL相关的所有扩展元数据集合, 是指扩展元数据中的一个词与主题的相关度。c为用户设定的相关性阈值。
公式9.3
在公式9.3,中T(url)表示包含这个URL的文本,t指文本中的每个词,c与前面一样,为用户设定的相关性阈值,d为用户设定的提升阈值。P1,P2为随机变量,它们在0和1之间变化。
我们发现公式9.1中每一个指向页面A的页面Ti,它的重要度平权地传给了此页面中每一个链接指向的页面,也就是说只有1/C(Ti)的页面重要度传递给了页面A。我们认为,对基于主题的重要性来说,这是不合理的。页面的重要性值IPageRank,在通过链接传递时不应该是平权的,而应该是跟链接连接到的页面主题相关度高低成比例的。因此,我们这样修改公式9.1:
公式9.4
其中,A为给定的一个网页,假设指向它的网页有T1,T2,…,Tn。urlT1,urlT2,…,urlTn分别是网页T1,T2,…,Tn指向A的链接, k1,k2,…,kn分别是网页T1,T2,…,Tn中所含的链接数。IPR(A)为A的IPageRank值,d为衰减因子(也设成0.85)。
通过实验发现,基于扩展元数据的RW算法,尽管判断为相关性页面的准确性很高,但是漏判的相关性页面数量也很高。这样的结果使得判断为相关的页面过少,参加评判IPageRank值的页面数较低,从而会较大的影响IPageRank值的准确性;同时,也会导致相关主题页面的召回率(或者说资源发现率)过低。而基于扩展元数据RWB算法则增加了主题页面的召回率,同时由于提取出的URL较多而增加了IPageRank值的准确性。为此,我们在下面的公式中用基于扩展元数据的RWB算法代替RW算法。
公式9.5
为了区别这两种方法,我们分别称它们为IPageRank-RW算法和IPageRank-RWB 算法。在不加区别时,我们把它们都称为IPageRank算法。
在公式9.1中计算每个页面的PageRank值时,启发式步骤中初始化每个页面的PageRank值都相同(为1),这是因为PageRank方法反映的完全是一种链接关系,它不带有任何语义方面的含义,每个页面只能看作是平权的,初始条件下没有某页面比另一页面更好、某个主题比另外一个主题更优的说法。而对于基于主题的IPageRank算法来说,初始条件下是能够根据与主题的相关性区别每一页面的,这种区别好于不区别。另外,这些初始页面都已经被采集了,它们与主题的相关性可以通过向量空间模型VSM或者扩展元数据算法来计算。因此,我们初始化每个页面的IPageRank值为此页面与主题的相关度。
PageRank算法主要是通过叠代计算一个封闭集中每个页面PageRank值的大小,对搜索引擎检索出来的结果页面重新排序,PageRank值的作用是将重要的页面排在前面。而IPageRank的使用则有所不同,首先IPageRank值的计算也是在一个封闭集合中进行,这个封闭集就是已经采集了的相关主题页面集;算法也是叠代5次左右就停止;并且为了更加准确地得到IPageRank值,一般每增加100页重新计算一遍IPageRank值。,但是,IPageRank值用来预测这个已采集页面集中提取出来的URL的主题相关性,预测方法就是直接通过公式9.4或者公式9.5。
这种使用方式的不同给PageRank和IPageRank带来两点不同:第一,各页面PageRank值一般在叠代5次以内即可收敛(已有人证明),而IPageRank的叠代值由于对公式的改变并不能证明将这一收敛特性继承过来,所以是否收敛目前还不能完全确定的,尽管直觉上感觉是收敛的。显然,这是一个严重的问题,如果不收敛,则IPageRank值并不能准确地反映页面的重要性,从而使得它对URL的预测没有太大意义。第二,PageRank的计算环境是封闭的,应用环境也是封闭的。而IPageRank方法是用已有的页面IPageRank值去计算新的URL的IPageRank值,这种环境不是完全封闭的。问题在于这种不是完全封闭性会不会也导致不能反映URL的重要性而失去方法存在的意义。
我们做如下解释以说明IPageRank算法仍然有效。对于第一个问题,就算IPageRank不能收敛,我们认为叠代五次后的值也非常接近真实值,这样就能起到对待采集页面的预测作用;对于第二个问题,尽管IPageRank的计算环境不是完全封闭的,但相对有较多的已采集页面来说,这种环境的变化是可以忽略的,是与PageRank的环境非常相似的。因此,我们认为IPageRank算法是可行的,可以用来预测待采集的URL队列。
假设Web上有一个主题浏览者,IPageRank(即函数IPR(A))是它访问到页面A的概率。它从初始页面集出发,按照页面链接前进,从不执行“back”操作。在每一个页面,浏览者对此页面中的每个链接感兴趣的概率是和此链接与主题的相关性成比例的。当然浏览者也有可能不再对本页面的链接感兴趣,从而随机选择一个新的页面开始新的浏览。这个离开的可能性设为d。
从直观上看,如果有很多页面指向一个页面,那么这个页面的PageRank就会比较高,但IPageRank值不一定很高,除非这很多的页面中大部分都为与主题相关的页面;如果有IPageRank很高的页面指向它,这个页面的IPageRank也会很高。这样,从“基于主题的浏览者”模型出发的IPageRank函数就在直观上同WEB上的实际情形相对应了。如果有很多主题页面指向一个页面的话,那么说明这个页面值得观看;如果一个重要的主题资源中心引用了一个页面的话,这个页面也是比较重要的,值得观看。
实际上,IPageRank算法不光能使用与基于主题的信息采集,我们认为,在领域搜索引擎中,它对基于关键词的检索的排序也有很好的效果。
我们采用了检索领域非常常用的向量空间模型作为我们系统页面与主题之间的相关性判定方法。实际上,向量空间模型的处理能力较强而且处理方法也较简便。
我们的算法如下:
0).预处理:在采集之前,我们先将描述主题的多个页面进行关键词的提取和加权,学习到属于该主题的特征向量及向量的权重。
1).我们对页面的正文进行分词,除去停用词,留下关键词。并按照关键词在文章中出现的频率,对关键词加权。
2).将此页面的标题分词,并将得到的关键词与文章中的关键词合并,并加重权于这个关键词上。
3).根据主题中的特征向量对页面中的关键词进行修剪和扩充。
4).根据公式9.3计算出页面与主题的相似度其中D1为主题,D2为待比较的页面。
公式9.6
5).根据Sim(D1,D2)值的大小和阈值d进行比较,如果Sim(D1,D2)大于等于d,则页面与主题相关,保留到主题页面库中;否则不相关,删除此页。