python 3.x - tutorial - NLTK 3 POS_TAG lanza UnicodeDecodeError
nltk tokenize (5)
OK, encontré la solución. Parece un problema en la fuente en sí. Chequea aquí
Abrí data.py y modifiqué la línea 779 como abajo
resource_val = pickle.load(opened_resource) #old
resource_val = pickle.load(opened_resource, encoding=''iso-8859-1'') #new
Hola, estoy tratando de aprender NLTK. Soy nuevo en Python también. Estoy intentando lo siguiente.
>>import nltk
>>nltk.pos_tag(nltk.word_tokenize("John lived in China"))
Recibo el siguiente mensaje de error
Rastreo (última llamada más reciente): Archivo "", línea 1, en nltk.pos_tag (nltk.word_tokenize ("John vivió en California")) Archivo "C: / Python34 / lib / site-packages / nltk / tag__init __. Py ", línea 100, en pos_tag tagger = load (_POS_TAGGER) Archivo" C: / Python34 / lib / site-packages / nltk / data.py ", línea 779, en load resource_val = pickle.load (opened_resource) UnicodeDecodeError: ''ascii ''codec no puede decodificar el byte 0xcb en la posición 0: ordinal no está en el rango (128)
He descargado todos los modelos disponibles (incluido el maxent_treebank_pos_tagger)
La codificación del sistema por defecto es UTF-8
>>sys.getdefaultencoding()
Abrí el archivo data.py y este es el contenido disponible.
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
¿Qué estoy haciendo mal aquí?
El problema fundamental es que NLTK 2.x no es compatible con Python 3, y NLTK 3 es un esfuerzo continuo para lanzar una versión totalmente compatible con Python 3.
La solución simple es descargar el último NLTK 3.x y usarlo en su lugar.
Si quieres participar en el acabado del puerto para Python 3, probablemente necesites una comprensión más profunda de las diferencias entre Python 2 y Python 3 ; en particular, para este caso, cómo el tipo de cadena fundamental en Python 3 es una cadena Unicode ( u''...''
), no una cadena de bytes (Python 3 b''...''
) como en Python 2. Consulte también http : //nedbatchelder.com/text/unipain.html
FWIW, consulte también https://github.com/nltk/nltk/issues/169#issuecomment-12778108 para obtener una solución idéntica a la suya. El error al que se vinculó ya se ha corregido en NLTK 3.0 (presumiblemente por una corrección a los archivos de datos reales, creo que en 3.0a3).
Usando Python 3.4 y NLTK 3 puedes solucionar esto haciendo:
f = open(''myClassifier_or_X_trained_model'',mode=''rb'')
whereIuseTheModel = pickle.load(f,encoding=''UTF-8'')
Tenga en cuenta que el modo para abrir es rb
y encoding=''uft-8''
. Esta solución no requiere editar data.py
Voy a llegar tan tarde, pero en caso de que ayude a alguien más a encontrarlo, lo que funcionó para mí fue decodificar el texto antes de ponerlo en word_tokenize, es decir:
raw_text = "John lived in China"
to_tokenize = raw_text.decode(''utf-8'')
tokenized = nltk.word_tokenize(to_tokenize)
output = nltk.pos_tag(tokenized)
¡Tal vez eso funcione para otra persona!
Intenté todas las respuestas, pero nada funcionó, así que seguí los siguientes 2 enlaces y luego
https://github.com/nltk/nltk/issues/169
https://github.com/nltk/nltk_data/tree/gh-pages/packages/taggers
- descargado el archivo maxent_treebank_pos_tagger.zip.
- descomprimí y copié el archivo
english.pickle
y reemplacé los archivosenglish.pickle
ya presentes en mi carpeta de etiquetasnltk_data
-> C: / nltk_data / taggers / maxent_treebank_pos_tagger con la nueva. - También reemplacé el de la carpeta C: / nltk_data / taggers / maxent_treebank_pos_tagger / PY3 con el nuevo.
PD: No sé qué más podría verse afectado, pero por ahora estoy bien.