2013-05-21 37 views
3

我使用的雪球詞幹如下圖所示的代碼片段以遏制文檔的單詞。的Python NLTK雪球詞幹的UnicodeDecodeError在終端而不是Eclipse的PyDev的

stemmer = EnglishStemmer() 
    # Stem, lowercase, substitute all punctuations, remove stopwords. 
    attribute_names = [stemmer.stem(token.lower()) for token in wordpunct_tokenize(re.sub('[%s]' % re.escape(string.punctuation), '', doc)) if token.lower() not in stopwords.words('english')] 

當我在Eclipse中使用PyDev在文檔上運行時,我沒有收到任何錯誤。當我在終端(Mac OSX)中運行它時,我收到下面的錯誤消息。有人可以幫忙嗎?

File "data_processing.py", line 171, in __filter__ 
attribute_names = [stemmer.stem(token.lower()) for token in wordpunct_tokenize(re.sub('[%s]' % re.escape(string.punctuation), '', doc)) if token.lower()  not in stopwords.words('english')] 

File "7.3/lib/python2.7/site-packages/nltk-2.0.4-py2.7.egg/nltk/stem/snowball.py", line 694, in stem 
word = (word.replace(u"\u2019", u"\x27") 

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 7: ordinal not in range(128) 

回答

4

這在PyDev中起作用,因爲它將Python自身配置爲在控制檯(通常是UTF-8)的編碼中工作。

如果你去運行配置(運行>運行配置),那麼「共同」標籤上說,你想要的編碼是ascii字符可以再現的PyDev同樣的錯誤。

這是因爲你的話是一個字符串,你使用Unicode字符替換。

我希望下面的代碼帶來了曙光爲您提供:

這是所有考慮ASCII作爲缺省編碼:

>>> 'íã'.replace(u"\u2019", u"\x27") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa1 in position 0: ordinal not in range(128) 

但是,如果你做這一切在Unicode中,它的工作原理(你可能如果您希望處理字符串而不是unicode,則需要將其重新編碼爲您期望的編碼)。

>>> u'íã'.replace(u"\u2019", u"\x27") 
u'\xed\xe3' 

所以,你可以讓你的字符串的unicode之前替換

>>> 'íã'.decode('cp850').replace(u"\u2019", u"\x27") 
u'\xed\xe3' 

或者你可以編碼替換字符

>>> 'íã'.replace(u"\u2019".encode('utf-8'), u"\x27".encode('utf-8')) 
'\xa1\xc6' 

不過請注意,你必須知道什麼是真正的編碼你「再在任何地方工作(所以,雖然我的例子使用CP850或UTF-8,它可能是從你必須使用的編碼不同)

0

正如Fabio所說,發生這種情況是因爲Pydev更改了Python的默認編碼。一,你知道,有三種可能的解決方案:

測試代碼Pydev的

外Pydev的將隱藏你的編碼問題,直到您Eclipse之外運行代碼。因此,不要使用Eclipse的「運行」按鈕,而是從shell中測試您的代碼。

我不建議這一點,雖然:這意味着你的開發環境,將是從你的運行環境,這隻能導致正在犯的錯誤不同。

更改Python的默認編碼

你可以改變Python的環境,以適應Pydev的公司。它在this question (How to set the default encoding to UTF-8 in Python?)中討論。

This answer會告訴你怎麼做,this one會告訴你爲什麼你不應該這樣做。

長話短說,不要。

停止Pydev的更改Python的默認編碼

如果你使用的是Python 2,Python的默認編碼應爲ASCII。因此,不要讓Pydev的環境變成黑客,你最好強迫Pydev「表現出來」。如何做到這一點討論here