Ошибка кодирования в тегах pos с nltk 3.0 на python 3.4

Я использую NLTK 3.0 с Python 3.4 и не может делать POS-теги из-за следующей ошибки: я прочитал все похожие посты, связанные с похожими проблемами, но не смог найти способ решить эту проблему. большинство постов упоминают, что обновление до NLTK 3.0 решит проблему но у меня уже есть NLTK 3.0, Согласно этим сообщениям изменение в НЛТК data.py решает проблему но NLTK люди не одобряют этого. Вот мой код:

from nltk.tag import pos_tag
from nltk.tokenize import word_tokenize
pos_tag(word_tokenize("John's big idea isn't all that bad."))

и вот ошибка:

UnicodeDecodeError: кодек "ascii" не может декодировать байт 0xcb в позиции 0: порядковый номер не в диапазоне (128)

Есть ли способ сделать это без манипуляций data.py? Любая идея будет оценена.

2 ответа

Решение

В текущей версии nltk_data они предоставляют две версии файлов pickle: одну для Python 2 и одну для Python 3. Например, есть одна english.pickle в nltk_data/taggers/maxent_treebank_pos_tagger и один в nltk_data/taggers/maxent_treebank_pos_tagger/PY3, Новейший NLTK обрабатывает это автоматически декоратором py3_data,

Короче говоря, если вы загружаете новейшую версию nltk_data, но не используете новейшую версию nltk, она может загрузить неправильный файл pickle, что приведет к UnicodeDecodeError исключение.

Примечание: предположим, что у вас уже есть самый новый nltk, вы можете столкнуться с некоторой ошибкой пути, когда вы можете увидеть два "PY3" в пути файла pickle. Это может означать, что некоторые разработчики не знали о py3_data и обработали путь избыточно. Вы можете удалить / восстановить избыточность самостоятельно. Посмотрите этот запрос на получение примера.

У меня нет проблем с python3

alvas@ubi:~$ python3
Python 3.4.0 (default, Apr 11 2014, 13:05:11) 
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from nltk import word_tokenize, pos_tag
>>> pos_tag(word_tokenize("John's big idea isn't all that bad."))
[('John', 'NNP'), ("'s", 'POS'), ('big', 'JJ'), ('idea', 'NN'), ('is', 'VBZ'), ("n't", 'RB'), ('all', 'DT'), ('that', 'DT'), ('bad', 'JJ'), ('.', '.')]

Проверьте, что у вас есть utf-8 как твой sys.defaultencoding:

>>> import sys
>>> sys.getdefaultencoding()
'utf-8'

Если нет, есть несколько вещей, которые вы можете сделать, чтобы явно указать кодировку python, см. Почему мы НЕ должны использовать sys.setdefaultencoding("utf-8") в скрипте py?

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