一段时间以来,我一直在寻找一种方法,通过消除与广告相关的文本和所有其他杂乱内容,从 URL 中智能地提取“相关”文本。经过几个月的研究,我放弃了它作为一个问题这是无法准确确定的。(我尝试过不同的方法,但没有一个是可靠的)
一周前,我偶然发现了Readability——一个可以将任何 URL 转换为可读文本的插件。对我来说它看起来很准确。我的猜测是他们以某种方式拥有一种足够智能的算法来提取相关文本。
有谁知道他们是如何做到的?或者我怎么能可靠地做到这一点?
一段时间以来,我一直在寻找一种方法,通过消除与广告相关的文本和所有其他杂乱内容,从 URL 中智能地提取“相关”文本。经过几个月的研究,我放弃了它作为一个问题这是无法准确确定的。(我尝试过不同的方法,但没有一个是可靠的)
一周前,我偶然发现了Readability——一个可以将任何 URL 转换为可读文本的插件。对我来说它看起来很准确。我的猜测是他们以某种方式拥有一种足够智能的算法来提取相关文本。
有谁知道他们是如何做到的?或者我怎么能可靠地做到这一点?
可读性主要包括在许多情况下“以某种方式运行良好”的启发式方法。
我已经写了一些关于这个主题的研究论文,我想解释一下为什么很容易想出一个很好的解决方案以及何时很难接近 100% 的准确度的背景。
人类语言中似乎有一种语言规律,它也(但不完全)体现在网页内容中,它已经很清楚地将两种类型的文本(全文与非全文,或者粗略地说,“主要内容”与“样板”)。
为了从 HTML 中获取主要内容,在很多情况下只保留超过 10 个单词的 HTML 文本元素(即不被标记打断的文本块)就足够了。似乎人类会从两种类型的文本(“短”和“长”,根据他们发出的单词数来衡量)中进行选择,以满足两种不同的写作动机。我会称它们为“导航”和“信息”动机。
如果作者希望您快速了解所写的内容,他/她会使用“导航”文本,即几个词(如“停止”、“阅读本文”、“单击此处”)。这是导航元素(菜单等)中最突出的文本类型
如果一个作者想让你深入理解他/她的意思,他/她会用很多词。这样,以增加冗余为代价消除了歧义。类似文章的内容通常属于这一类,因为它不仅仅是几个词。
虽然这种分离似乎在很多情况下都有效,但在标题、短句、免责声明、版权页脚等方面变得棘手。
有更复杂的策略和功能可以帮助将主要内容与样板文件分开。例如链接密度(块中链接的单词数与块中的总单词数)、前一个/下一个块的特征、“整个”Web 中特定块文本的频率、 HTML 文档的 DOM 结构,页面的视觉图像等。
您可以阅读我的最新文章“使用浅文本特征进行样板检测”,以从理论角度获得一些见解。您还可以在 VideoLectures.net 上观看我的论文演示视频。
“可读性”使用了其中一些功能。如果你仔细观察 SVN 的更新日志,你会发现策略的数量随着时间的推移而变化,可读性的提取质量也是如此。例如,2009 年 12 月引入的链路密度对改进有很大帮助。
因此,在我看来,说“可读性就是这样”是没有意义的,而不提及确切的版本号。
我发布了一个名为boilerpipe 的开源HTML 内容提取库,它提供了几种不同的提取策略。根据用例,一个或另一个提取器效果更好。您可以在 Google AppEngine 上使用配套的boilerpipe-web 应用程序在您选择的页面上尝试这些提取器。
让数字说话,请参阅boilerpipe wiki 上的“基准”页面,该页面比较了一些提取策略,包括boilerpipe、Readability 和Apple Safari。
我应该提到,这些算法假设主要内容实际上是全文。在某些情况下,“主要内容”是其他内容,例如图像、表格、视频等。算法不适用于此类情况。
干杯,
基督教
可读性是一个 javascript 书签。意思是它的客户端代码操作 DOM。看看javascript,你应该能够看到发生了什么。
Readability 的工作流程和代码:
/*
* 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)。然后,语法上无效的句子被立即消除。然后,代词或过去时的突然变化表明文章已经结束或尚未开始。重复的词组被搜索和消除,如“雅虎新闻体育金融”在页面中出现十次。您还可以通过大量与各种情绪相关的词库来获取有关语气的统计数据。从主动/消极/财务到被动/积极/政治的语气突然变化表明了边界。它真的是无穷无尽的,无论你想深入挖掘。
主要问题是链接、嵌入异常、脚本样式和更新。