NLTK 3 POS_TAG抛出UnicodeDecodeError

时间:2014-08-31 08:03:31

标签: python-3.x nltk

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

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

我收到以下错误消息

  

Traceback(最近一次调用最后一次):文件“”,第1行,in          nltk.pos_tag(nltk.word_tokenize(“约翰住在加利福尼亚州”))文件“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'编解码器无法解码位置0的字节0xcb:序号不在   范围(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

我在这里做错了什么?

5 个答案:

答案 0 :(得分:16)

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

我打开了data.py并修改了第779行,如下所示

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

答案 1 :(得分: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'...')。另请参阅{{3 }}

FWIW,另请参阅http://nedbatchelder.com/text/unipain.html以了解与您相同的修复方法。您链接到的错误已经在NLTK 3.0中得到修复(可能是修改了实际的数据文件;我认为在3.0a3中)。

答案 2 :(得分:2)

我迟到了,但是如果有人帮助遇到这个问题的其他人,对我来说有用的就是在将文字放入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)

也许这会为其他人工作!

答案 3 :(得分:0)

使用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

答案 4 :(得分:0)

我尝试了所有的答案,但没有任何效果,所以按照以下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:我不知道还有什么可能会受到影响,但现在我还好。