我正在尝试从德语文档中提取单词,当我使用nltk教程中描述的以下方法时,我无法获得具有特定语言特殊字符的单词。
ptcr = nltk.corpus.PlaintextCorpusReader(Corpus, '.*');
words = nltk.Text(ptcr.words(DocumentName))
如何获取文档中的单词列表?
德语短语nltk.tokenize.WordPunctTokenizer()
的{{1}}示例如下:
Veränderungen über einen Walzer
在此示例中,“ä”被视为分隔符,即使“ü”不是。
答案 0 :(得分:11)
使用参数encoding ='utf-8'调用PlaintextCorpusReader:
ptcr = nltk.corpus.PlaintextCorpusReader(Corpus, '.*', encoding='utf-8')
编辑:我明白了......你在这里有两个不同的问题:
a)标记化问题:使用德语的文字字符串进行测试时, 你想想你是谁 进入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
自己的文档)。
但如果您必须使用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)
答案 1 :(得分:3)
看看http://text-processing.com/demo/tokenize/ 我不确定你的文本是否得到正确的编码,因为演示中的WordPunctTokenizer处理的话很好。 PunktWordTokenizer也是如此。
答案 2 :(得分:1)
您可以尝试使用简单的正则表达式。如果你只想要单词,以下就足够了;它将吞下所有标点符号:
>>> import re
>>> re.findall("\w+", "Veränderungen über einen Walzer.".decode("utf-8"), re.U)
[u'Ver\xe4nderungen', u'\xfcber', u'einen', u'Walzer']
请注意re.U
根据当前区域设置更改RE中\w
的含义,因此请确保正确设置。我把它设置为en_US.UTF-8
,这对你的例子来说显然已经足够了。
另请注意,"Veränderungen über einen Walzer".decode("utf-8")
和u"Veränderungen über einen Walzer"
是不同的字符串。