我正在使用带有 Python 3.4 的 NLTK 3.0
并且由于以下错误而无法进行 POS 标记:
我已阅读全部 similar posts related to similar problems ,但找不到解决问题的方法。大多数帖子都提到升级到 NLTK 3.0
将解决问题,但我已经有了 NLTK 3.0
。根据这些帖子,nltk 的 data.py
中的更改解决了问题,但是 NLTK
人们不鼓励这样做。
这是我的代码:
from nltk.tag import pos_tag
from nltk.tokenize import word_tokenize
pos_tag(word_tokenize("John's big idea isn't all that bad."))
这里是错误:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xcb in position 0: ordinal not in range(128)
有没有办法不用操作data.py
?
任何想法将不胜感激。
最佳答案
在当前版本的nltk_data中,他们提供了两个版本的pickle文件:一个用于Python 2,一个用于Python 3。例如,在nltk_data有一个
和一个位于 english.pickle
/taggers/maxent_treebank_pos_taggernltk_data/taggers/maxent_treebank_pos_tagger/PY3
。最新的 nltk 由装饰器自动处理此问题 py3_data
.
简而言之,如果您下载了最新的 nltk_data,但没有最新的 nltk,它可能会加载错误的 pickle 文件,引发 UnicodeDecodeError
异常。
注意:假设您已经拥有最新的 nltk,您可能会遇到一些路径错误,您可以在 pickle 文件的路径中看到两个“PY3”。这可能意味着一些开发人员不知道 py3_data
并且冗余地处理了路径。您可以自己删除/还原冗余。参见 this pull request举个例子。
关于python - 在 python 3.4 上使用 nltk 3.0 进行 pos 标记时出现编码错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26582284/