在python 3.4上用nltk 3.0进行pos标记编码错误

时间:2014-10-27 06:41:13

标签: 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'编解码器无法解码位置0的字节0xcb:序数不在范围内(128)

有没有办法在不操纵data.py的情况下做到这一点? 任何想法都将不胜感激。

2 个答案:

答案 0 :(得分:1)

在当前版本的nltk_data中,它们提供了两个版本的pickle文件:一个用于Python 2,另一个用于Python 3.例如,english.pickle有一个nltk_data/taggers/maxent_treebank_pos_taggernltk_data/taggers/maxent_treebank_pos_tagger/PY3有一个UnicodeDecodeError {1}}。最新的nltk由装饰者py3_data自动处理。

简而言之,如果您下载最新的nltk_data,但没有最新的nltk,则可能会加载错误的pickle文件,从而引发py3_data异常。

注意:假设您已经拥有最新的nltk,您可能会遇到一些路径错误,您可以在pickle文件的路径中看到两个" PY3"#。这可能意味着一些开发人员不知道{{1}}并且已经冗余地处理了这条路径。您可以自己删除/恢复冗余。有关示例,请参阅this pull request

答案 1 :(得分:0)

我对python3

没有任何问题
alvas@ubi:~$ python3
Python 3.4.0 (default, Apr 11 2014, 13:05:11) 
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from nltk import word_tokenize, pos_tag
>>> pos_tag(word_tokenize("John's big idea isn't all that bad."))
[('John', 'NNP'), ("'s", 'POS'), ('big', 'JJ'), ('idea', 'NN'), ('is', 'VBZ'), ("n't", 'RB'), ('all', 'DT'), ('that', 'DT'), ('bad', 'JJ'), ('.', '.')]

检查utf-8是否为sys.defaultencoding

>>> import sys
>>> sys.getdefaultencoding()
'utf-8'

如果没有,您可以采取一些措施来明确指定python的编码,请参阅Why should we NOT use sys.setdefaultencoding("utf-8") in a py script?