可读性用于从URL中提取文本的算法是什么?

时间:2010-09-06 15:37:24

标签: javascript asp.net extraction

有一段时间,我一直试图找到一种方法,通过消除与广告相关的文字和所有其他混乱,从URL中智能地提取“相关”文本。经过几个月的研究,我放弃了作为一个无法准确确定的问题。 (我尝试了不同的方法,但没有一个是可靠的)

一周前,我偶然发现Readability - 一个将任何网址转换为可读文字的插件。它看起来非常准确。我的猜测是,他们以某种方式拥有足够聪明的算法来提取相关文本。

有谁知道他们是怎么做到的?或者我如何可靠地做到这一点?

4 个答案:

答案 0 :(得分:166)

可读性主要包括在许多情况下“只是某种程度上运作良好”的启发式方法。

我已经写了一些关于这个主题的研究论文,我想解释一下为什么很容易找到一个效果很好的解决方案以及难以接近100%准确度的背景。

在人类语言中似乎存在一种语言规律,它也(但不是唯一地)在网页内容中体现出来,它已经非常清楚地区分了两种类型的文本(全文与非全文或粗略地说,“主要内容”与“样板”相比。)

为了从HTML获取主要内容,在许多情况下,仅保留HTML文本元素(即,没有被标记中断的文本块),其具有超过大约10个单词。对于两种不同的文本写作动机,人类似乎选择两种类型的文本(“短”和“长”,通过它们发出的单词数来衡量)。我称之为“导航”和“信息”动机。

如果作者希望您快速获取所写内容,他/她会使用“导航”文本,即少数字(如“停止”,“阅读此内容”,“点击此处”) 。这是导航元素(菜单等)中最重要的文本类型。

如果作者希望您深刻理解他/她的意思,他/她会使用很多单词。这样,以增加冗余为代价消除了歧义。类似文章的内容通常属于这个类,因为它只有几个单词。

虽然这种分离在许多情况下似乎都有效,但在标题,短句,免责声明,版权页脚等方面变得棘手。

有更复杂的策略和功能,有助于将主要内容与样板分开。例如,链接密度(链接的块中的字数与块中的字总数),前一个/下一个块的特征,“整个”Web中特定块文本的频率, HTML文档的DOM结构,页面的可视图像等。

您可以阅读我的最新文章“Boilerplate Detection using Shallow Text Features”,从理论角度获得一些见解。您也可以在VideoLectures.net上观看我的论文演示视频。

“可读性”使用其中一些功能。如果您仔细观察SVN更改日志,您将看到策略的数量随着时间的推移而变化,可读性的提取质量也是如此。例如,2009年12月引入链接密度非常有助于改进。

在我看来,因此在说“可读性就是这样”时没有任何意义,没有提到确切的版本号。

我发布了一个名为boilerpipe的开源HTML内容提取库,它提供了几种不同的提取策略。根据使用情况,一个或另一个提取器工作得更好。您可以使用Google AppEngine上的配套boilerpipe-web应用程序在您选择的页面上尝试这些提取器。

要让数字说话,请参阅samppipe wiki上的“Benchmarks”页面,其中比较了一些提取策略,包括samppipe,Readability和Apple Safari。

我应该提一下,这些算法假设主要内容实际上是全文。在某些情况下,“主要内容”是其他内容,例如图像,表格,视频等。算法不适合这种情况。

干杯,

基督教

答案 1 :(得分:17)

可读性是一个javascript书签。意味着它的客户端代码操纵DOM。看看javascript,你应该能够看到最新情况。

可读性的工作流程和代码:

/*
     *  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

答案 2 :(得分:12)

当然,没有100%可靠的方法可以做到这一点。您可以查看可读性源代码here

基本上,他们正在尝试识别正面否定文本块。正标识符(即div ID)类似于:

  • 制品
  • 含量
  • 博客
  • 故事

否定标识符为:

  • 评论
  • 讨论

然后他们不太可能可能是候选人。 他们要做的是确定最有可能成为网站主要内容的内容,请参阅可读性来源中的第678行。这是通过主要分析段落的长度,它们的标识符(见上文),DOM树(即段落是最后一个子节点),删除所有不必要的东西,删除格式等来完成的。

代码有1792行。这似乎是一个非常重要的问题,所以也许你可以从那里得到你的灵感。

答案 3 :(得分:7)

有趣。我开发了一个类似的PHP脚本。它基本上扫描文章并将词性附加到所有文本(Brill Tagger)。然后,语法无效的句子立即被消除。然后,代词或过去时的突然变化表明文章结束了,或者还没有开始。搜索和删除重复的短语,如“雅虎新闻体育金融”在页面中出现十次。您还可以通过与各种情绪相关的大量单词库来获得关于音调的统计数据。从主动/负面/金融,到被动/积极/政治的突然变化表明了一个边界。这真的是无穷无尽的,无论你想深入挖掘。

主要问题是链接,嵌入式异常,脚本样式和更新。