2014-08-31 2 views
8

Привет Я пытаюсь изучить NLTK. Я новичок в Python. Я пытаюсь сделать следующее.NLTK 3 POS_TAG бросает UnicodeDecodeError

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

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

Traceback (most recent call last): File "", line 1, in nltk.pos_tag(nltk.word_tokenize("John lived in California")) File "C:\Python34\lib\site-packages\nltk\tag__init__.py", line 100, in pos_tag tagger = load(_POS_TAGGER) File "C:\Python34\lib\site-packages\nltk\data.py", line 779, in load resource_val = pickle.load(opened_resource) UnicodeDecodeError: 'ascii' codec can't decode byte 0xcb in position 0: ordinal not in range(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 

Что я здесь делаю неправильно?

ответ

15

ОК, я нашел решение. Похож на проблему в самом источнике. Check here

Я открыл data.py и модифицированной линии 779, как показано ниже

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

-1 Жесткая кодировка устаревшего кодирования устаревшей информации вряд ли подходит. – tripleee

+1

Любое другое решение, которое вы можете предоставить? –

+0

@ tripleee что-то лучше, чем ничего! –

2

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

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

Если вы хотите принять участие в отделке порта Python 3, вам, возможно, потребуется более глубокое понимание differences between Python 2 and 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#issuecomment-12778108 для исправление, идентичное вашему. Ошибка, с которой вы связаны, уже исправлена ​​в NLTK 3.0 (предположительно с помощью исправления для фактических файлов данных, я думаю, что в версии 3.0a3).

0

Использование 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.

0

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

+0

Если вы могли бы предоставить дополнительную информацию о ссылках, которые вы предоставили (например, некоторые условия поиска), это сделает ваш ответ более надежным, если ссылки будут отредактированы/удалены. – ryanyuyu

2

Я иду на это поздно, но в случае, если это поможет кому-то еще, кто приходит через это, что сработало для меня было расшифровать текст, прежде чем положить его в 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) 

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

Смежные вопросы