【问题标题】:Python NLTK snowball stemmer UnicodeDecodeError in terminal but not Eclipse PyDev终端中的 Python NLTK 雪球词干分析器 UnicodeDecodeError 但不是 Eclipse PyDev
【发布时间】:2013-05-21 20:02:33
【问题描述】:

我正在使用雪球词干分析器来词干文档中的词,如下面的代码 sn-p 所示。

    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)

【问题讨论】:

    标签: python python-2.7 pydev nltk snowball


    【解决方案1】:

    这在 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,但它可能与您必须使用的编码不同)

    【讨论】:

      【解决方案2】:

      正如 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。因此,与其通过 hack 使您的环境与 Pydev 一致,不如强迫 Pydev “行为”。如何做到这一点在here 讨论。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-08
        • 1970-01-01
        相关资源
        最近更新 更多