www tutorial org espaƱol ejemplo book python-3.x nltk

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 archivos english.pickle ya presentes en mi carpeta de etiquetas nltk_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.