`
hzxdark
  • 浏览: 77739 次
社区版块
存档分类
最新评论

从HTML文件中抽取正文的简单方案 试验结果

阅读更多
标签:人工智能、AI、BP网络、html净化、分类、正文抽取

一、 简介
本文是根据alexjc的<The Easy Way to Extract Useful Text from Arbitrary HTML>一文进行实验的结果。原文见:
http://ai-depot.com/articles/the-easy-way-to-extract-useful-text-from-arbitrary-html/
——alexjc原文

http://blog.csdn.net/lanphaday/archive/2007/08/13/1741185.aspx
——恋花蝶翻译的中英对照版本

该文章主要内容是讲述如何利用正文相对于其他文本,正文文本与生成该正文所需的html字节码的比值较大的规律,利用神经网络识别出正文过滤过滤广告的效果。主要设计如下:

1. 解析HTML代码并记下处理的字节数。
2. 以行或段的形式保存解析输出的文本。
3. 统计每一行文本相应的HTML代码的字节数
4. 通过计算文本相对于字节数的比率来获取文本密度
5. 最后用神经网络来决定这一行是不是正文的一部分。


二、 设计方案
本实验相对原本alexjc设计方案有几点修改:

1. 用RPROP(弹性BP网络)代替原文的感知器;
2. 由于原文并没有把文本长度、html字节长度做归一化,所以不采用原始文本长度、html字节长度作为特征值。相对的,对归一化后的文本长度、html字节长度,以及前向后向N行等各种组合进行试验。
3. 试验文本为任意在网上选取的10个网页,见附件。
4. 原文并没有提及,如何定义一行文本是否正文,所以这里定义了几个正文类型:
a) 内容型正文,特征是有长的连续文字段,定义这些文字段为正文;
b) 论坛型,有短的不连续的文字段,定义这些文字段为正文;
c) 论坛帖子列表型(部分试验将会对这类型进行训练查看效果,对于论坛帖子列表是否属于正文这里不做讨论……),帖子标题为正文;
d) 首页型,定义为没有正文(厄,谁能说出,新浪首页哪些是正文?)

实验环境:
1. 语言:JAVA,JRE1.5
2. 操作系统:windows xp

三、 实验过程:
1. 设计实现一个三层RPROP网络(令人惊讶的是,居然在这个领域没有人写一个开源的组件,apache等的开源巨头们都对neural network不感兴趣么?)。

/*
*初始化RPROP对象
*
*本函数用于创建训练前的RPROP对象
*参数:
* int in_num 输入层个数;
* int hidden_unit_num 隐含层节点个数
* int out_num 输出层个数
*
*/
public RPROP(int in_num, int hidden_unit_num, int out_num)

/*
*初始化RPROP对象
*
*本函数用于创建训练后的RPROP对象
*参数:
* int in_num 输入层个数;
* int hidden_unit_num 隐含层节点个数
* int out_num 输出层个数
* double[][] w1 隐含层权重
* double[][] w2 输出层权重
* double[] b1 隐含层偏离值
* double[] b2 输出层偏离值
*/
public RPROP(int in_num, int hidden_unit_num, int out_num, double[][] w1, double[][] w2, double[] b1, double[] b2)

/*
*计算输出结果
*
*参数:
* double[] p 输入参数
*返回值:
* double[] 输出结果
*/
public double[] output(double[] p)

/*
*训练
*
*参数:
* double[][] p
* 训练样本集
* double[][][] t
* 期望结果集, t[i][j][0] 期望结果, t[i][j][1]误差放大系数
* double goal
* 目标误差,注意,本网络用的是“方差”作为误差判断条件
* int epochs
* 训练最大次数
*/
public void train(double[][] p, double[][][] t, double goal,int epochs)
对于这个实现,有兴趣的朋友在本文最后下载附件。

2. 选取特征值
在实验中,笔者尝试了各种特征值组合:
1) 文本密度,文本长度,html字节码长度,前后各一行的同样数值;(原文设定)
2) 文本密度,文本长度倒数(归一化),前后各两行的同样数值;
3) 文本所在的html的链接密度(全文文本长度/总链接数,用于加强判断文本类型),文本密度,文本长度/5000(归一化,大于1的当1处理,下文简称为文本长度2),前后两行相同的数值;
4) 文本所在的html的链接密度,文本密度,文本长度2,前后两行相同的数值;
5) 文本所在的html的链接密度,文本密度,文本长度2,前后一行相同的数值;
6) 文本所在的html的链接密度,文本密度,文本长度2,前一行是否正文;

并规定,网络输出结果0为非正文,1为正文。

在训练过程中,发现训练过的网络命中率大部分落在0值部分,这是由于论坛这种短文段类型的网页会导致0值过多,训练时对0值过拟合。为了避免这一点,对某一篇网页的某一行的误差乘以该网页的0值与1值数量的比值。

3. 训练集获取
见附件。这是在笔者常浏览的网页中任意抽取的10个网页。对于期望输出的定义见上文。

四、实验结果
1. 1~5的实验,任意抽取部分样本集作为训练集,对于训练集拟合的很好,但对于测试集的表现却非常糟糕(请原谅笔者并没有记录实验数据);

这部分结果表明,以文本密度作为判断是否正文的特征值是有问题的。观察样本集的数据可以发现,即使是内容型的大段文字,也有可能文本密度很低——为了让网页变得更漂亮美观,现在有很多网站都对文字内容加了大段大段修饰用html代码……
鉴于这一点,笔者最终放弃文本密度作为特征值。而考虑到广告都是带链接的文本,相对的正文连接数则比较少,所以笔者认为,用文本长度/链接数 作为特征值或许会是一个更好的选择。

2. 6的实验,表现意外的非常的好(好到差点让笔者以为终于找到完美的解决方案……)
确实,即使是在测试集部分的表现也惊人好,但实际上有一个问题:每一行的计算受上一行计算的结果影响。测试集是事先定义每一行的上一行的结果,但在实际使用时,上一行的结果是实时计算出来的,所以就会出现,在某一行出错,导致后面的结果全部出错的情况……

至此,假如仍然坚持神经网络的解决方案,或许,采用:
文本长度,文本长度链接数,上一行的结果 做特征值, 采用三个弱分类器的ada-boost组合分类或许会是一个好的选择。
除此之外,实际上对正文的定义对结果也是有很大的影响。实际上,假如能根据数据化的东西定义某一个类别,那么对于该类别的划分,或许其实已经是可预知的,不如直接设计阈值处理。

笔者的实验则到此为止,并放弃了神经网络这个解决方案——直接采用这些特征值进行阈值判断,并对一些特殊部分设定过滤规则,这似乎比神经网络的表现来的简单、有效……

如果有哪位朋友感兴趣,并用ada-boost进行实验,笔者将非常期待这位朋友来交流下心得:)

附件:
neralNetwork.rar  源代码
res.rar 训练集

关于html文本抽取部分,这里用的是HtmlParser,这里修改的代码就不贴出来了,有兴趣的朋友可以去:
http://htmlparser.sourceforge.net/
看看。

  • res.rar (211.5 KB)
  • 下载次数: 401
13
0
分享到:
评论
3 楼 dachumao 2011-03-14  
楼主 您的代码都没标注 让人太难看懂了 我读了几天了 还是没能理解 太累人了 希望能在代码的旁边附一些注释 这样理解起来不至于那么困难
2 楼 hzxdark 2011-01-21  
我记得我是继承htmlvisitor,在遍历标签时做具体处理判断。具体忘了,太久了。
1 楼 zhzhl202 2010-12-05  
楼主,你好,最近我也在搞网页去噪,正文抽取方面的东西。看了你提到的这篇文章和你做的实验,收获很大, 可以喔有一点不明白,就是"统计每一行文本相应的HTML代码的字节数 "这个怎么理解, 是不是原来的HTML文件是这样的
假如原来的html如下
<p><br><center>这里的内容很精彩</center>

那文本就应该是 “这里的内容很精彩”  HMTL文本是:“<p><br><center>这里的内容很精彩</center>”
我这样理解对吗?
如果是这样的话,那怎么得到每一行内容所对应的HTML字节的长度呢?用HtmlParser应该怎么做呢?
我的邮箱是 zhzhl202@163.com  MSN是 zhzhl202@Hotmail.com
thanks in advance!!!!

相关推荐

    基于统计的网页正文信息抽取

    传统的网页正文抽取方法主要依赖于规则匹配,而基于统计的方法则更注重从大量网页数据中学习和推断正文特征。 在本案例中,使用了名为htmlparser的网页分析器。这是一个Java库,专门用于解析HTML文档,帮助开发者...

    .NET平台上的文件抽取框架toxy.zip

    toxy是.NET平台上的文件抽取框架,主要解决各种格式的内容抽取问题,比如pdf, doc, docx, xls, xlsx等,尽管听上去支持了很多格式,但它的使用却是极其方便的,因为Toxy把复杂的抽取流程透明化,Toxy的用户根本不用...

    Java抽取Word和PDF格式文件

    本篇文章将探讨四种不同的方法来实现Java抽取Word和PDF格式文件。 1. 使用JACOB库 JACOB(Java COM Bridge)是一个允许Java调用COM组件的库。在Java中操作Word和PDF文件时,JACOB通过桥接Java和COM接口来实现。...

    ETL数据抽取使用

    该场景下,用户需要从数据库中抽取特定表的数据,并将其导出到文本文件中。 1. **新建数据库连接**:在主对象树中右键点击“DB连接”,根据实际情况填写主机地址、数据库名、用户名和密码等信息。 2. **连接表输入...

    用于新闻网页内容抽取方法数据集.zip

    6. **结果文件**:可能包含先前运行的实验结果,用于比较新算法的性能。 在实际应用中,数据集的使用可能涉及以下步骤: - **数据探索**:了解数据集的结构和内容,识别潜在的挑战和模式。 - **特征工程**:根据...

    基于行块分布函数的通用网页正文抽取算法优化,Python实现+源代码+文档说明

    该正文抽取算法在基于行块分布函数的网页正文抽取方法上做了稍许改进,提高了准确率,使提取的正文更加“一字不差”。在比赛给出的测试包下进行测试,准确率达到90以上。 ## 算法实现描述 对于新闻博客类网站,...

    利用TikaAPI解析各种文档

    通过解压并运行相关代码,我们可以验证Tika的使用方法和功能,同时也可以测试其在不同文件格式上的表现。 总之,Tika API是一个强大的文档解析工具,它简化了跨格式内容提取的过程,使得开发者可以更加专注于应用...

    基于PHP的NLP信息抽取准确性检测众包系统源码.zip

    众包是一种利用大量网络用户(非专业人员)的集体智慧和劳动力来完成任务的方法,对于这种NLP系统的测试和优化来说,它提供了一个经济且高效的解决方案。 从标签“php”我们知道这个项目是用PHP编写的。PHP是一种...

    基于Java实现的基于模板的网页结构化信息精准抽取组件。.zip

    在IT领域,网页结构化信息的精准抽取是网络数据挖掘中的关键步骤,它涉及到了网页内容的理解、解析和提取,以便于进一步的数据分析和利用。本项目是一个基于Java实现的基于模板的网页结构化信息抽取组件,其核心目标...

    cmt.rar_Cmt.rar_extract comments_抽取

    标题中的“cmt.rar_Cmt.rar_extract comments_抽取”表明这是一个关于从网页中提取文本评论的项目,可能是一个编程或数据分析任务。这个压缩包包含了必要的源代码和可能的数据集,帮助用户实现评论的抓取和处理。从...

    html-data-extractor:从 html 中提取数据的解析程序。 用于从许多类似的 html 文件中获取数据

    HTML 数据提取器是一种工具,主要用于从批量的 HTML 文件中抽取特定的数据。在互联网时代,大量信息以网页形式存在,HTML 数据提取对于数据挖掘、分析、爬虫开发等场景至关重要。这款解析程序用 JavaScript 编写,它...

    c#版html引擎JumonyCore3.0.5开发包

    3. 数据提取:对于需要从HTML源码中抽取特定信息的场景,如邮件解析、报表生成等,JumonyCore提供了解决方案。 4. 单元测试:在测试Web应用时,可以模拟用户交互,通过JumonyCore解析和操作HTML来验证页面逻辑。 5...

    软件测试面试宝典之葵花宝典.pdf

    从提供的文件信息来看,内容显得比较混乱,但仍然可以从中抽取出一些与软件测试相关的知识点。这份文件的标题为《软件测试面试宝典之葵花宝典》,这表明文档可能是为参加软件测试面试的人准备的复习资料或参考书。...

    《基于行块分布函数的通用网页正文抽取》的Python实现方式+源代码+文档说明

    网页正文内容抽取 =================== 此代码是对论文《基于行块分布函数的通用网页正文抽取》的Python实现方式。论文的出发点是针对搜索引擎正文提取的解决方案,移除了所有的标签元素,因此我在此保留了标签元素...

    html解析工具htmllexer+htmlparser-2.1

    - 从HTML中抽取链接、图片等资源。 - 自动化测试网页,检查页面元素是否符合预期。 - 数据抓取和爬虫项目,从大量网页中提取有用信息。 为了使用这两个库,开发者需要了解Java编程,并且熟悉基本的HTML语法。在Java...

    读取html页面内容

    通过对HTML页面的网络请求、解析和数据抽取,我们可以实现从HTML中提取特定信息的需求。在实际应用中,可能还需要处理网络异常、编码问题以及更复杂的HTML结构。此外,对于大量或频繁的请求,可以考虑使用缓存策略...

    java源码包---java 源码 大量 实例

     Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...

    生成随机数 免费 网页版

    在编程中,生成随机数通常依赖于特定的库或函数,例如在JavaScript中,我们可以使用Math.random()方法来生成0到1之间(包括0,但不包括1)的随机浮点数。 描述中的网页版随机数生成器提供了用户自定义生成随机数的...

Global site tag (gtag.js) - Google Analytics