Вызовите PlaintextCorpusReader с параметром encoding = 'utf-8':
ptcr = nltk.corpus.PlaintextCorpusReader(Corpus, '.*', encoding='utf-8')
Редактировать: я вижу ... у вас есть две отдельные проблемы здесь:
а) Проблема токенизации: при тестировании с литеральной строкой из немецкого языка,
Вы думаете Вы
ввод юникода. На самом деле вы говорите 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
с немецкими данными, вот как:
данные правильно, так что они могут быть токенизированы, но затем «закодировать» свой юникод обратно в список 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)