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)
您可以尝试使用简单的正则表达式。如果您只想要文字,那么以下内容就足够了;它会吞掉所有标点符号:
\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
对于您的示例来说显然足够好。
另请注意,"Ver\xc3\xa4nderungen \xc3\xbcber einen Walzer".decode("utf-8")
和u"Ver\xc3\xa4nderungen \xc3\xbcber einen Walzer"
是不同的字符串。