python - 在 python 3.4 上使用 nltk 3.0 进行 pos 标记时出现编码错误

标签 python nltk pos-tagger

我正在使用带有 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_tagger 和一个位于 nltk_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/

相关文章:

python - 而不是匹配,在scrapy中获取相同的url

nlp - Python 中意大利语的 Lemmatizer/PoS-tagger

python - 无法将 *IO() 对象分配给 WRITEDATA,pycurl

python - 为什么 csv 文件中的日期格式有错误?

python - 从函数返回 SQL 结果作为数组

python - 在 NLTK 中导入 WordNet

python - 用 nltk 解析最有效的方法

python-3.x - 在 windows64 中用于 python 3.6 的 nltk

r - 如何在R中使用OpenNLP获取POS标签?

java - 使用 stanford pos tagger 进行阿拉伯语标记