可读性使用什么algorithm从URL中提取文本?
一段时间以来,我一直在努力寻找一种方法,通过消除与广告相关的文字以及所有其他杂乱的内容,从URL中智能地提取“相关”文本。经过几个月的研究,我放弃了作为一个问题无法准确确定。 (我尝试了不同的方式,但没有一个是可靠的)
一周前,我偶然发现了Readability–一个将任何URL转换为可读文本的插件。 这对我来说看起来相当准确。 我的猜测是,他们以某种方式有一个足够聪明的algorithm来提取相关的文本。
有谁知道他们是如何做到的? 或者我可以如何可靠地做到这一点?
可读性主要包括在许多情况下“以某种方式工作良好”的启发式方法。
我已经写了一些关于这个话题的研究论文,我想解释一下为什么很容易想出一个很好的解决scheme,以及难以接近100%的准确性的背景。
在人类语言中似乎有一个语言法律,它也是(但不是唯一的)在网页内容中显现出来,它已经非常清楚地将两种types的文本(全文与非全文或粗略地“主要内容“与”样板“)。
为了从HTML中获取主要内容,在许多情况下,只保留超过10个字的HTML文本元素(即不被标记中断的文本块)就足够了。 看起来,人类从两种不同的文字动机中select两种types的文本(“短”和“长”,用他们发出的单词的数量衡量)。 我会称他们为“导航”和“信息”的动机。
如果作者想让你快速得到所写的内容,他/她使用“导航”文本,即几个字(如“停止”,“阅读本”,“点击这里”)。 这是导航元素(菜单等)中最主要的文本types
如果作者想让你深刻理解他/她的意思,他/她会用很多词语。 这样,以增加冗余为代价就消除了模糊性。 文章内容通常属于这个类别,因为它只有几个字。
虽然这种分离似乎在大量的案件中起作用,但是标题,短句,免责声明,版权页脚等等却变得棘手。
有更复杂的策略和function,有助于将主要内容与样板分开。 例如,链接密度(被链接的块中的单词的数目与块中的单词的总数),前一个/下一个块的特征,“整个”networking中特定块文本的频率, HTML文档的DOM结构,页面的可视化图像等
您可以阅读我的最新文章“ 使用浅文本特征的锅炉检测 ”,从理论angular度得到一些见解。 您也可以在VideoLectures.net上观看我的论文演示video。
“可读性”使用了这些function中的一部分。 如果仔细观察SVN更新日志,您会看到策略的数量随时间而变化,Readability的抽取质量也是如此。 例如,2009年12月推出的链接密度非常有助于改善。
在我看来,说“可读性就是这样”并没有提到确切的版本号,这是毫无意义的。
我已经发布了一个名为boilerpipe的开源HTML内容提取库,它提供了几种不同的提取策略。 取决于用例,其中一个或另一个提取器效果更好。 您可以使用Google AppEngine上的伴侣boilerpipe-web应用,在您select的页面上尝试这些提取器。
要让数字说话,请参阅boilerpipe wiki上的“ Benchmarks ”页面,该页面比较了一些提取策略,包括boilerpipe,Readability和Apple Safari。
我应该提到这些algorithm假定主要内容实际上是全文。 有些情况下,“主要内容”是其他的东西,例如图像,表格,video等等。algorithm在这种情况下不能很好地工作。
干杯,
基督教
可读性是一个JavaScript书签。 意味着它操纵DOM的客户端代码。 看看JavaScript,你应该可以看到发生了什么事情。
可读性的工作stream程和代码:
/* * 1. Prep the document by removing script tags, css, etc. * 2. Build readability's DOM tree. * 3. Grab the article content from the current dom tree. * 4. Replace the current DOM tree with the new one. * 5. Read peacefully. */ javascript: (function () { readConvertLinksToFootnotes = false; readStyle = 'style-newspaper'; readSize = 'size-medium'; readMargin = 'margin-wide'; _readability_script = document.createElement('script'); _readability_script.type = 'text/javascript'; _readability_script.src = 'http://lab.arc90.com/experiments/readability/js/readability.js?x=' + (Math.random()); document.documentElement.appendChild(_readability_script); _readability_css = document.createElement('link'); _readability_css.rel = 'stylesheet'; _readability_css.href = 'http://lab.arc90.com/experiments/readability/css/readability.css'; _readability_css.type = 'text/css'; _readability_css.media = 'all'; document.documentElement.appendChild(_readability_css); _readability_print_css = document.createElement('link'); _readability_print_css.rel = 'stylesheet'; _readability_print_css.href = 'http://lab.arc90.com/experiments/readability/css/readability-print.css'; _readability_print_css.media = 'print'; _readability_print_css.type = 'text/css'; document.getElementsByTagName('head')[0].appendChild(_readability_print_css); })();
如果你按照上面的代码拉入的JS和CSS文件,你会得到整个图像:
http://lab.arc90.com/experiments/readability/js/readability.js (这是很好的评论,有趣的阅读)
http://lab.arc90.com/experiments/readability/css/readability.css
当然,没有100%可靠的方法来做到这一点。 你可以看看这里的可读性源代码
基本上,他们正在做的是试图确定积极和消极的文本块。 积极的标识符(即div ID)将是这样的:
- 文章
- 身体
- 内容
- 博客
- 故事
否定标识符是:
- 评论
- 讨论
然后他们不太可能 , 也许候选人。 他们要做的是确定什么最有可能成为网站的主要内容,请参阅可读性来源的第678
行。 这是通过大致分析段落的长度,它们的标识符(参见上文),DOM树(即如果段落是最后一个子节点),删除不必要的东西,删除格式化等来完成的。
代码有1792行。 它看起来像一个不平凡的问题,所以也许你可以从那里得到你的灵感。
有趣。 我开发了一个类似的PHP脚本。 它基本上是扫描文章,并把所有文字的部分(Brill Tagger)。 然后,语法无效的句子立即消失。 然后,代词突然转移或过去式表示文章结束,或还没有开始。 重复的短语被search和消除,如“雅虎新闻体育财经”在页面中出现十次。 你也可以通过与各种情绪有关的大量银行数据库来获得统计数据。 基调的突然变化,从积极/消极/金融,被动/积极/政治,表明了一个界限。 无论如何,无论你想深入挖掘,
主要问题是链接,embedded式exception,脚本样式和更新。