从德语文本中使用nltk提取单词

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

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

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

用于德语短语Veränderungen über einen Walzer nltk.tokenize.WordPunctTokenizer()的示例如下所示:

In [231]: nltk.tokenize.WordPunctTokenizer().tokenize(u"Veränderungen über einen Walzer")

Out[231]: [u'Verxc3', u'xa4', u'nderungen', u'xc3xbcber', u'einen', u'Walzer']

在这个例子中,“ä”被视为分隔符,即使“ü”不是。


使用参数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)

看看http://text-processing.com/demo/tokenize/我不确定你的文本是否得到正确的编码,因为演示中的WordPunctTokenizer处理单词的罚款。 PunktWordTokenizer也是如此。


你可以尝试一个简单的正则表达式。 如果你只想要这些单词,下面就足够了。 它会吞下所有的标点符号:

>>> import re
>>> re.findall("w+", "Veränderungen über einen Walzer.".decode("utf-8"), re.U)
[u'Verxe4nderungen', 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"是不同的字符串。

链接地址: http://www.djcxy.com/p/65157.html

上一篇: Extracting Words using nltk from German Text

下一篇: extract relationships using NLTK