nltk在python中的NERTagger UnicodeDecodeError

时间:2015-01-03 06:47:20

标签: python nltk stanford-nlp

我在python 2.7.6中编写一个程序,它使用nltk和Window 7 professional中的斯坦福命名实体标记器来标记文本并按如下方式打印结果:

import re

from nltk.tag.stanford import NERTagger

WORD = re.compile(r'\w+')

st = NERTagger("./classifiers/english.all.3class.distsim.crf.ser.gz", "stanford-ner.jar")

text = "title Wienfilm 1896-1976 (1976)"

words = WORD.findall(text )

print words

answer = st.tag(words )

print answer

程序中的最后一个print语句假设返回一个由五个列表组成的元组:

     [(u'title', u'O'), (u'Wienfilm', u'O'), (u'1896', u'O'), (u'1976', u'O'), (u'1976', u'O')]

但是,当我运行程序时,它会给我以下错误消息:

['title', 'Wienfilm', '1896', '1976', '1976']
Traceback (most recent call last):
  File "E:\Google Drive\myPyPrgs\testNLP.py", line 27, in <module>
    answer = st.tag(words )
  File "C:\Python27\lib\site-packages\nltk\tag\stanford.py", line 59, in tag
    return self.tag_sents([tokens])[0]
  File "C:\Python27\lib\site-packages\nltk\tag\stanford.py", line 82, in tag_sents
    stanpos_output = stanpos_output.decode(encoding)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 23: ordinal not in  
  range(128)

请注意,如果我删除号码,&#39; -1976&#39;从文本字符串开始,程序标记并打印正确的答案。但如果数字是&#39; -1976&#39;在文本中,我总是有上述错误。

在这个论坛中,有人建议我更改nltk的stanford.py中的默认编码。当我将stanford.py中的默认编码从ascii更改为UTF-16并使用以下循环替换上述代码的最后一个print语句时:

    for i, word_pos in enumerate(answer):
         word, pos = word_pos
         print i ,  word.encode('utf-16'), pos.encode('utf-16') 

我得到以下错误输出:

             0 ÿþ ÿþtitle/O Wienfilm/O 1896 1976 1976/O 

请提供有关如何处理此问题的任何线索?提前谢谢。

4 个答案:

答案 0 :(得分:1)

这对我有用:在创建NERTagger对象时将编码参数指定为UTF-8

st = NERTagger("./classifiers/english.all.3class.distsim.crf.ser.gz", "stanford-ner.jar", encoding='utf-8')

答案 1 :(得分:0)

打开终端(cmd),然后写;

chcp

它应该返回类似的内容;

  

活动代码页:857

然后,写;

chcp 1254

之后,在.py脚本中,写入脚本的顶部;

# -*- coding: cp1254 -*-

这应该可以解决您的问题。如果不是,请复制这些代码并粘贴到脚本的顶部。

# -*-coding:utf-8-*-
import locale
locale.setlocale(locale.LC_ALL, '')

我之前解码时遇到很多问题,这些方法已经解决了。

  

ASCII只能解码2 ^ 7 = 128个字符,这就是你得到错误的原因。正如你在错误句中看到的那样 ordinal不在范围内(128)

请查看this网站。使用箭头键切换页面:-)我相信它会解决您的问题。

答案 2 :(得分:0)

在应用顶部添加:

import sys
reload(sys)
sys.setdefaultencoding("utf-8")

答案 3 :(得分:0)

我正在处理同样的问题,我通过在nltk中的internals.py中添加编码选项来解决它。

你必须打开internals.py saven: %YourPythonFolder%\ LIB \站点包\ NLTK \ internals.py

然后转到方法java并在#construct完整命令字符串后添加此行(关于第147行)

cmd = cmd + ['-inputEncoding', 'utf-8', '-outputEncoding', 'utf-8']

此部分代码必须如下所示:

# Construct the full command string.
cmd = list(cmd)
cmd = ['-cp', classpath] + cmd
cmd = [_java_bin] + _java_options + cmd
cmd = cmd + ['-inputEncoding', 'utf-8', '-outputEncoding', 'utf-8']

希望它有所帮助。