Python NLTK snowball词干分析器UnicodeDecodeError在终端中,而不是Eclipse PyD

2024-03-28 13:27:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用滚雪球词干分析器在文档中插入单词,如下面的代码片段所示。在

    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在文档上运行这个时,我没有收到任何错误。当我在终端(macosx)上运行它时,我收到以下错误。有人能帮忙吗?在

^{pr2}$

Tags: 代码in文档retoken分析器错误单词
2条回答

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

如果转到运行配置(run>;run configurations),然后在“common”选项卡上说希望编码为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,则可能需要将其编码回预期的编码)。在

^{pr2}$

因此,您可以在替换之前将字符串设为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,但它可能与您必须使用的编码不同)

正如Fabio所说,这是因为Pydev更改了Python的默认编码。你知道,有三种可能的解决方案:

在Pydev之外测试代码

Pydev将对您隐藏编码问题,直到您在Eclipse之外运行代码。因此,不要使用Eclipse的“run”按钮,而是从shell测试代码。在

不过,我不建议这样做:这意味着您的开发环境将与运行环境不同,这只会导致出错。在

更改Python的默认编码

你可以改变Python的环境以适应Pydev的环境。在

This answer会告诉你怎么做,this one会告诉你为什么不应该这样做

长话短说,不要

阻止Pydev更改Python的默认编码

如果使用的是python2,Python的默认编码应该是ascii。因此,与其通过黑客攻击让你的环境远离Pydev,不如强迫Pydev“表现”一些。如何做到这一点是讨论here。在

相关问题 更多 >