2013-04-11 77 views
1

我使用Python NLTK标记了一些unicode文本。 问题在于文本来自严重编码的数据源,并且未指定编码。经过一番弄乱之后,我发现文本必须是UTF-8格式。 鉴于输入字符串:Python中的另一个unicode混乱

s = u"The problem isn’t getting to Huancavelica from Huancayo to the north." 

我想处理它与NLTK,例如用于词性标注,但特殊字符不解决,我得到的输出,如:

The/DT problem/NN isn’t/NN getting/VBG 

相反的:

The/DT problem/NN isn't/VBG getting/VBG 

如何从这些特殊字符中清除文本?

感谢您的任何反馈,

Mulone

更新:如果我运行HTMLParser().unescape(s),我得到:

u'The problem isn\u2019t getting to Huancavelica from Huancayo to the north.' 

在其他情况下,我还是得到像&
在文本。 我需要做些什么才能将其转化为NLTK能够理解的内容?

+0

不,您的示例输入文本完全由您的码。我没有看到任何'&#....;'逃离左边。你的示例文本是什么*你的方法返回* – 2013-04-11 11:02:42

+0

其实我将文本存储在一个文件中,写入一个XML文件,然后再次读取,所有这些都使用lxml。 – Mulone 2013-04-11 11:06:18

+0

尝试类似'txt = lec.decode('utf8')。encode('latin9')' – 2013-04-11 11:26:15

回答

4

这不是一个字符/ Unicode编码问题。您拥有的文本包含标记的XML/HTML numeric character reference实体。无论你用什么库来解析文件,都应该提供一些功能,以便将’解除引用到合适的字符。

如果你不绑定到任何库,请参阅Decode HTML entities in Python string?

结果字符串包括一个特殊的撇号,而不是一个ASCII单引号。你可以在结果中替换它:

In [6]: s = u"isn’t" 

In [7]: print HTMLParser.HTMLParser().unescape(s) 
isn’t 

In [8]: print HTMLParser.HTMLParser().unescape(s).replace(u'\u2019', "'") 
isn't 

Unescape会照顾其余的角色。例如&&符号本身。 
是一个CR符号(\r),可以忽略或转换为换行符,具体取决于原始文本的来源(旧的mac用于换行符)

+0

如果我使用'HTMLParser()。unescape(s)',我会得到:'u'从Huancayo到北部,问题没有得到Huancavelica。'# – Mulone 2013-04-11 12:00:12

+0

我更新了我的问题。 – Mulone 2013-04-11 12:04:34

+2

这很好 - 这正是文本所在。如果你打印它而不是在REPL中显示变量,你会看到“不是”。这不是典型的ascii撇号,但如果需要,可以用一个替换它。 – viraptor 2013-04-11 12:04:37