2014-10-27 2 views
2

Я использую NLTK 3.0 с Python 3.4 и не могу сделать POS мечения из-за следующую ошибку: Я прочитал все similar posts related to similar problems, но не мог найти способ решить эту проблему. большинство сообщений упоминают, что обновление до NLTK 3.0 решит проблему, но у меня уже есть NLTK 3.0. Согласно этим сообщениям, изменение в data.py nltk решает проблему, но NLTK люди препятствуют этому. Вот мой код:кодирования в пос мечение с NLTK 3.0 на Python 3.4

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' codec can't decode byte 0xcb in position 0: ordinal not in range(128)

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

+0

Вы загружали данные NLTK с помощью предоставленного интерфейса ('nltk.download()' или что-то в этом роде), а не вручную (в этом случае у вас могут быть данные для Py2)? У меня точно такая же настройка, как у вас, и я не могу воспроизвести вашу ошибку. – michaelmeyer

ответ

1

В текущей версии nltk_data они предоставляют две версии файлов pickle: один для Pyt hon 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 и отрегулировали путь избыточно. Вы можете удалить/вернуть избыточность самостоятельно. См. Пример this pull request.

0

У меня нет никаких проблем с Python3

[email protected]:~$ 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, см. Why should we NOT use sys.setdefaultencoding("utf-8") in a py script?

+0

Спасибо, альва. Но перезагрузка (sys) и sys.setdefaultencoding вызовут меня «неопределенной переменной!». Похоже, что мой python не знает функций «перезагрузить» и «setdefaultencoding». Вы знаете причину или есть другой способ изменить кодировку по умолчанию? Заранее спасибо – Mohammadreza

+0

Каков ваш текущий результат при импорте sys; sys.getdefaultecnoding() '? – alvas

+0

Ошибка вывода: sys.setdefaultencoding ("utf-8") AttributeError: объект 'module' не имеет атрибута 'setdefaultencoding' – Mohammadreza