使用参数encoding='utf-8'调用PlaintextCorpusReader:
ptcr = nltk.corpus.PlaintextCorpusReader(Corpus, '.*', encoding='utf-8')
编辑:我明白了......你这里有两个不同的问题:
a) 标记化问题:当您使用德语的文字字符串进行测试时,
你think你是
输入unicode。事实上,你是在告诉 python 获取字节
并将它们转换为 unicode 字符串。但你的字节正在
被误解了。修复:在您的文件的最顶部添加以下行
源文件。
# -*- coding: utf-8 -*-
突然之间,您的常量将被正确地看到和标记:
german = u"Veränderungen über einen Walzer"
print nltk.tokenize.WordPunctTokenizer().tokenize(german)
第二个问题:事实证明Text()
不使用unicode!如果你
向它传递一个 unicode 字符串,它会尝试将其转换为纯 ascii
字符串,这在非 ASCII 输入上当然会失败。啊。
解决方案:我的建议是避免使用nltk.Text
完全,并直接与语料库读者合作。 (这通常是一个好主意:参见nltk.Text
自己的文档)。
但如果你must use nltk.Text
对于德国数据,操作方法如下:阅读您的
数据正确,以便可以对其进行标记,然后将您的 unicode“编码”回列表str
。对于德语来说,就是
使用 Latin-1 编码可能是最安全的,但 utf-8 似乎也可以
也。
ptcr = nltk.corpus.PlaintextCorpusReader(Corpus, '.*', encoding='utf-8');
# Convert unicode to utf8-encoded str
coded = [ tok.encode('utf-8') for tok in ptcr.words(DocumentName) ]
words = nltk.Text(coded)