用德语文本中的nltk提取单词

时间:2012-02-05 13:43:10

标签: python nlp nltk text-mining

我正在尝试从德语文档中提取单词,当我使用nltk教程中描述的以下方法时,我无法获得具有特定语言特殊字符的单词。

ptcr = nltk.corpus.PlaintextCorpusReader(Corpus, '.*');
words = nltk.Text(ptcr.words(DocumentName))

如何获取文档中的单词列表?

德语短语nltk.tokenize.WordPunctTokenizer()的{​​{1}}示例如下:

Veränderungen über einen Walzer

在此示例中,“ä”被视为分隔符,即使“ü”不是。

3 个答案:

答案 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"是不同的字符串。