Ошибка кодирования в тегах 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?