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
我