Вызовите PlaintextCorpusReader с параметром encoding='utf-8':
ptcr = nltk.corpus.PlaintextCorpusReader(Corpus, '.*', encoding='utf-8')
Изменить: я вижу... у вас здесь две отдельные проблемы:
а) Проблема токенизации: когда вы тестируете буквальную строку с немецкого языка, вы думаете, что вводите Unicode. На самом деле вы говорите python взять байты между кавычками и преобразовать их в строку Unicode. Но ваши байты неправильно интерпретируются. Исправление: добавьте следующую строку в самый верх исходного файла.
# -*- coding: utf-8 -*-
Внезапно ваши константы будут видны и токенизированы правильно:
german = u"Veränderungen über einen Walzer"
print nltk.tokenize.WordPunctTokenizer().tokenize(german)
Вторая проблема: оказывается, что Text()
не использует юникод! Если вы передадите ему строку 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)
person
alexis
schedule
06.02.2012