【问题标题】:Using NLTK tokenizer with utf8 [duplicate]将 NLTK 标记器与 utf8 一起使用 [重复]
【发布时间】:2016-07-21 11:36:14
【问题描述】:

我是一个相当新的 Python 用户,我主要处理导入的文本文件,尤其是 csv,这让我处理起来很头疼。我试图阅读这样的文档:https://docs.python.org/2/howto/unicode.html 但我不明白所说的内容。我只是想要一些直截了当的解释。

例如,我想将从互联网导出的大量逐字标记为 csv 文件。我想使用 NLTK 的分词器来做到这一点。

这是我的代码:

with open('verbatim.csv', 'r') as csvfile:
    reader = unicode_csv_reader(csvfile, dialect=csv.excel)
    for data in reader:
        tokens = nltk.word_tokenize(data)

当我对数据执行 print() 时,我会得到干净的文本。

但是当我使用tokenizer方法时,它返回以下错误:

'ascii' 编解码器无法解码位置 31 中的字节 0xe9:序数不在 范围(128)

看起来像是编码问题。我对文本进行的每一个小操作都会出现同样的问题。你能帮我解决这个问题吗?

【问题讨论】:

  • 错误在哪里?阅读csv时?或者在标记时?我猜你正在使用 python 2?
  • 你可以使用pypi.python.org/pypi/unicodecsv将csv替换为unicodecsv,完成:-)
  • 是的,我使用的是 Python 2.7。每当我尝试使用 NLTK 时,都会出现该错误。例如,标记器将适用于前几行文本,但我想一旦有特殊字符(重音......)它就会崩溃
  • 切换到 Python 3。众所周知,Python 2 不适合 NLP 任务; NLTK 从 3.0 版开始就很好地支持 Python 3。在 Python 3 中,csv.reader 接受编码 as shown in an answer to the duplicate target

标签: python csv nltk


【解决方案1】:

应该这样做:

with open('verbatim.csv') as csvfile:  # No need to set mode to 'r', r is default
    reader = unicode_csv_reader(csvfile, dialect=csv.excel)
    for data in reader:
        tokens = nltk.word_tokenize(unicode(data, 'utf-8'))

否则你也可以试试:

import codecs
with codecs.open('verbatim.csv', encoding='utf-8') as csvfile:
        reader = unicode_csv_reader(csvfile, dialect=csv.excel)
        for data in reader:
            tokens = nltk.word_tokenize(data)

【讨论】:

  • 感谢您的回答。但现在我得到一个列表,它不是 NLTK 的有效格式。这是错误:强制转换为 Unicode:需要字符串或缓冲区,找到列表
  • 所以 csv 阅读器返回一行值。你能打印数据并将输出粘贴到这里吗?
  • 尝试第二种方法。
【解决方案2】:

首先你要明白 str 和 unicode 是两种不同的类型。

有很多关于这个主题的文档和精彩的讨论。我认为这是最好的之一:https://www.youtube.com/watch?v=sgHbC6udIqc

如果您要使用文本,您应该真正了解这些差异。

过于简化,str 是一个字节序列。 unicode 是一个“字符”(代码点)序列,用于为您获取一个字节序列 encode 带有和编码的 unicode 对象。

是的,很复杂。我的建议,观看视频。

我不确定您的 unicode_csv_reader 做了什么,但我猜问题出在 nltk 与 unicode 一起使用。所以我猜想在 unicode_csv_reader 中你试图用错误的编解码器编码/解码一些东西。

In [1]: import nltk

In [2]: nltk.word_tokenize(u'mi papá tiene 100 años')
Out[2]: [u'mi', u'pap\xe1', u'tiene', u'100', u'a\xf1os']

我会使用来自 pypi 的包 unicodecsv。它为您可以传递给 nltk 的每一行返回一个 unicode 对象列表。

import unicodecsv
with open('verbatim.csv', 'r') as csvfile:
    reader = unicodecsv.reader(csvfile, dialect=csv.excel, encoding='iso-8859-1')
    for data in reader:
        tokens = nltk.word_tokenize(data)

您可以向阅读器提供和编码,无需使用编解码器打开文件。

【讨论】:

  • 感谢您的所有回答。您的任何建议都没有解决我的问题,但我会更深入地研究这个主题。
  • @NahidO。将您的数据发布到某个地方,也许我们可以看看我们可以提供帮助。
  • 非常感谢!这是一个示例数据:dropbox.com/s/890mu8y9mq3cxw7/…
  • 您的数据以 iso-8859-1 编码,因此请检查我的答案的更新。
猜你喜欢
  • 2016-10-23
  • 1970-01-01
  • 2019-01-18
  • 2018-08-08
  • 1970-01-01
  • 2019-04-21
  • 1970-01-01
  • 2012-12-24
相关资源
最近更新 更多