tutorial spanish natural language instalar funciones ejemplos curso como python nlp nltk stop-words

spanish - nltk python count words



EliminaciĆ³n de palabras prohibidas con NLTK (5)

@alvas tiene una buena respuesta. Pero, de nuevo, depende de la naturaleza de la tarea, por ejemplo, en la aplicación que desea considerar toda la conjunction por ejemplo , y, pero, si, while y todo determiner por ejemplo , a, a, some, most, every, no as stop words considerando todas las demás partes del discurso como legítimas, entonces es posible que desee examinar esta solución que utiliza el conjunto de etiquetas de voz parcial para descartar palabras, consulte la tabla 5.1 :

import nltk STOP_TYPES = [''DET'', ''CNJ''] text = "some data here " tokens = nltk.pos_tag(nltk.word_tokenize(text)) good_words = [w for w, wtype in tokens if wtype not in STOP_TYPES]

Estoy tratando de procesar un texto ingresado por el usuario eliminando las palabras vacías usando nltk toolkit, pero con la eliminación de palabras de paso se eliminan las palabras como ''y'', ''o'', ''no''. Quiero que estas palabras estén presentes después del proceso de eliminación de palabras prohibidas, ya que son operadores necesarios para el procesamiento posterior de texto como consulta. No sé cuáles son las palabras que pueden ser operadores en la consulta de texto, y también quiero eliminar palabras innecesarias de mi texto.


Hay una lista de palabras prohibidas incorporada en NLTK compuesta de 2.400 palabras de paso para 11 idiomas (Porter et al), ver http://nltk.org/book/ch02.html

>>> from nltk import word_tokenize >>> from nltk.corpus import stopwords >>> stop = set(stopwords.words(''english'')) >>> sentence = "this is a foo bar sentence" >>> print([i for i in sentence.lower().split() if i not in stop]) [''foo'', ''bar'', ''sentence''] >>> [i for i in word_tokenize(sentence.lower()) if i not in stop] [''foo'', ''bar'', ''sentence'']

Recomiendo ver el uso de tf-idf para eliminar las palabras vacías, ver Efectos de Stemming en la frecuencia del término?


La respuesta de @ alvas hace el trabajo, pero se puede hacer mucho más rápido. Suponiendo que tiene documents : una lista de cadenas.

from nltk.corpus import stopwords from nltk.tokenize import wordpunct_tokenize stop_words = set(stopwords.words(''english'')) stop_words.update([''.'', '','', ''"'', "''", ''?'', ''!'', '':'', '';'', ''('', '')'', ''['', '']'', ''{'', ''}'']) # remove it if you need punctuation for doc in documents: list_of_words = [i.lower() for i in wordpunct_tokenize(doc) if i.lower() not in stop_words]

Tenga en cuenta que debido a que aquí está buscando en un conjunto (no en una lista), la velocidad sería teóricamente len(stop_words)/2 veces más rápida, lo que es significativo si necesita operar a través de muchos documentos.

Para 5000 documentos de aproximadamente 300 palabras cada uno, la diferencia está entre 1.8 segundos para mi ejemplo y 20 segundos para @ alvas.

PD en la mayoría de los casos, necesita dividir el texto en palabras para realizar algunas otras tareas de clasificación para las cuales se usa tf-idf. Por lo tanto, lo más probable es que también sea mejor usar stemmer:

from nltk.stem.porter import PorterStemmer porter = PorterStemmer()

y para usar [porter.stem(i.lower()) for i in wordpunct_tokenize(doc) if i.lower() not in stop_words] dentro de un bucle.


Puede usar string.punctuation con la lista incorporada de stopwords NLTK:

from nltk.tokenize import word_tokenize, sent_tokenize from nltk.corpus import stopwords from string import punctuation words = tokenize(text) wordsWOStopwords = removeStopWords(words) def tokenize(text): sents = sent_tokenize(text) return [word_tokenize(sent) for sent in sents] def removeStopWords(words): customStopWords = set(stopwords.words(''english'')+list(punctuation)) return [word for word in words if word not in customStopWords]

Lista completa de palabras vacías NLTK


Sugiero que cree su propia lista de palabras del operador que saque de la lista de palabras prohibidas. Los conjuntos se pueden restar convenientemente, así que:

operators = set((''and'', ''or'', ''not'')) stop = set(stopwords...) - operators

Luego puede simplemente probar si una palabra está in o not in el conjunto sin depender de si sus operadores son parte de la lista de palabras prohibidas. Luego puede cambiar a otra lista de palabras prohibidas o agregar un operador.

if word.lower() not in stop: # use word