Cómo eliminar las palabras vacías usando nltk o python


110

Así que tengo un conjunto de datos que me gustaría eliminar el uso de palabras vacías

stopwords.words('english')

Estoy luchando por cómo usar esto dentro de mi código para simplemente eliminar estas palabras. Ya tengo una lista de las palabras de este conjunto de datos, la parte con la que estoy luchando es comparar con esta lista y eliminar las palabras vacías. Se agradece cualquier ayuda.


4
¿De dónde sacaste las palabras vacías? ¿Es esto de NLTK?
tumultous_rooster

37
@ MattO'Brien from nltk.corpus import stopwordspara futuros googlers
danodonovan

13
También es necesario ejecutarlo nltk.download("stopwords")para que el diccionario de palabras vacías esté disponible.
sffc


1
Preste atención a que una palabra como "no" también se considera una palabra vacía en nltk. Si hace algo como análisis de sentimientos, filtrado de spam, una negación puede cambiar todo el significado de la oración y si la elimina de la fase de procesamiento, es posible que no obtenga resultados precisos.
Darkov

Respuestas:


206
from nltk.corpus import stopwords
# ...
filtered_words = [word for word in word_list if word not in stopwords.words('english')]

Gracias a ambas respuestas, ambas funcionan, aunque parece que tengo una falla en mi código que impide que la lista de detención funcione correctamente. ¿Debería ser esta una nueva publicación de preguntas? ¡No estoy seguro de cómo funcionan las cosas por aquí todavía!
Alex

51
Para mejorar el rendimiento, considere en su stops = set(stopwords.words("english"))lugar.
isakkarlsson

1
>>> importar nltk >>> nltk.download () Fuente

2
stopwords.words('english')son minúsculas. Así que asegúrese de usar solo palabras en minúscula en la lista, por ejemplo[w.lower() for w in word_list]
AlexG

19

También puede hacer una diferencia de conjuntos, por ejemplo:

list(set(nltk.regexp_tokenize(sentence, pattern, gaps=True)) - set(nltk.corpus.stopwords.words('english')))

16
Nota: esto convierte la oración en un SET que elimina todas las palabras duplicadas y, por lo tanto, no podrá usar el conteo de frecuencia en el resultado
David Dehghan

1
la conversión a un conjunto podría eliminar información viable de la oración al eliminar múltiples apariciones de una palabra importante.
Ujjwal

14

Supongo que tiene una lista de palabras (word_list) de las que desea eliminar las palabras vacías. Podrías hacer algo como esto:

filtered_word_list = word_list[:] #make a copy of the word_list
for word in word_list: # iterate over word_list
  if word in stopwords.words('english'): 
    filtered_word_list.remove(word) # remove word from filtered_word_list if it is a stopword

5
esto será mucho más lento que la comprensión de la lista de Daren Thomas ...
drevicko

12

Para excluir todo tipo de palabras vacías, incluidas las palabras vacías nltk, puede hacer algo como esto:

from stop_words import get_stop_words
from nltk.corpus import stopwords

stop_words = list(get_stop_words('en'))         #About 900 stopwords
nltk_words = list(stopwords.words('english')) #About 150 stopwords
stop_words.extend(nltk_words)

output = [w for w in word_list if not w in stop_words]

Estoy recibiendo len(get_stop_words('en')) == 174vslen(stopwords.words('english')) == 179
rubencart

6

Hay un paquete de Python muy simple y liviano stop-wordssolo por este motivo.

Primero instale el paquete usando: pip install stop-words

Luego, puede eliminar sus palabras en una línea usando la comprensión de listas:

from stop_words import get_stop_words

filtered_words = [word for word in dataset if word not in get_stop_words('english')]

Este paquete es muy liviano para descargar (a diferencia de nltk), funciona tanto para Python 2y Python 3, y tiene palabras vacías para muchos otros lenguajes como:

    Arabic
    Bulgarian
    Catalan
    Czech
    Danish
    Dutch
    English
    Finnish
    French
    German
    Hungarian
    Indonesian
    Italian
    Norwegian
    Polish
    Portuguese
    Romanian
    Russian
    Spanish
    Swedish
    Turkish
    Ukrainian

3

Utilice la biblioteca Textcleaner para eliminar palabras irrelevantes de sus datos.

Siga este enlace: https://yugantm.github.io/textcleaner/documentation.html#remove_stpwrds

Siga estos pasos para hacerlo con esta biblioteca.

pip install textcleaner

Después de instalar:

import textcleaner as tc
data = tc.document(<file_name>) 
#you can also pass list of sentences to the document class constructor.
data.remove_stpwrds() #inplace is set to False by default

Utilice el código anterior para eliminar las palabras vacías.


1

puede usar esta función, debe notar que necesita reducir todas las palabras

from nltk.corpus import stopwords

def remove_stopwords(word_list):
        processed_word_list = []
        for word in word_list:
            word = word.lower() # in case they arenet all lower cased
            if word not in stopwords.words("english"):
                processed_word_list.append(word)
        return processed_word_list

1

usando filtro :

from nltk.corpus import stopwords
# ...  
filtered_words = list(filter(lambda word: word not in stopwords.words('english'), word_list))

3
si word_listes grande, este código es muy lento. Es mejor para convertir la lista de palabras vacías a un conjunto antes de usarlo: .. in set(stopwords.words('english')).
Robert

1

Aquí está mi opinión sobre esto, en caso de que desee obtener inmediatamente la respuesta en una cadena (en lugar de una lista de palabras filtradas):

STOPWORDS = set(stopwords.words('english'))
text =  ' '.join([word for word in text.split() if word not in STOPWORDS]) # delete stopwords from text

No utilice este enfoque en francés l 'o no será capturado.
David Beauchemin

0

En caso de que sus datos se almacenen como un Pandas DataFrame, puede usar remove_stopwordsdesde textero que usan la lista de palabras vacías NLTK por defecto .

import pandas as pd
import texthero as hero
df['text_without_stopwords'] = hero.remove_stopwords(df['text'])

0
from nltk.corpus import stopwords 

from nltk.tokenize import word_tokenize 

example_sent = "This is a sample sentence, showing off the stop words filtration."

  
stop_words = set(stopwords.words('english')) 
  
word_tokens = word_tokenize(example_sent) 
  
filtered_sentence = [w for w in word_tokens if not w in stop_words] 
  
filtered_sentence = [] 
  
for w in word_tokens: 
    if w not in stop_words: 
        filtered_sentence.append(w) 
  
print(word_tokens) 
print(filtered_sentence) 

-3
   import sys
print ("enter the string from which you want to remove list of stop words")
userstring = input().split(" ")
list =["a","an","the","in"]
another_list = []
for x in userstring:
    if x not in list:           # comparing from the list and removing it
        another_list.append(x)  # it is also possible to use .remove
for x in another_list:
     print(x,end=' ')

   # 2) if you want to use .remove more preferred code
    import sys
    print ("enter the string from which you want to remove list of stop words")
    userstring = input().split(" ")
    list =["a","an","the","in"]
    another_list = []
    for x in userstring:
        if x in list:           
            userstring.remove(x)  
    for x in userstring:           
        print(x,end = ' ') 
    #the code will be like this

es mejor agregar las palabras irrelevantes.words ("inglés") que especificar cada palabra que necesita eliminar.
Lideró el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.