终端中的Python NLTK雪球阻止程序UnicodeDecodeError,但Eclipse PyDev没有

我正在使用snowball词干分析器来词干文档中的单词,如下面的代码片段所示.

    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)

解决方法:

这在PyDev中有效,因为它配置Python本身即可在控制台的编码中正常工作(通常为UTF-8).

如果您转到运行配置(运行>运行配置),则可以在PyDev中重现相同的错误,然后在“常用”选项卡上说您希望编码为ascii.

发生这种情况是因为您的单词是一个字符串,而您正在替换为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,但它可能与您必须使用的编码不同)

上一篇:java-来自pyth的jython的.class文件


下一篇:eclipese pyDEV安装----可以直接运行python文件