Como remover palavras de parada usando nltk ou python

110

Então, eu tenho um conjunto de dados que gostaria de remover palavras de parada de usar

stopwords.words('english')

Estou lutando para usar isso no meu código para simplesmente tirar essas palavras. Já tenho uma lista das palavras deste conjunto de dados, a parte com a qual estou lutando é comparando a esta lista e removendo as palavras irrelevantes. Qualquer ajuda é apreciada.

Alex
fonte
4
De onde você tirou as palavras irrelevantes? É da NLTK?
tumultous_rooster
37
@ MattO'Brien from nltk.corpus import stopwordspara futuros googlers
danodonovan
13
Também é necessário executar nltk.download("stopwords")para disponibilizar o dicionário de palavras irrelevantes.
sffc
1
Preste atenção que uma palavra como "não" também é considerada uma palavra de ordem no nltk. Se você fizer algo como análise de sentimento, filtragem de spam, uma negação pode mudar todo o significado da frase e, se você removê-la da fase de processamento, pode não obter resultados precisos.
Darkov

Respostas:

206
from nltk.corpus import stopwords
# ...
filtered_words = [word for word in word_list if word not in stopwords.words('english')]
Daren Thomas
fonte
Graças a ambas as respostas, ambas funcionam, embora pareça que tenho uma falha no meu código que impede a lista de parada de funcionar corretamente. Esta deve ser uma nova postagem de pergunta? não tenho certeza de como as coisas funcionam por aqui ainda!
Alex
51
Para melhorar o desempenho, considere em stops = set(stopwords.words("english"))vez disso.
isakkarlsson
1
>>> import nltk >>> nltk.download () Fonte
2
stopwords.words('english')são minúsculas. Portanto, certifique-se de usar apenas palavras em minúsculas na lista, por exemplo[w.lower() for w in word_list]
AlexG
19

Você também pode fazer uma diferença definida, por exemplo:

list(set(nltk.regexp_tokenize(sentence, pattern, gaps=True)) - set(nltk.corpus.stopwords.words('english')))
David Lemphers
fonte
15
Nota: isso converte a frase em um SET que remove todas as palavras duplicadas e, portanto, você não poderá usar a contagem de frequência no resultado
David Dehghan
a conversão para um conjunto pode remover informações viáveis ​​da frase, eliminando várias ocorrências de uma palavra importante.
Ujjwal
14

Suponho que você tenha uma lista de palavras (lista de palavras) da qual deseja remover as palavras irrelevantes. Você poderia fazer algo assim:

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
fonte
5
isso será muito mais lento do que a compreensão da lista de Daren Thomas ...
drevicko
12

Para excluir todos os tipos de palavras irrelevantes, incluindo palavras irrelevantes, você pode fazer algo assim:

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
fonte
Estou ficando len(get_stop_words('en')) == 174contralen(stopwords.words('english')) == 179
rubencart
6

Existe um pacote python muito simples e leve stop-wordsapenas para isso.

Primeiro instale o pacote usando: pip install stop-words

Então, você pode remover suas palavras em uma linha usando a compreensão de lista:

from stop_words import get_stop_words

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

Este pacote é muito leve para baixar (ao contrário do nltk), funciona para ambos Python 2e Python 3, e tem palavras de parada para muitos outros idiomas 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
fonte
3

Use a biblioteca textcleaner para remover palavras irrelevantes de seus dados.

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

Siga estas etapas para fazer isso com esta biblioteca.

pip install textcleaner

Depois 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

Use o código acima para remover as palavras irrelevantes.

Yugant Hadiyal
fonte
1

você pode usar esta função, você deve perceber que precisa diminuir todas as palavras

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
fonte
1

usando filtro :

from nltk.corpus import stopwords
# ...  
filtered_words = list(filter(lambda word: word not in stopwords.words('english'), word_list))
Saeid BK
fonte
3
se word_listfor grande, esse código é muito lento. É melhor para converter a lista de stopwords a um conjunto antes de usá-lo: .. in set(stopwords.words('english')).
Robert
0

Aqui está minha opinião sobre isso, caso você queira colocar a resposta imediatamente em uma string (em vez de uma lista de palavras filtradas):

STOPWORDS = set(stopwords.words('english'))
text =  ' '.join([word for word in text.split() if word not in STOPWORDS]) # delete stopwords from text
Justadev
fonte
Não use essa abordagem em francês, ou então não será capturado.
David Beauchemin
0

No caso de seus dados serem armazenados como um Pandas DataFrame, você pode usar remove_stopwordsdo textero que usa a lista de palavras irrelevantes NLTK por padrão .

import pandas as pd
import texthero as hero
df['text_without_stopwords'] = hero.remove_stopwords(df['text'])
Jonathan Besomi
fonte
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
fonte
-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
fonte
é melhor adicionar o stopwords.words ("inglês") do que especificar todas as palavras que você precisa remover.
Liderou em