`
yuan_xulong
  • 浏览: 87677 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基于逻辑行和最大接纳距离的网页正文抽取

阅读更多

最近由于工作的需要,在网上查找了一些关于网页内容抽取的资料,其中“基于逻辑行和最大接纳距离的网页正文抽取”的算法易于实现且抽取效果较好,故编写代码实现,以下描述该算法。

  算法的基本思路:

  人们在编写HTML网页时,几乎都会遵循这样的规则:

  1.以行为单位编写HTML代码,也就是说HTML中的每一行大都表示一个相对完整的语义。

  2.正文代码通常在物理位置上都会靠得很近,也就是正文代码是连续的,或者是间断连续的。

  3.正文中每一行大都是中文,HTML标签的字数的比率较小。

  4.正文代码中非HTML标签的文字数量较多。

  5.正文代码中一行中超链接长度所占比率不会很大。

相关定义:

  1.逻辑行:按照行来读取字符流,如果在行中“<”符号和“>”相等,则该行是一个完整的逻辑行,反之则不是一个完整的逻辑行,如果不是逻辑行,则需要读入下一行,直至是一个完整的逻辑行为止。

  2.TR(行内文本比率):在一个逻辑行中,不含HTML标签的文本字节数与逻辑行总字符数的比值。经过试验,TR值小于0.42的行不被认为是文本内容,会被过滤掉。

  3.TN(行内文本数):在一个逻辑行中,不含HTML标签的文本字节数。一般情况下,认为TN大于25是一个文本内容,小于25的将被过滤掉,个人使用时,认为使用10比较合适。

  4.LR(行内超链接比率):在一个逻辑行中,超链接的字节数与逻辑行总字节数的比率,一般情况下,认为LR大于0.75的逻辑将不认为是文章内容,将会被过滤。

  本算法可以分为两部分,第一部分来文本预处理,第二部分在第一部分的基础上实现文本抽取。

  1.预处理:有了以上依据还不足以抽取网页正文,比如HTML注释,javascript脚本等非网页正文在很多情况下也会符合上述规则,这就严重影响了正文抽取的准备性。所以在内容抽取之前,需要过滤掉这些明显的非网页正文。具体过滤的包括以下几项:

  (1)HTML内容中<body>之前内容。

  (2)内部样式表内容,即<style>....</style>样式块。

  (3)JavaScript脚本,即<script ...>....</script>。

  (4)HTML注释。

  2.文本抽取:经过预处理后,根据以上设定的几个指标的阀值,很容易可以过滤掉不符合网页正文的逻辑行,留下的文本,即可大致认为是网页正文,为了更形象的说明网页逻辑行的选取情况,可以定义一个数组或其它数据结构,描述如下:FS={f1,f2...fi..,fn},其中i表示网页中的逻辑行,n代表网页逻辑行的个数。fi的值有两个,0,代表该行被过滤,1,代表该行被选取。FS的形式如下:{0,1,1,1,1,0,0,0,0,1,1,0},可以发现,网页中的连续段落经常会有多个,根据“网页中的正文是连续的或者是间断连续的”,可以知道这其中某一段落或者多个段落都是网页正文。但是正文中也有可能包含一些非正文的内容,导致正文中断,所以在此处引入“最大接纳距离MaxAD”的概念,定义:在FS集合中,可以接纳的两个标记为1之间的最大位置之差,在这两个标记中的0可以修正为1。经过测试,发现MaxAD为2比较合适 。根据MaxAD的值,对FS的的集合值进行修正,修正完成后,连续的最长的选取的内容即是网页要抽取的内容。

  原帖见http://www.doc88.com/p-69317315375.html

     

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics