python中文文本使用stanford解析器时如何解决解码问题
How to solve decoding while using stanford parser for Chinese text with python
我想用Stanford Parser 解析带有Python 接口的中文文本。我的代码如下:
#!~/anaconda/bin/python
# -*- coding: utf-8 -*-
from nltk.parse import stanford
parser = stanford.StanfordParser(path_to_jar='/home/stanford-parser/stanford-parser.jar', path_to_models_jar='/home/stanford-parser/stanford-parser-3.3.0-models.jar',model_path="/home/stanford-parser/chinesePCFG.ser.gz",encoding='utf8')
sentences = parser.raw_parse_sents(("我 是 中国 人。", "他 来自 美国。"))
print sentences
但是,当我尝试运行这段代码时,发生解码错误
Traceback (most recent call last):
File "/home/test.py", line 8, in <module>
sentences = parser.raw_parse_sents(("我 是 中国人。", "他 来自 美国。"))
File "/home/anaconda/lib/python2.7/site-packages/nltk/parse/stanford.py", line 176, in raw_parse_sents
return self._parse_trees_output(self._execute(cmd, '\n'.join(sentences), verbose))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)
我不知道为什么会出现这样的错误,因为我的代码是用 utf-8 编辑的,就像第二行一样。谁能帮我解释一下并解决它?我真的需要 Whosebug 社区的帮助。
解析器需要一个 unicode 对象(你实际上在创建时告诉它你将使用以 UTF-8 编码的数据。但是,你作为参数发送给它的只是普通字符串,基本上只是序列字节(在 Python 2.x 中)。您可以通过在字符串前添加 u
来创建 unicode literals,例如 u"我 是 中国 人"
>>> word = u"我 是 中国 人"
>>> type(word)
<type 'unicode'>
>>> print word
我 是 中国 人
并将现有纯字符串转换为 unicode 对象:
>>> word = "我 是 中国 人"
>>> type(word)
<type 'str'>
>>> unicode_word = unicode(word, encoding='utf8')
>>> type(unicode_word)
<type 'unicode'>
如果这些事情给您带来麻烦,我强烈建议您阅读 Python 文档的 Unicode HOWTO 部分,这可能会让一切变得更加清晰。
奖金
要将表示 Unicode 转义 序列的纯字符串转换为 Unicode 字符串,请使用 'unicode_escape'
encoding.
>>> type('\u6211')
<type 'str'>
>>> len('\u6211')
6
>>> converted = '\u6211'.decode('unicode_escape')
>>> type(converted)
<type 'unicode'>
>>> len(converted)
1
>>> print converted
我
我想用Stanford Parser 解析带有Python 接口的中文文本。我的代码如下:
#!~/anaconda/bin/python
# -*- coding: utf-8 -*-
from nltk.parse import stanford
parser = stanford.StanfordParser(path_to_jar='/home/stanford-parser/stanford-parser.jar', path_to_models_jar='/home/stanford-parser/stanford-parser-3.3.0-models.jar',model_path="/home/stanford-parser/chinesePCFG.ser.gz",encoding='utf8')
sentences = parser.raw_parse_sents(("我 是 中国 人。", "他 来自 美国。"))
print sentences
但是,当我尝试运行这段代码时,发生解码错误
Traceback (most recent call last):
File "/home/test.py", line 8, in <module>
sentences = parser.raw_parse_sents(("我 是 中国人。", "他 来自 美国。"))
File "/home/anaconda/lib/python2.7/site-packages/nltk/parse/stanford.py", line 176, in raw_parse_sents
return self._parse_trees_output(self._execute(cmd, '\n'.join(sentences), verbose))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)
我不知道为什么会出现这样的错误,因为我的代码是用 utf-8 编辑的,就像第二行一样。谁能帮我解释一下并解决它?我真的需要 Whosebug 社区的帮助。
解析器需要一个 unicode 对象(你实际上在创建时告诉它你将使用以 UTF-8 编码的数据。但是,你作为参数发送给它的只是普通字符串,基本上只是序列字节(在 Python 2.x 中)。您可以通过在字符串前添加 u
来创建 unicode literals,例如 u"我 是 中国 人"
>>> word = u"我 是 中国 人"
>>> type(word)
<type 'unicode'>
>>> print word
我 是 中国 人
并将现有纯字符串转换为 unicode 对象:
>>> word = "我 是 中国 人"
>>> type(word)
<type 'str'>
>>> unicode_word = unicode(word, encoding='utf8')
>>> type(unicode_word)
<type 'unicode'>
如果这些事情给您带来麻烦,我强烈建议您阅读 Python 文档的 Unicode HOWTO 部分,这可能会让一切变得更加清晰。
奖金
要将表示 Unicode 转义 序列的纯字符串转换为 Unicode 字符串,请使用 'unicode_escape'
encoding.
>>> type('\u6211')
<type 'str'>
>>> len('\u6211')
6
>>> converted = '\u6211'.decode('unicode_escape')
>>> type(converted)
<type 'unicode'>
>>> len(converted)
1
>>> print converted
我