我在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
请提供有关如何处理此问题的任何线索?提前谢谢。
答案 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']
希望它有所帮助。