我在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
的情况下做到这一点?
任何想法都将不胜感激。
答案 0 :(得分:1)
在当前版本的nltk_data中,它们提供了两个版本的pickle文件:一个用于Python 2,另一个用于Python 3.例如,english.pickle
有一个nltk_data/taggers/maxent_treebank_pos_tagger
,nltk_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?