我正试图从德语文档中提取单词,当我使用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']
在本例中,“ä”被视为分隔符,即使“ä”不是。
看看http://text-processing.com/demo/tokenize/ 我不确定你的文本是否得到了正确的编码,因为演示中的WordPunctTokenizer可以很好地处理这些单词。PunktWordTokenizer也是。
使用参数encoding='utf-8'调用PlaintextCorpusReader:
编辑:我明白了。。。这里有两个不同的问题:
a)标记化问题:当您使用德语文本字符串进行测试时, 你认为你是 正在输入unicode。实际上,您告诉python取字节 在引号之间并将其转换为unicode字符串。但是你的字节 被曲解了。修正:在你的 源文件。
突然间,你的常量将被正确地看到和标记:
第二个问题:原来
Text()
不使用unicode!如果你 传递一个unicode字符串,它将尝试将其转换为纯ascii 字符串,这当然会在非ascii输入时失败。呃。解决方案:我的建议是避免完全使用
nltk.Text
,直接使用语料库阅读器。(这通常是一个好主意:参见nltk.Text
自己的文档)。但是,如果您必须对德语数据使用
nltk.Text
,请阅读 正确地对数据进行标记,然后将unicode“编码”回str
列表。对于德国人来说 也许只使用拉丁-1编码是最安全的,但是utf-8似乎可以工作 我也是。您可以尝试一个简单的正则表达式。如果您只需要单词,下面的内容就足够了;它将吞掉所有标点符号:
请注意,
re.U
根据当前区域设置更改RE中\w
的含义,因此请确保设置正确。我把它设置为en_US.UTF-8
,这对于您的示例来说显然已经足够好了。还要注意
"Veränderungen über einen Walzer".decode("utf-8")
和u"Veränderungen über einen Walzer"
是不同的字符串。相关问题 更多 >
编程相关推荐