【问题标题】:Yet another unicode mess in PythonPython中的另一个unicode混乱
【发布时间】:2013-04-11 10:59:05
【问题描述】:

我正在使用 Python NLTK 标记一些 unicode 文本。 问题是文本来自编码错误的数据源,并且没有指定编码。经过一番折腾,我发现文本必须是 UTF-8 格式。 给定输入字符串:

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

我想用 NLTK 处理它,例如用于 POS 标记,但特殊字符未解析,我得到如下输出:

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

代替:

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

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

感谢您的任何反馈,

穆龙

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

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

在其他情况下,我仍然会在文本中看到 &
 之类的内容。 我需要做什么才能将其翻译成 NLTK 可以理解的内容?

【问题讨论】:

  • 不,您的示例输入文本已由您的代码完全转换为 Unicode。我没有看到任何 &#....; 逃脱。您的示例文本是您的方法返回的吗?
  • 实际上我将文本存储在一个文件中,写入一个 XML 文件,然后再次读取它,所有这些都使用 lxml。
  • 试试txt = lec.decode('utf8').encode('latin9')
  • 解码/编码不起作用。输出字符串是一样的。
  • 我从根本上简化了这个问题。

标签: python xml escaping special-characters nltk


【解决方案1】:

这不是字符/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 将其用于换行符)

【讨论】:

  • 如果我使用HTMLParser().unescape(s),我得到:u'The problem isn\u2019t getting to Huancavelica from Huancayo to the north.'
  • 这很好 - 这正是文本的内容。如果你打印它而不是在 REPL 中显示变量,你会看到“不是”。这不是典型的 ascii 撇号,但如果需要,您可以将其替换为一个。
  • 检查print HTMLParser.HTMLParser().unescape(s) -vs- print HTMLParser.HTMLParser().unescape(s).replace(u'\u2019', "'")
猜你喜欢
  • 1970-01-01
  • 2015-05-06
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
相关资源
最近更新 更多