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

red*_*red 9 python nlp text-mining nltk

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

ptcr = nltk.corpus.PlaintextCorpusReader(Corpus, '.*');
words = nltk.Text(ptcr.words(DocumentName))
Run Code Online (Sandbox Code Playgroud)

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

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']
Run Code Online (Sandbox Code Playgroud)

在这个例子中,"ä"被视为分隔符,即使"ü"不是.

ale*_*xis 11

使用参数encoding ='utf-8'调用PlaintextCorpusReader:

ptcr = nltk.corpus.PlaintextCorpusReader(Corpus, '.*', encoding='utf-8')
Run Code Online (Sandbox Code Playgroud)

编辑:我明白了......你有两个不同的问题:

a)标记化问题:当您使用德语的文字字符串进行测试时,您认为您正在输入unicode.事实上,你告诉python取引号之间的字节并将它们转换为unicode字符串.但你的字节被误解了.修复:在源文件的最顶部添加以下行.

# -*- coding: utf-8 -*-
Run Code Online (Sandbox Code Playgroud)

突然间,您的常量将被正确显示和标记:

german = u"Veränderungen über einen Walzer"
print nltk.tokenize.WordPunctTokenizer().tokenize(german)
Run Code Online (Sandbox Code Playgroud)

第二个问题:事实证明Text()不使用unicode!如果你传递一个unicode字符串,它会尝试将它转换为pure-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)
Run Code Online (Sandbox Code Playgroud)


Fre*_*Foo 1

您可以尝试使用简单的正则表达式。如果您只想要文字,那么以下内容就足够了;它会吞掉所有标点符号:

\n\n
>>> import re\n>>> re.findall("\\w+", "Ver\xc3\xa4nderungen \xc3\xbcber einen Walzer.".decode("utf-8"), re.U)\n[u\'Ver\\xe4nderungen\', u\'\\xfcber\', u\'einen\', u\'Walzer\']\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,根据当前区域re.U设置更改 RE 中 的含义\\w,因此请确保设置正确。我已将其设置为en_US.UTF-8对于您的示例来说显然足够好。

\n\n

另请注意,"Ver\xc3\xa4nderungen \xc3\xbcber einen Walzer".decode("utf-8")u"Ver\xc3\xa4nderungen \xc3\xbcber einen Walzer"是不同的字符串。

\n