Usando tokenizer NLTK con utf8

Soy un usuario bastante nuevo de Python y trabajo principalmente con archivos de texto importados, especialmente csv, que me dan muchos problemas para procesar. Intenté leer los documentos como este: https://docs.python.org/2/howto/unicode.html pero no entiendo nada de lo que se dice. Solo quiero una explicación directa y sencilla.

Por ejemplo, quiero tokenizar un gran número de verbatims exportados desde Internet como un archivo csv. Quiero usar el tokenizador de NLTK para hacerlo.

Aquí está mi código:

with open('verbatim.csv', 'r') as csvfile: reader = unicode_csv_reader(csvfile, dialect=csv.excel) for data in reader: tokens = nltk.word_tokenize(data) 

Cuando hago una impresión () en los datos, obtengo un texto limpio.

Pero cuando uso el método tokenizer, devuelve el siguiente error:

El códec ‘ascii’ no puede decodificar el byte 0xe9 en la posición 31: ordinal no está en el rango (128)

Parece un problema de encoding. Y siempre es el mismo problema con cada pequeña manipulación que hago con el texto. Me puede ayudar con esto ?

Esto debería hacerlo:

 with open('verbatim.csv') as csvfile: # No need to set mode to 'r', r is default reader = unicode_csv_reader(csvfile, dialect=csv.excel) for data in reader: tokens = nltk.word_tokenize(unicode(data, 'utf-8')) 

De lo contrario también puedes probar:

 import codecs with codecs.open('verbatim.csv', encoding='utf-8') as csvfile: reader = unicode_csv_reader(csvfile, dialect=csv.excel) for data in reader: tokens = nltk.word_tokenize(data) 

Primero tienes que entender que str y unicode son dos tipos diferentes.

Hay mucha documentación y grandes charlas sobre el tema. Creo que este es uno de los mejores: https://www.youtube.com/watch?v=sgHbC6udIqc

Si va a trabajar con texto, realmente debería entender las diferencias.

Muy simplificado, str es una secuencia de bytes. unicode es una secuencia de “caracteres” (puntos de código), para obtener una secuencia de bytes para encode el objeto Unicode con y la encoding.

Sí, complicado. Mi sugerencia, mira el video.

No estoy seguro de lo que hace tu unicode_csv_reader pero supongo que el problema está ahí, ya que nltk funciona con Unicode. Así que supongo que en unicode_csv_reader estás intentando codificar / decodificar algo con el códec incorrecto.

 In [1]: import nltk In [2]: nltk.word_tokenize(u'mi papá tiene 100 años') Out[2]: [u'mi', u'pap\xe1', u'tiene', u'100', u'a\xf1os'] 

Yo usaría el paquete unicodecsv de pypi. Lo que devuelve una lista de objetos Unicode para cada línea que puede pasar a nltk.

 import unicodecsv with open('verbatim.csv', 'r') as csvfile: reader = unicodecsv.reader(csvfile, dialect=csv.excel, encoding='iso-8859-1') for data in reader: tokens = nltk.word_tokenize(data) 

puede proporcionar y codificar al lector, y no es necesario utilizar códecs para abrir el archivo.