tutorial stopwords spanish ejemplo python nlp tokenize nltk

python - stopwords - ¿Cómo deshacerse de la puntuación con el tokenizador NLTK?



nltk tokenize spanish (7)

Estoy comenzando a usar NLTK y no entiendo muy bien cómo obtener una lista de palabras del texto. Si uso nltk.word_tokenize() , obtengo una lista de palabras y signos de puntuación. Necesito solo las palabras en su lugar. ¿Cómo puedo eliminar la puntuación? Además, word_tokenize no funciona con oraciones múltiples: los puntos se agregan a la última palabra.


Acabo de utilizar el siguiente código, que eliminó toda la puntuación:

tokens = nltk.wordpunct_tokenize(raw) type(tokens) text = nltk.Text(tokens) type(text) words = [w.lower() for w in text if w.isalpha()]


Como se notó en los comentarios, comience con sent_tokenize (), porque word_tokenize () solo funciona en una sola oración. Puede filtrar la puntuación con filter (). Y si tienes un unicode, asegúrate de que sea un objeto unicode (no un ''str'' codificado con alguna codificación como ''utf-8'').

from nltk.tokenize import word_tokenize, sent_tokenize text = ''''''It is a blue, small, and extraordinary ball. Like no other'''''' tokens = [word for sent in sent_tokenize(text) for word in word_tokenize(sent)] print filter(lambda word: word not in '',-'', tokens)


Creo que necesitas algún tipo de coincidencia de expresiones regulares (el siguiente código está en Python 3):

import string import re import nltk s = "I can''t do this now, because I''m so tired. Please give me some time." l = nltk.word_tokenize(s) ll = [x for x in l if not re.fullmatch(''['' + string.punctuation + '']+'', x)] print(l) print(ll)

Salida:

[''I'', ''ca'', "n''t", ''do'', ''this'', ''now'', '','', ''because'', ''I'', "''m", ''so'', ''tired'', ''.'', ''Please'', ''give'', ''me'', ''some'', ''time'', ''.''] [''I'', ''ca'', "n''t", ''do'', ''this'', ''now'', ''because'', ''I'', "''m", ''so'', ''tired'', ''Please'', ''give'', ''me'', ''some'', ''time'']

Debería funcionar bien en la mayoría de los casos, ya que elimina la puntuación mientras conserva símbolos como "no", que no se pueden obtener a partir de tokenizadores de wordpunct_tokenize como wordpunct_tokenize .


Eche un vistazo a las otras opciones de tokenización que nltk proporciona here . Por ejemplo, puede definir un tokenizador que selecciona secuencias de caracteres alfanuméricos como tokens y descarta todo lo demás:

from nltk.tokenize import RegexpTokenizer tokenizer = RegexpTokenizer(r''/w+'') tokenizer.tokenize(''Eighty-seven miles to go, yet. Onward!'')

Salida:

[''Eighty'', ''seven'', ''miles'', ''to'', ''go'', ''yet'', ''Onward'']


El siguiente código eliminará todos los signos de puntuación y los caracteres no alfabéticos. Copiado de su libro.

http://www.nltk.org/book/ch01.html

import nltk s = "I can''t do this now, because I''m so tired. Please give me some time. @ sd 4 232" words = nltk.word_tokenize(s) words=[word.lower() for word in words if word.isalpha()] print(words)

salida

[''i'', ''ca'', ''do'', ''this'', ''now'', ''because'', ''i'', ''so'', ''tired'', ''please'', ''give'', ''me'', ''some'', ''time'', ''sd'']


Realmente no necesitas NLTK para eliminar la puntuación. Puedes eliminarlo con python simple. Para cuerdas:

import string s = ''... some string with punctuation ...'' s = s.translate(None, string.punctuation)

O para Unicode:

import string translate_table = dict((ord(char), None) for char in string.punctuation) s.translate(translate_table)

y luego usa esta cadena en tu tokenizer.

El módulo de cadena PS tiene otros conjuntos de elementos que se pueden eliminar (como los dígitos).


Utilizo este código para eliminar la puntuación:

import nltk def getTerms(sentences): tokens = nltk.word_tokenize(sentences) words = [w.lower() for w in tokens if w.isalnum()] print tokens print words getTerms("hh, hh3h. wo shi 2 4 A . fdffdf. A&&B ")

Y si desea verificar si un token es una palabra válida en inglés o no, es posible que necesite PyEnchant

Tutorial:

import enchant d = enchant.Dict("en_US") d.check("Hello") d.check("Helo") d.suggest("Helo")