使用带utf8的NLTK标记器

时间:2016-04-01 15:25:00

标签: python csv nltk

我是Python的新用户,我主要使用导入的文本文件,特别是csv,这让我很难处理。我试着阅读像这样的文档:https://docs.python.org/2/howto/unicode.html但我不明白所说的内容的线索。我只是想要一些直截了当的解释。

例如,我想将从互联网导出的大量verbatims标记为csv文件。我想使用NLTK的tokenizer来实现。

这是我的代码:

{{1}}

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

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

  

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

它看起来像编码问题。每次使用文本操作时都会遇到同样的问题。你能帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

这应该这样做:

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)

答案 1 :(得分:0)

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

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

如果您打算使用文本,您应该真正理解这些差异。

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

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

我不确定你的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)

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