NLTK 3 POS_TAG выбрасывает UnicodeDecodeError

Привет, я пытаюсь выучить NLTK. Я новичок в Python, а также. Я пытаюсь следующее.

>>import nltk
>>nltk.pos_tag(nltk.word_tokenize("John lived in China"))

Я получаю следующее сообщение об ошибке

Traceback (последний вызов был последним): Файл "", строка 1, в файле nltk.pos_tag(nltk.word_tokenize("Джон жил в Калифорнии")) Файл "C:\Python34\lib\site-packages\nltk\tag__init__. Py", строка 100, в файле pos_tag tagger = load(_POS_TAGGER)"C:\Python34\lib\site-packages\nltk\data.py", строка 779, в загрузке resource_val = pickle.load(open_resource) UnicodeDecodeError: 'ascii'кодек не может декодировать байт 0xcb в позиции 0: порядковый номер не в диапазоне (128)

Я скачал все доступные модели (включая maxent_treebank_pos_tagger)

Системная кодировка по умолчанию - UTF-8.

>>sys.getdefaultencoding()

Я открыл файл data.py, и это содержимое доступно.

774# Load the resource.
775    opened_resource = _open(resource_url)
776if format == 'raw':
777            resource_val = opened_resource.read()
778        elif format == 'pickle':
779            resource_val = pickle.load(opened_resource)
780        elif format == 'json':
781            import json

Что я здесь не так делаю?

5 ответов

Решение

ОК, я нашел решение для этого. Похоже, проблема в самом источнике. Проверьте здесь

Я открыл data.py и изменил строку 779, как показано ниже

resource_val = pickle.load(opened_resource) #old
resource_val = pickle.load(opened_resource, encoding='iso-8859-1') #new

Я подхожу к этому поздно, но в случае, если это поможет кому-то еще, кто сталкивался с этим, для меня работало, чтобы декодировать текст перед помещением его в word_tokenize, то есть:

raw_text = "John lived in China"
to_tokenize = raw_text.decode('utf-8')
tokenized = nltk.word_tokenize(to_tokenize)
output = nltk.pos_tag(tokenized)

Может быть, это будет работать для кого-то еще!

Основная проблема заключается в том, что NLTK 2.x не поддерживается для Python 3, а NLTK 3 - постоянная попытка выпустить полностью Python 3-совместимую версию.

Простой обходной путь - загрузить последнюю версию NLTK 3.x и использовать ее вместо этого.

Если вы хотите участвовать в завершении переноса на Python 3, вам, вероятно, нужно более глубокое понимание различий между Python 2 и Python 3; в частности, для этого случая, как основной тип строки в Python 3 является строкой Unicode (u'...'), а не байтовая строка (Python 3 b'...') как в Python 2. См. также http://nedbatchelder.com/text/unipain.html

FWIW, см. Также https://github.com/nltk/nltk/issues/169 для исправления, идентичного вашему. Ошибка, на которую вы ссылались, уже была исправлена ​​в NLTK 3.0 (предположительно, вместо исправления к фактическим файлам данных; я думаю, в 3.0a3).

Используя Python 3.4 и NLTK 3, вы можете это исправить, выполнив:

f = open('myClassifier_or_X_trained_model',mode='rb')
whereIuseTheModel = pickle.load(f,encoding='UTF-8')

Обратите внимание, что режим для открытия rb а также encoding='uft-8', Это решение не требует редактирования data.py,

Я перепробовал все ответы, но ничего не получилось, поэтому перешел по следующим 2 ссылкам

https://github.com/nltk/nltk/issues/169

https://github.com/nltk/nltk_data/tree/gh-pages/packages/taggers

  • скачал файл maxent_treebank_pos_tagger.zip.
  • расстегнул молнию и скопировал english.pickle подать и заменитьenglish.pickle файлы уже присутствуют в моем nltk_data папка с тегами -> C:\nltk_data\taggers\maxent_treebank_pos_tagger с новым.
  • Я также заменил один в папке C:\nltk_data\taggers\maxent_treebank_pos_tagger\PY3 на новый.

PS: я не знаю, что еще может повлиять, но сейчас я в порядке.

Другие вопросы по тегам