【问题标题】:NLTK 3 POS_TAG throws UnicodeDecodeErrorNLTK 3 POS_TAG 抛出 UnicodeDecodeError
【发布时间】:2014-10-24 18:04:22
【问题描述】:

您好,我正在尝试学习 NLTK。我也是 Python 新手。我正在尝试以下方法。

>>import nltk
>>nltk.pos_tag(nltk.word_tokenize("John lived in China"))

我收到以下错误消息

Traceback(最近一次调用最后一次):文件“”,第 1 行,in nltk.pos_tag(nltk.word_tokenize("John 住在加利福尼亚")) 文件 "C:\Python34\lib\site-packages\nltk\tag__init__.py",第 100 行, 在 pos_tag 中 tagger = load(_POS_TAGGER) 文件“C:\Python34\lib\site-packages\nltk\data.py”,第 779 行,加载中 resource_val = pickle.load(opened_resource) UnicodeDecodeError: 'ascii' codec can't decode byte 0xcb in position 0: ordinal not in 范围(128)

我已经下载了所有可用的模型(包括 maxent_treebank_pos_tagger)

默认系统编码为 UTF-8

>>sys.getdefaultencoding()

我打开了 data.py 文件,这是可用的内容。

774# Load the resource.
775    opened_resource = _open(resource_url)
776if format == 'raw':
777            resource_val = opened_resource.read()
778        elif format == 'pickle':
779            resource_val = pickle.load(opened_resource)
780        elif format == 'json':
781            import json

我在这里做错了什么?

【问题讨论】:

    标签: python-3.x nltk


    【解决方案1】:

    好的,我找到了解决方案。看起来像源本身的问题。 Check here

    我打开data.py并修改第779行如下

    resource_val = pickle.load(opened_resource) #old
    resource_val = pickle.load(opened_resource, encoding='iso-8859-1') #new
    

    【讨论】:

    • -1 硬编码过时的传统编码几乎不是可行的方法。
    • 您可以提供任何其他解决方案吗?
    • @tripleee 有总比没有好!
    • 谢谢。比必须安装全新版本的 nltk 好多了!
    • 非常感谢!如果比我有的 nltk 版本更新,pip 不知道。这解决了问题!
    【解决方案2】:

    根本问题是 Python 3 不支持 NLTK 2.x,而 NLTK 3 正在努力发布与 Python 3 完全兼容的版本。

    简单的解决方法是下载最新的 NLTK 3.x 并改用它。

    如果你想参与完成对Python 3的移植,你可能需要对differences between Python 2 and Python 3有更深入的了解;特别是对于这种情况,Python 3 中的基本字符串类型如何是 Unicode 字符串 (u'...'),而不是 Python 2 中的字节字符串 (Python 3 b'...')。另请参阅 http://nedbatchelder.com/text/unipain.html

    FWIW,另请参阅 https://github.com/nltk/nltk/issues/169#issuecomment-12778108 以获得与您的相同的修复程序。您链接到的错误已在 NLTK 3.0 中修复(可能是通过修复实际数据文件;我认为在 3.0a3 中)。

    【讨论】:

      【解决方案3】:

      我来晚了,但如果它可以帮助遇到这个问题的其他人,对我有用的是在将文本放入 word_tokenize 之前对其进行解码,即:

      raw_text = "John lived in China"
      to_tokenize = raw_text.decode('utf-8')
      tokenized = nltk.word_tokenize(to_tokenize)
      output = nltk.pos_tag(tokenized)
      

      也许这对其他人有用!

      【讨论】:

        【解决方案4】:

        使用 Python 3.4 和 NLTK 3,您可以通过以下方式解决此问题:

        f = open('myClassifier_or_X_trained_model',mode='rb')
        whereIuseTheModel = pickle.load(f,encoding='UTF-8')
        

        注意打开的模式是rbencoding='uft-8'。此解决方案不需要编辑data.py

        【讨论】:

          【解决方案5】:

          我尝试了所有答案,但没有任何效果,所以点击以下 2 个链接,然后

          https://github.com/nltk/nltk/issues/169

          https://github.com/nltk/nltk_data/tree/gh-pages/packages/taggers

          • 下载了 maxent_treebank_pos_tagger.zip 文件。
          • 解压并复制english.pickle文件并替换 english.pickle 文件已存在于我的 nltk_data 标签文件夹中 --> C:\nltk_data\taggers\maxent_treebank_pos_tagger 与新的。
          • 我也替换了文件夹中的那个 C:\nltk_data\taggers\maxent_treebank_pos_tagger\PY3 用新的。

          PS:我不知道还有什么可能会受到影响,但现在我没事。

          【讨论】:

          • 如果您可以提供有关您提供的链接的更多信息(例如一些搜索词),这将使您的答案更加可靠,以防链接被编辑/删除。
          猜你喜欢
          • 1970-01-01
          • 2012-12-14
          • 2017-10-29
          • 1970-01-01
          • 2015-06-15
          • 1970-01-01
          • 1970-01-01
          • 2023-03-18
          相关资源
          最近更新 更多