2012-05-16 64 views
1

我有一個非常簡單的CherryPy webservice,我希望它將成爲大型項目的基礎,但是,我需要獲得NLTK以我想要的方式工作。CherryPy WebService不會將NLTK搭配返回到瀏覽器窗口

我的Python腳本導入NLTK並使用NLTK的搭配(bigram)函數對預加載的數據進行一些分析。

我有幾個問題:

1)爲什麼沒有程序返回到搭配我的瀏覽器,但只有我的控制檯?

2)爲什麼如果我指定​​,程序會導入整套示例書籍(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()) 
+1

可能的答案#2:當你導入nltk時,它是否已經包含text1 - text9?我沒有使用過nltk,但我曾經和寫過它的人一起工作。 – Crisfole

+0

據我所知,導入NLTK不會導入書籍。 –

+0

關於#2,查看了代碼(http://code.google.com/p/nltk/source/browse/trunk/nltk/nltk/book.py),導入nltk.book只是加載每個文本 – Spaceghost

回答

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()) 
+0

不起作用。 NLTK旨在用於對語料庫進行交互式探索,並且調用搭配只是將結果轉儲到標準輸出。 – Spaceghost

+0

然後在一個線程化的web服務器中,你可以做的事情並不多。您可以嘗試將stdout重新路由到一個StringIO或文件,但那不會是線程安全的。你可以嘗試用一個threadlocal類文件對象代替stdout,我將在一個單獨的答案中作爲一個冒險靈魂的練習離開。 – fumanchu

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中獲取所需的位,然後編寫一個只加載就職地址的方法。

+0

Spaceghost:感謝您的意見。我對搭配功能的結果沒有任何問題:它正在做它應該做的事情。我的問題是,我無法使用我創建的簡單CherryPy webservice將結果傳遞給客戶端,而且我沒有足夠的python/webservices知識來解決我的問題。謝謝。 –

+0

問題是該函數寫入控制檯並且不返回任何內容。按照我給你看的代碼,你可以借用它來創建一個版本,它將結果返回給變量而不是寫入控制檯 – Spaceghost

3

我一直在做一些工作,白鯨,我無意中發現了答案進口只是一個特定文本前些天的問題:

>>>import nltk.corpus 
>>>from nltk.text import Text 
>>>moby = Text(nltk.corpus.gutenberg.words('melville-moby_dick.txt')) 

因此,你真正需要的是fileid以便將該文件的文本分配給新的Text對象。但要小心,因爲gutenberg.words目錄中只有「文學」來源。

無論如何,對於找到文件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())

我記得當試圖回答這個問題我自己,所以也許這個信息,如果來晚了,將有助於有人的地方閱讀此線程在一個月前。

(這是我堆棧溢出的第一個貢獻。我一直在讀了幾個月,從來沒有任何有用的補充,直到如今。只想通常說「感謝大家所有幫助。」)

+0

「這還不能回答你的具體語料庫的問題,就職地址」。請仔細閱讀我的問題,我從不問任何關於就職演講的內容。你混淆了你的答案,但無論如何。 –

+0

當你在上面寫道你正在運行以下命令時,'從nltk.book導入text4',我假設你正試圖將「text4」分配給某個可以使用的對象。 nltk.book模式中的Text4是「text4:Inaugural Address Corpus」,通過閱讀Google代碼簿確認:http://nltk.googlecode.com/svn/trunk/doc/book/ch01。html 可能你不知道你想要導入什麼文本,或者你爲什麼導入它? – erewok

+0

我的問題處理cherrypy webservice不顯示任何nltk.book在瀏覽器中的結果,但在控制檯中。雖然,在仔細查看邏輯之後,我沒有編寫你的答案,但它似乎比用這裏建議的threadlocal文件類對象替換stdout更加正確和簡單。我很久以前就在我的項目中解決了這個問題(我從來沒有打算在我的項目中使用NLTK語料庫),但它總是困擾我無法將任何nltk.book的搭配輸出到web服務。謝謝。 –