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

use*_*981 102 javascript asp.net extraction

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

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

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

Chr*_*ter 167

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

我已经写了一些关于这个主题的研究论文,我想解释一下为什么很容易找到一个运行良好的解决方案并且很难达到100%准确度的背景.

在人类语言中似乎存在一种语言规律,它也(但不是唯一地)表现在网页内容中,这已经非常清楚地区分了两种类型的文本(全文与非全文或粗略地,"主要内容"vs."样板").

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

如果作者希望您快速得到所写的内容,他/她会使用"导航"文本,即少数几个单词(如"停止","阅读此内容","点击此处").这是导航元素(菜单等)中最重要的文本类型.

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

虽然这种分离似乎在很多案例中起作用,但是标题,短句,免责声明,版权页脚等等都变得棘手.

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

您可以阅读我的最新文章" 使用浅文本特征的锅炉板检测 ",从理论角度获得一些见解.您还可以在VideoLectures.net上观看我的论文演示视频.

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

因此,我认为"可读性就是这样"是没有意义的,没有提到确切的版本号.

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

要让数字说话,请参阅boilerpipe wiki上的" 基准 "页面,该页面比较了一些提取策略,包括samppipe,Readability和Apple Safari.

我应该提一下,这些算法假设主要内容实际上是全文.在某些情况下,"主要内容"是其他内容,例如图像,表格,视频等.算法不适用于此类情况.

干杯,

基督教

  • 我相信你最好把你的项目放到GitHub上,以便开源开发人员在社交方面实现增长. (5认同)
  • 这个samppipe项目仍然有效吗? (3认同)
  • 将副本“迁移”到我的存储库 https://github.com/k-bx/boilerpipe 以防万一它丢失:) (2认同)

Moi*_*man 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);
})();
Run Code Online (Sandbox Code Playgroud)

如果您按照上面代码所引入的JS和CSS文件进行操作,您将了解全局:

http://lab.arc90.com/experiments/readability/js/readability.js(这是评论很好,有趣的阅读)

http://lab.arc90.com/experiments/readability/css/readability.css


slh*_*hck 12

当然,没有100%可靠的方法来做到这一点.您可以在此处查看可读性源代码

基本上,他们正在做的是尝试识别正面负面的文本块.正标识符(即div ID)类似于:

  • 文章
  • 身体
  • 内容
  • 博客
  • 故事

否定标识符将是:

  • 评论
  • 讨论

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

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

  • 你碰巧知道他们的代码是否是开源的,是否可以用于商业产品? (2认同)
  • 它说源代码是在Apache License 2.0下发布的,这意味着你可以使用它,分发它,修改和分发它的修改版本.我对细节不太清楚. (2认同)
  • @bobsmith Apple在最新版本的Safari中使用它.他们在发行说明中记录了Arc90. (2认同)

use*_*063 7

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

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

  • 这听起来真的是一个非常有趣的方法 - 你有任何代码可以分享吗? (3认同)
  • 我的第二个问题是,您是否有我们可以查看的代码或代码信息? (2认同)