我有一个非常简单的CherryPy网络服务,我希望它将成为更大项目的基础,但是,我需要让NLTK以我想要的方式工作。
我的python脚本导入NLTK并使用NLTK的搭配(bigram)函数对预加载的数据进行一些分析。
我有几个问题:
1)为什么程序没有将搭配返回给我的浏览器,而只返回我的控制台?。
2)为什么如果我指定from nltk.book import text4
,程序会导入整套样本书(text1到text9)?
请记住,我是一个新手,所以答案可能就在我面前,但我没有看到。
主要问题:如何将配置结果传递给浏览器(webservice)而不是控制台?
由于
import cherrypy
import nltk
from nltk.book import text4
class BiGrams:
def index(self):
return text4.collocations(num=20)
index.exposed = True
cherrypy.quickstart(BiGrams())
答案 0 :(得分:3)
我一直在与 Moby Dick 做一些工作,我偶然发现了导入一个特定文本的问题的答案:
>>>import nltk.corpus
>>>from nltk.text import Text
>>>moby = Text(nltk.corpus.gutenberg.words('melville-moby_dick.txt'))
因此,您真正需要的只是fileid,以便将该文件的文本分配给新的Text对象。但要小心,因为只有“文学”来源在gutenberg.words目录中。
无论如何,为了帮助找到gutenberg的文件ID,在上面导入nltk.corpus之后,你可以使用以下命令:
>>> nltk.corpus.gutenberg.fileids()
['austen-emma.txt', 'austen-persuasion.txt', 'austen-sense.txt', 'bible-kjv.txt', 'blake-poems.txt', 'bryant-stories.txt', 'burgess-busterbrown.txt', 'carroll-alice.txt', 'chesterton-ball.txt', 'chesterton-brown.txt', 'chesterton-thursday.txt', 'edgeworth-parents.txt', 'melville-moby_dick.txt', 'milton-paradise.txt', 'shakespeare-caesar.txt', 'shakespeare-hamlet.txt', 'shakespeare-macbeth.txt', 'whitman-leaves.txt']
然而,这仍然没有回答您的特定语料库的问题,即就职演说。对于那个答案,我发现了麻省理工学院的这篇论文:http://web.mit.edu/6.863/www/fall2012/nltk/ch2-3.pdf
(我推荐给任何开始使用nltk文本的人,因为它讨论了抓取各种文本数据进行分析)。获取就职地址fileids的答案见第6页(稍后编辑):
>>> nltk.corpus.inaugural.fileids()
['1789-Washington.txt', '1793-Washington.txt', '1797-Adams.txt', '1801-Jefferson.txt', '1805-Jefferson.txt', '1809-Madison.txt', '1813-Madison.txt', '1817-Monroe.txt', '1821-Monroe.txt', '1825-Adams.txt', '1829-Jackson.txt', '1833-Jackson.txt', '1837-VanBuren.txt', '1841-Harrison.txt', '1845-Polk.txt', '1849-Taylor.txt', '1853-Pierce.txt', '1857-Buchanan.txt', '1861-Lincoln.txt', '1865-Lincoln.txt', '1869-Grant.txt', '1873-Grant.txt', '1877-Hayes.txt', '1881-Garfield.txt', '1885-Cleveland.txt', '1889-Harrison.txt', '1893-Cleveland.txt', '1897-McKinley.txt', '1901-McKinley.txt', '1905-Roosevelt.txt', '1909-Taft.txt', '1913-Wilson.txt', '1917-Wilson.txt', '1921-Harding.txt', '1925-Coolidge.txt', '1929-Hoover.txt', '1933-Roosevelt.txt', '1937-Roosevelt.txt', '1941-Roosevelt.txt', '1945-Roosevelt.txt', '1949-Truman.txt', '1953-Eisenhower.txt', '1957-Eisenhower.txt', '1961-Kennedy.txt', '1965-Johnson.txt', '1969-Nixon.txt', '1973-Nixon.txt', '1977-Carter.txt', '1981-Reagan.txt', '1985-Reagan.txt', '1989-Bush.txt', '1993-Clinton.txt', '1997-Clinton.txt', '2001-Bush.txt', '2005-Bush.txt', '2009-Obama.txt']
因此,您应该能够将特定的就职地址导入为文本(假设您从上面的“nltk.text导入文本”执行),或者您可以使用上面导入的“就职”标识符来处理它们。例如,这有效:
>>>address1 = Text(nltk.corpus.inaugural.words('2009-Obama.txt'))
实际上,您可以通过调用inaugural.words而不使用任何参数将所有就职地址视为一个文档,如以下this page中的示例所示:
>>>len(nltk.corpus.inaugural.words())
OR
地址=文字(nltk.corpus.inaugural.words())
我记得一个月前在尝试自己回答这个问题时阅读这个帖子,所以也许这些信息,如果来得晚,对某个人有帮助。
(这是我对Stack Overflow的第一次贡献。我已经阅读了好几个月,从来没有任何有用的东西可以添加到现在。只是想说一般'感谢所有人的帮助。')
答案 1 :(得分:1)
我的猜测是你从collocations()
调用回来的不是一个字符串,你需要序列化它。试试这个:
import cherrypy
import nltk
from nltk.book import text4
import simplejson
class BiGrams:
def index(self):
c = text4.collocations(num=20)
return simplejson.dumps(c)
index.exposed = True
cherrypy.quickstart(BiGrams())
答案 2 :(得分:0)
看看源代码(http://code.google.com/p/nltk/source/browse/trunk/nltk/),你会学到很多东西(我知道我做过)。
1)搭配正在返回你的控制台,因为它应该是它应该做的。
help(text4.collocations)
会给你:
Help on method collocations in module nltk.text:
collocations(self, num=20, window_size=2) method of nltk.text.Text instance
Print collocations derived from the text, ignoring stopwords.
@seealso: L{find_collocations}
@param num: The maximum number of collocations to print.
@type num: C{int}
@param window_size: The number of tokens spanned by a collocation (default=2)
@type window_size: C{int}
浏览text.py中的来源,你会发现搭配的方法很简单。
2)导入nltk.book加载每个文本。你可以从book.py中获取所需的位,然后编写一个只加载就职地址的方法。