如何在Python / Django中找到给定URL的摘要文本?

16

如何为给定的URL找到摘要文本?

我所指的摘要文本是什么?

Merck 410亿美元收购Schering-Plough,追求科学技术

链接描述

默克(Merck)以410亿美元收购Schering-Plough公司,增加了用于治疗血栓、感染和精神分裂症的实验性药物,并使两家公司能够加快生物技术药物的研究。

对于上述URL,以下三行是摘要文本。
一段2到3行的简短描述,通常我们会通过获取该页面并检查内容,然后从html标记中找出短描述。

是否有好的算法可以做到这一点? (或者)
是否有在python/django中能够做到这一点的好的库?


可能是summarize text or simplify text的重复问题。 - Mišo
4个回答

22
我有同样的需求,虽然lemur具有摘要功能,但我发现它存在缺陷,无法使用。上周末,我使用nltk在python中编写了一个总结模块:https://github.com/thavelick/summarize 我从Java库Classifier4J中采用了算法:http://classifier4j.sourceforge.net/,但尽可能使用了nltk和Python。
以下是基本用法:
>>> import summarize

一个SimpleSummarizer(目前唯一的摘要工具)通过使用最常见的单词来生成摘要句。
>>> ss = summarize.SimpleSummarizer()
>>> input = "NLTK is a python library for working human-written text. Summarize is a package that uses NLTK to create summaries."
>>> ss.summarize(input, 1)
'NLTK is a python library for working human-written text.'

你可以按照自己的喜好,在摘要中指定任意数量的句子。
>>> input = "NLTK is a python library for working human-written text. Summarize is a package that uses NLTK to create summaries. A Summariser is really cool. I don't think there are any other python summarisers."
>>> ss.summarize(input, 2)
"NLTK is a python library for working human-written text.  I don't think there are any other python summarisers."

与Classifier4J的原始算法不同,这个摘要器可以正确处理除句号以外的标点符号:
>>> input = "NLTK is a python library for working human-written text! Summarize is a package that uses NLTK to create summaries."
>>> ss.summarize(input, 1)
'NLTK is a python library for working human-written text!'

更新

我现在(终于!)以Apache 2.0许可证发布了这个模块,与nltk相同,并将该模块放在github上(请参见上文)。欢迎任何贡献或建议。


@Trisan - 我的老板想问一下你是否考虑过这个软件的许可证问题?我在网站上找了你,但是没有看到任何信息。 - Glycerine
嗨,一年后我偶然发现了这个页面。我同意进行许可将是很好的选择。我想指出的是,有时输出结果会有错误...它会在摘要中重复某个句子的一部分。当我尝试将这篇长评论总结成5个句子时,运行程序会出现一个输出错误。 - Jordan Reiter
这个还有其他地方可以找到吗? - snøreven
我刚刚在 Github 上发布了这个,可以查看上面编辑过的答案。 - Tristan Havelick

4

文本摘要是一个相当复杂的主题。如果您需要认真地完成此项工作,您可能希望查看像Lemur(http://www.lemurproject.org/)这样的项目。

然而,我怀疑您真正想要的是一个文本摘要。如果您知道文档中包含正文的部分,请使用HTML解析库(例如BeautifulSoup)找到它,然后剥离HTML;取第一句话或前N个字符(哪种更适合),并使用它。有点像穷亲戚的摘要生成器 :-)


4
请查看自然语言工具包,如果你正在进行任何文本处理,它是一个非常有用的Python库。
然后看一下HP Luhn(1958)的这篇论文。它描述了一种天真但有效的生成摘要的方法。
使用nltk.probability.FreqDist对象跟踪单词在文本中出现的频率,然后根据最常见的单词在句子中出现的次数对句子进行评分。然后选择得分最高的句子,就可以得到文档的摘要。
我怀疑NLTK应该有一种从网络加载文档并将所有HTML标记排除的方法。我自己还没有做过这样的事情,但如果您查找语料库读取器,可能会找到一些有用的东西。

-3

在这种情况下,您最好使用类似于BeautifulSoup(http://www.crummy.com/software/BeautifulSoup/)的HTML解析库。

从那里,您可以获取例如所有页面p标签:

import urllib2

from BeautifulSoup import BeautifulSoup

page = urllib2.urlopen("http://www.bloomberg.com/apps/newspid=20601103&sid=a8p0FQHnw.Yo&refer=us")

soup = BeautifulSoup(page)

soup.findAll('p')

然后,进行一些解析。这完全取决于页面,因为每个站点的结构都不同。您可能会在某些站点上有所收获,因为它们可能会执行并且您只需查找其中一个具有id#summary的p标签,而其他站点(例如Blooberg)可能需要更多的尝试和实验。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接