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

2024-05-26 22:56:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我该怎么做才能得到文档中的单词列表?

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

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

Out[231]: [u'Ver\xc3', u'\xa4', u'nderungen', u'\xc3\xbcber', u'einen', u'Walzer']

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


Tags: 文档教程单词wordstokenizenltkberver
3条回答

看看http://text-processing.com/demo/tokenize/ 我不确定你的文本是否得到了正确的编码,因为演示中的WordPunctTokenizer可以很好地处理这些单词。PunktWordTokenizer也是。

使用参数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列表。对于德国人来说 也许只使用拉丁-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)

您可以尝试一个简单的正则表达式。如果您只需要单词,下面的内容就足够了;它将吞掉所有标点符号:

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

相关问题 更多 >

    热门问题