< type=text/javascript> The concept is rather simple: use information about the density of text vs. HTML code to work out if a line of text is worth outputting. (This isn’t a novel idea, but it works!) The basic process works as follows:
原文链接:
http://www.beijing-open-party.org/
大体上看,目前的文字抓取方式,无外乎以下三种方法:
基于文本密度算法的实现,是上述的标签特征类别的方法。基本公式:纯文本字符数/HTML源码字符数。 原始方法:
使用Python的matplotlib对统计的结果进行图示查看,从直方图中直观地可以发现,网页中有一部分的文本密度明显高于其它部分。在整个 过程中还可以使用Tidy软件包来清理HTML代码,实例中演示的Sina页面,使用Tidy进行清理后进行识别的效果要好很多。 从实际状况出发,对算法进行小调整:从以前的文本前后判断,变成标签前后判断。 优点:数据的整体性更好。 整个实现方法所使用的代码量:加入注释以及模式过滤的原脚本大约有200多行Python代码,如果是根据网上论文的原始实现,大约100多行 Python代码。 所参考、的论文中描述的人工智能文本识别方法:
神经网络模型的算法,可以采用机器进行学习的方式进行。不过要注意,学习所采用的原料和实际使用中所针对的目标相似度的关系也很重要。学习的量较 少,可能会达不到完成任务 所需的精度;而学习量过大,出现”过学习”的状况,也可能会出现过度吻合,从而导致对目标数据的变化非常敏感。 其它智能方法,针对HTML标签序列:
不过为了达成我们的目标,找到最窍门的地方,才是最关键的。比如在很多应用场合下,看似粗旷的’一刀切’方法可能效果也非常不错。 这里介绍的自然语言识别只是一个具体的分支应用,而这个大领域还包括很多其他的内容,如逐渐变热的分词技术,也是值得关注的。 总的来说,自然语言识别技术需要根据应用领域、应用环境来提供相应的解决方案。没有银弹! 我一知半解的记录肯定略有偏差,想要详细了解此内容的朋友(如查阅上文提到的论文等内容),欢迎访问宋博士”提取HTML文档正文“的页面以及他的Blog访问详情。
宋博的原文我也先给贴出来,地址:http://www.elias.cn/MyProject/ExtMainText ExtMainText —— 提取html文档正文1. 简介这是一个使用Python语言实现的函数库,能够帮助从html文档中提取文档正文,换句话说也就是能够过滤页面上的广告、栏目导航等非正文内容。 此函数库可以用在从其他网站抓取文章内容的过程中,以及帮助搜索引擎抓取器忽略无关内容,将页面分析集中到网页更有价值的部分。 函数实现的基本原理是“正文标签密度法”,0.2版本计算网页每个html标签下的“正文长度/标签下所有字符总 长”,取文档中密度高于制定阈值的最长部分作为文档正文输出。原理见:The Easy Way to Extract Useful Text from Arbitrary HTML。 对不同网站,因其语言特征及模板外观设计不同,而应当分别指定不同的密度阈值,具体应该根据所有标签的密度分布状况 实验确定。一般英文网站可以取阈值0.5,中文网站使用0.5作为阈值同样能得到不错的输出结果。
函数最终输出的是包含文档正文的html片段,如果需要将提取的正文内容进一步转换为text 纯文本内容,则可以调用html2text。 English Doc, See: En.ExtMainText 2. 脚本下载
2.1 更新记录
3. 使用说明作为库函数使用时可参照源代码的DocString以及“ if __name__ == '__main__' ”部分。也可以直接运行此脚本文件:
python ExtMainText.py 输入的html文件名
另外请注意输入的html文本的编码,在0.2a之后的版本只接受unicode文本作为输入,因此需要提前完成对 输入文档的解码。 4. 后续改进方向相对于固定阈值,使用神经网络等智能方法能够获得更为准确的输出,建议参考也谈网页正文提取[下]以及赖勇浩先生翻译的从HTML文件中抽取正文的简单方案。 5. 与其他实现的比较也谈网页正文提取[下]和The Easy Way to Extract Useful Text from Arbitrary HTML两 篇文章的非人工智能算法的部分(也就是使用静态阈值方法来提取文章正文)在算法和代码实现上都是完全一样的。虽然都是使用文本密度来识别文章正文部分,但 他们对文本密度的计算方法和我的还是存在一定区别,这里以我个人的理解进行简单的比较分析。 他们在计算文本密度时,从头至尾逐步解析html,当遇到一行纯文本内容时,以这一行纯文本的长度作为“文本长 度”,以这一行纯文本结束位置到上一行纯文本结束位置在原始html中所跨越的字符总数作为“字符长度”,并用两者的比值作为文本密度的值。这种计算方法 存在一定的不合理性。从物理意义上来讲,“字符长度”应该是与修饰一段纯文本相关的html代码 总长。但他们的计算方法是将纯文本之前的html标签作为其修饰成分,对于前后匹配的html标签来说,特别是纯文本被括在多层表格 及<div>标签之内的情况,不能保证将各层标签的结束标签算作此段纯文本的修饰内容,相反却很可能将之计算为下一行纯文本所对应的字节长度 组成部分。在极端条件下,也即分析第一行纯文本时,算法会将之前的所有html标签算作字节组成部分,也即包含了<head>部分,这不合理 地极大地降低了密度的取值。虽然扫描一般html页面遇到的第一行纯文本通常是菜单或者导航部分,需要作为正文提取的可能性不大,但这种算法实现方法与其 预期体现的物理意义不能很好地吻合。 我的实现则将每个html标签下涵盖的所有内容作为整体来分析,比如对一个<div>标签,算法将此起 始标签与其对应结束标签之间包括的所有纯文本内容作为“文本长度”,包括的所有字节内容作为“字节长度”,如此计算文本密度,可以保证所涉及的字节一定是 与对应的纯文本密切相关的。因此对于静态阈值方法来说,估计能够获得稍好的正文提取准确度。 当然,那两篇文章的方法也有一定好处,就是对纯文本内容按照行来区分,对后续人工智能的训练和处理过程来说更便于人 的操作和理解。但文中提及的神经网络方法并不是唯一的选择,或许可以不考虑文本行,而是从 html 标签的出现顺序上寻找规律。
多种基于html正文提取的思想 收藏
一、基于统计的中文网页正文抽取的研究 摘 要:信息抽取技术是一种广泛运用于互联网的数据挖掘技术。其目的是从互联网海量数据中抽取有意义、有价值的数据和信息,从而能更好的利用互联网资源。文中采用一种统计网页特征的方法,将中文网页中的正文部分抽取出来。该方法首先将网页表示成基于XML的DOM树形式,利用统计的节点信息从树中过滤掉噪音数据节点,最后再选取正文节点。该方法相比传统的基于包装器的抽取方法,具有简单,实用的特点,试验结果表明,该抽取方法准确率达到90%以上,具有很好的实用价值。 来源网址:http://blog.csdn.net/zvane/archive/2008/03/21/2201414.aspx 二、基于标签密度判定 译者导读:这篇文章主要介绍了从不同类型的HTML文件中抽取出真正有用的正文内容的一种有广泛适应性的方法。其功能类似于CSDN近期推出的“剪影”,能够去除页眉、页脚和侧边栏的无关内容,非常实用。其方法简单有效而又出乎意料,看完后难免大呼原来还可以这样!行文简明易懂,虽然应用了人工神经网络这样的算法,但因为FANN良好的封装性,并不要求读者需要懂得ANN。全文示例以Python代码写成,可读性更佳,具有科普气息,值得一读。 每个人手中都可能有一大堆讨论不同话题的HTML文档。但你真正感兴趣的内容可能隐藏于广告、布局表格或格式标记以及无数链接当中。甚至更糟的是,你希望那些来自菜单、页眉和页脚的文本能够被过滤掉。如果你不想为每种类型的HTML文件分别编写复杂的抽取程序的话,我这里有一个解决方案。
三、基于数据挖掘思想的网页正文抽取方法的研究 提出了一种依靠数据挖掘思想,从中文新闻类网页中抽取正文内容的方法。该方法将网页源代码进行线性化重构,然后利用重构后的代码进行网页噪声的初步去除,再经过文本分类、聚类得到网页正文的脉络段落,最后通过吸收伪噪声段落生成网页正文。该方法克服了传统的网页内容抽取方法需要为网页结构建树的缺点,具有简单、快速、准确的特点,试验表明该方法的抽取准确率可以达到99%以上。 来源网址:http://epub.cnki.net/grid2008/detail.aspx?filename=ZGZR200608001051&dbname=cpfd2006 四、基于视觉网页块分析技术的正文抽取
评:类似根据模板定义去提取网页正文
继续收集中 当然还有很多如通过正则表达式,或剔除html标签等等方式提取正文,但个人认为通用效果不理想。
一些网页正文内容抓取的有用链接
http://zhidao.baidu.com/question/39002023.html?fr=qrl
在通用正文提取方面,JAVA开发的一个开源项目GATE http://gate.ac.uk/,历经几年,效果不错,也可处理中文。 http://www.myispace.cn/tags/9295ef3a46a ... tm?total=4 正文提取 - 我的信息网 http://www.myispace.cn/clips/fd1017bf58 ... ceb2fa.htm 从HTML文件中抽取正文的简单方案 这篇文章主要介绍了从不同类型的HTML文件中抽取出真正有用的正文内容的一种有广泛适应性的方法。其功能类似于CSDN近期推出的“剪影”,能够去除页眉、页脚和侧边栏的无关内容,非常实用。其方法简单有效而又出乎意料,看完后难免大呼原来还可以这样!行文简明易懂,虽然应用了人工神经网络这样的算法,但因为FANN良好的封装性,并不要求读者需要懂得ANN。全文示例以Python代码写成,可读性更佳,具有科普气息,值得一读。 http://bbs.sogou.com/f?s=%CB%D1%B9%B7%C ... AAA&page=1 做了一个网页正文识别的东东,大家可以通过手机访问http://www.china-ideal.net/news/,以上的新闻都是通过正文识别自动维护的WAP新闻网站。 http://www.cnblogs.com/onlytiancai/arch ... 45879.html 基于标记窗的网页正文提取算法的一些细节问题 http://www.supesoft.com/ArticleDisp.asp?ID=4589 蛙蛙牌正文提取算法 http://www.chinaunix.net/jh/26/1022104.html 用java开发一个搜索导航网站,http://www.itsubway.com http://www.lietu.com/extract/ 猎兔网页正文提取演示
网络语料正文的识别/抽取规则 标签密度判定法 收藏
在确定了对不同的URL进行的不同的操作之后,自然就进入到了本软件的核心部分:如何判定HTML源码中,哪一部分是正文。只有确定了正文部分,才能够确定操作集中的对象,才能够进行抽取。
在各种网络文本中,最容易获得的,就是网络新闻之类。这类文章,甚至包括很多的非新闻类的网上文章,特点都是具有一个标题,这个标题一般会放在正文开头在<h1> </h1>标签中,有些网站也会放在<title> </title>标签中;另外,在一般的网上文章中,正文往往都是用<p> </p>来进行段落划分。同时,正文成分在网页源代码中,分布往往较为集中。因此,本文提出一种正文判定法则,即标签密度判定法,即,首先判断一个<p> </p>代码块中的标签密度,如果低于某一阈值,就认为其标签含量很低,是正文的可能性就比较大。下面举两个例子来论证标签密度是否能成为判定正文的标准:代码片段A是一篇新闻网页的源码中,正文部分的Fragment,而代码片段B,则是非正文部分的Fragment。这两段网页源代码,是随机地从某一搜索引擎结果集中抽取的,因而具有相当的代表性:
图3-1 代码片段A,从某HTML页面源文件中摘取的片断
图3-2 代码片段B,从同一HTML页面源文件中摘取的片断
这代码片段A指示的就是我们要提取的正文。如何把这样的代码,与代码段B这样的代码区分开呢?首先从语言内容角度是行不通的,目前电脑很难理解自然语言;也不能从是否是超级链接入手,前面已经说了,正文中有时也会出现不能随意整个去除的超级链接,必须判断出哪里是正文,才能对正文中的超级链接进行处理。笔者在这个问题上也曾徘徊很久,最后的突破在于寻找到了这样一个规律:正文部分的HTML标签密度,远远大于非正文部分。为了验证这个规律,我们统计分析一下上面的两个例子(HTML标签:这里指所有在HTML源代码中出现的,尖括号(<>)中的内容,每对尖括号,连同其内容,算作一个标签,每个类似于<html> </html>的两个标签,其中一个标示标签内容开始,另一个标志标签内容结束的,称为一个标签对。):
代码片段A的统计分析:
正文字数:242字(正文字数:指的是非标签的文本字数,标点符号计在内。)
标签数:7个(标签数:只计算标签的个数,忽略标签内文本的多少。)
标签密度:28.93个/千字(标签密度:指的是前面定义的标签数与正文数的商,单位规定为“个/千字”,计算公式为“标签密度=1000*标签数/字数”。)
代码片段B的统计分析:
正文字数(非标签文本):221字
标签数:69个
标签密度:312.22个/千字
从上面的两组统计数据可以看出,网络文本源代码中,正文部分的HTML标签密度远远小于非正文部分,同时,对于更多的网络文本的统计数据分析可以知道,按照上文的方法所算出的标签密度,正文部分与非正文部分,存在着极大的差异。从而我们可以得出初步结论:可以依据对HTML标签密度的统计分析来指出在一份HTML源代码中,文章正文的位置。
于是,在对更多的文本进行类似的统计后,笔者得出一个正式的统计的结论,正文部分的HTML标签密度大于50个/千字的概率接近于零,而非正文部分的标签密度小于200个/千字的机率也几乎为零。所以,理论上,在50个/千字和200个/千字这个统计得出标签密度数据的“真空区”中选择任何一个数值作为正文与非正文部分的分界线都是可以的。但是,为了保证不遗漏正文(不遗漏正文:对于标注对象来说,正文的缺失是难以接受的,而少量的冗余资料则被认为是对工作无害的。所以,在提取正文时,宁可放行一些无用的资料,也不能把丝毫的正文过滤掉),笔者建议选择的分界值是150个/千字(150个/千字:这是针对网络新闻资料得出的建议分界值,可能并不适用于其他类型的资料)。当然,在其后的设计分析中,我们可以知道,对于不同网站的文本语料,存在不同的设计风格差异,体现在源码上,就是正文部分与非正文部分的标签密度存在一定的波动。我们可以通过对这个阈值进行调整,来达到最适合的抽取精度。当然,在软件中,会存在一个Scroll Bar,对这个阈值进行调整。
|