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.

Alex
fuente
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')]
Daren Thomas
fuente
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')))
David Lemphers
fuente
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
das_weezul
fuente
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]
sumitjainjr
fuente
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
user_3pij
fuente
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.

Yugant Hadiyal
fuente
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
Mohammed_Ashour
fuente
1

usando filtro :

from nltk.corpus import stopwords
# ...  
filtered_words = list(filter(lambda word: word not in stopwords.words('english'), word_list))
Saeid BK
fuente
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
justadev
fuente
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'])
Jonathan Besomi
fuente
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) 
HM
fuente
-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
Muhammad Yusuf
fuente
es mejor agregar las palabras irrelevantes.words ("inglés") que especificar cada palabra que necesita eliminar.
Lideró el