www word_tokenize stopwords spanish org book python unicode nltk tokenize

python - word_tokenize - nltk tokenize spanish



Tokenizing Unicode usando nltk (3)

Debe asegurarse de que está pasando cadenas Unicode a los tokenizadores nltk. Obtengo las siguientes tokenizaciones idénticas de su cadena con ambos tokenizadores en mi extremo:

import nltk nltk.wordpunct_tokenize(''müsli pöök rääk''.decode(''utf8'')) # output : [u''m/xfcsli'', u''p/xf6/xf6k'', u''r/xe4/xe4k''] nltk.word_tokenize(''müsli pöök rääk''.decode(''utf8'')) # output: [u''m/xfcsli'', u''p/xf6/xf6k'', u''r/xe4/xe4k'']

Tengo archivos de texto que utilizan la codificación utf-8 que contiene caracteres como ''ö'', ''ü'', etc. Me gustaría analizar el texto de estos archivos, pero no consigo que el tokenizador funcione correctamente. Si utilizo el tokenizer estándar de nltk:

f = open(''C:/Python26/text.txt'', ''r'') # text = ''müsli pöök rääk'' text = f.read() f.close items = text.decode(''utf8'') a = nltk.word_tokenize(items)

Salida: [u''/ufeff'', u''m'', u''/xfc'', u''sli'', u''p'', u''/xf6'', u''/xf6'', u''k'', u''r'', u''/xe4'', u''/xe4'', u''k'']

Punkt tokenizer parece hacerlo mejor:

f = open(''C:/Python26/text.txt'', ''r'') # text = ''müsli pöök rääk'' text = f.read() f.close items = text.decode(''utf8'') a = PunktWordTokenizer().tokenize(items)

salida: [u''/ufeffm/xfcsli'', u''p/xf6/xf6k'', u''r/xe4/xe4k'']

Todavía hay ''/ ufeff'' antes del primer token que no puedo entender (no es que no pueda eliminarlo). ¿Qué estoy haciendo mal? Ayuda muy apreciada.


El código UFEE es un carácter de "ZERO WIDTH NO-BREAK SPACE" y no se considera como un espacio en el módulo re , por lo que PunktWordTokenizer() utiliza el regex r''/w+|[^/w/s]+'' con unicode y las banderas de puntos reconocen este carácter como una palabra. Si no desea eliminar el carácter manualmente, puede usar el siguiente tokenizador:

nltk.RegexpTokenizer(u''/w+|[^/w/s/ufeff]+'')


Es más probable que el carácter /uFEFF sea ​​parte del contenido leído del archivo. Dudo que haya sido insertado por el tokeniser. /uFEFF al principio de un archivo es una forma obsoleta de Byte Order Mark . Si aparece en cualquier otro lugar, entonces se trata como un espacio sin interrupción de ancho cero .

¿Fue el archivo escrito por Microsoft Notepad? Desde el módulo de codecs docs :

Para aumentar la confiabilidad con la que se puede detectar una codificación UTF-8, Microsoft inventó una variante de UTF-8 (que Python 2.5 llama "utf-8-sig") para su programa de Bloc de notas: antes de que se escriba cualquiera de los caracteres Unicode Se escribe el archivo, una lista de materiales codificada en UTF-8 (que se parece a esto como una secuencia de bytes: 0xef, 0xbb, 0xbf).

Intenta leer tu archivo usando codecs.open() lugar. Tenga en cuenta la codificación "utf-8-sig" que consume la lista de materiales.

import codecs f = codecs.open(''C:/Python26/text.txt'', ''r'', ''utf-8-sig'') text = f.read() a = nltk.word_tokenize(text)

Experimentar:

>>> open("x.txt", "r").read().decode("utf-8") u''/ufeffm/xfcsli'' >>> import codecs >>> codecs.open("x.txt", "r", "utf-8-sig").read() u''m/xfcsli'' >>>