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: я не знаю, что еще может повлиять, но сейчас я в порядке.