一段时间以来,我一直在尝试寻找一种方法,通过消除与广告有关的文本以及所有其他混乱情况,从URL中智能地提取“相关”文本。经过几个月的研究,我放弃了它无法准确确定。(我尝试了不同的方法,但是没有一个可靠的方法)
一周前,我偶然发现了可读性 -一个可将任何URL转换为可读文本的插件。对我来说看起来很准确。我的猜测是,他们某种程度上拥有一种足够聪明的算法来提取相关文本。
有人知道他们是怎么做的吗?或者我怎么能可靠地做到这一点?
一段时间以来,我一直在尝试寻找一种方法,通过消除与广告有关的文本以及所有其他混乱情况,从URL中智能地提取“相关”文本。经过几个月的研究,我放弃了它无法准确确定。(我尝试了不同的方法,但是没有一个可靠的方法)
一周前,我偶然发现了可读性 -一个可将任何URL转换为可读文本的插件。对我来说看起来很准确。我的猜测是,他们某种程度上拥有一种足够聪明的算法来提取相关文本。
有人知道他们是怎么做的吗?或者我怎么能可靠地做到这一点?
Answers:
可读性主要由启发式方法组成,这些方法在许多情况下“仅能以某种方式发挥作用”。
我已经写了一些有关该主题的研究论文,我想解释一下为什么容易提出一个行之有效的解决方案以及何时很难达到100%的准确性的背景。
似乎有一种人类语言所基于的语言定律,也(但不是排他性地)体现在网页内容中,该定律已经很清楚地将两种类型的文本分开(全文与非全文,或者大概是“主要内容”还是“样板”)。
要从HTML获取主要内容,在许多情况下,仅保留具有大约10个以上单词的HTML文本元素(即不受标记中断的文本块)就足够了。看来人类从两种类型的文本(“短”和“长”,从他们发出的单词数量来衡量)中选择了两种不同的书写动机。我将它们称为“导航”和“信息”动机。
如果作者希望您快速获取所写内容,则使用“导航”文本,即少量单词(例如“ STOP”,“ Read this”,“ Click here”)。这是导航元素(菜单等)中最突出的文本类型
如果作者希望您深刻理解他/她的意思,那么他/她会使用很多单词。这样,消除歧义以增加冗余为代价。类似文章的内容通常属于此类,因为它只有几个单词。
尽管这种分离似乎在很多情况下都是可行的,但在标题,简短句子,免责声明,版权页脚等方面变得越来越棘手。
有更复杂的策略和功能可以帮助将主要内容与样板区分开。例如,链接密度(链接的块中单词的数量与该块中单词的总数之比),上一个/下一个块的特征,“整个” Web中特定块文本的频率, HTML文档的DOM结构,页面的可视图像等。
您可以阅读我的最新文章“ 使用浅文本功能进行样板检测 ”以从理论角度获得一些见识。您也可以在VideoLectures.net上观看我的论文介绍的视频。
“可读性”使用其中一些功能。如果仔细观察SVN更改日志,您会发现策略的数量随时间变化,可读性的提取质量也随之变化。例如,2009年12月引入的链路密度极大地改善了性能。
我认为,在不提及确切的版本号的情况下说“可读性就是这样”是没有意义的。
我已经发布了一个称为锅炉管道的开源HTML内容提取库,该库提供了几种不同的提取策略。根据使用情况,一个或另一个提取器效果更好。您可以使用Google AppEngine上的配套boilerpipe-web应用程序在选定的页面上尝试使用这些提取器。
为了让数字说话,请参阅样板库Wiki上的“ 基准 ”页面,其中比较了一些提取策略,包括样板管,可读性和Apple Safari。
我应该提到的是,这些算法假定主要内容实际上是全文。在某些情况下,“主要内容”是其他内容,例如图像,表格,视频等。在这种情况下,算法将无法正常工作。
干杯,
基督教
可读性是一个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
当然,没有100%可靠的方法可以做到这一点。您可以在此处查看可读性源代码
基本上,他们正在做的是试图找出积极的和消极的文本块。正标识符(即div ID)类似于:
否定标识符为:
然后,他们不太可能,甚至可能是候选人。他们将要做的是确定最有可能成为网站主要内容的内容,请参见678
可读性来源中的第一行。这是通过分析段落的长度,其标识符(参见上文),DOM树(即,如果该段落是最后一个子节点),去除所有不必要的内容,删除格式等来完成的。
该代码有1792行。这似乎是一个非同小可的问题,因此也许您可以从那里得到启发。
有趣。我已经开发了类似的PHP脚本。它基本上是扫描文章并将词性附加到所有文本上(Brill Tagger)。然后,语法上无效的句子立即被消除。然后,代词或过去时的突然变化表示该文章已经结束或尚未开始。搜索并消除重复的短语,例如“雅虎新闻体育财经”在页面中出现十次。您还可以通过大量与各种情感相关的词库来获得有关语气的统计信息。从积极/消极/金融到被动/积极/政治的语气突然变化表明了界限。确实,它是无止境的,但是您想要深入了解。
主要问题是链接,嵌入式异常,脚本样式和更新。