Comment supprimer les mots vides en utilisant nltk ou python


110

J'ai donc un ensemble de données que je voudrais supprimer des mots vides d'utilisation

stopwords.words('english')

J'ai du mal à utiliser cela dans mon code pour simplement supprimer ces mots. J'ai déjà une liste des mots de cet ensemble de données, la partie avec laquelle je me bats est de comparer à cette liste et de supprimer les mots vides. Toute aide est appréciée.


4
D'où avez-vous obtenu les mots vides? Est-ce de NLTK?
tumultous_rooster

37
@ MattO'Brien from nltk.corpus import stopwordspour les futurs googleurs
danodonovan

13
Il est également nécessaire d'exécuter nltk.download("stopwords")pour rendre le dictionnaire de mots vides disponible.
sffc


1
Faites attention qu'un mot comme "pas" est également considéré comme un mot d'arrêt dans nltk. Si vous faites quelque chose comme l'analyse des sentiments, le filtrage du spam, une négation peut changer la signification entière de la phrase et si vous la supprimez de la phase de traitement, vous risquez de ne pas obtenir des résultats précis.
Darkov le

Réponses:


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

Grâce aux deux réponses, elles fonctionnent toutes les deux, même s'il semblerait que mon code présente une faille empêchant la liste d'arrêt de fonctionner correctement. Devrait-il s'agir d'un nouveau message de question? Je ne sais pas encore comment les choses fonctionnent ici!
Alex

51
Pour améliorer les performances, envisagez stops = set(stopwords.words("english"))plutôt.
isakkarlsson

1
>>> import nltk >>> nltk.download () Source

2
stopwords.words('english')sont en minuscules. Assurez-vous donc de n'utiliser que des mots en minuscules dans la liste, par exemple[w.lower() for w in word_list]
AlexG

19

Vous pouvez également faire un ensemble de différences, par exemple:

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

16
Remarque: cela convertit la phrase en un SET qui supprime tous les mots en double et vous ne pourrez donc pas utiliser le comptage de fréquence sur le résultat
David Dehghan

1
la conversion en un ensemble peut supprimer des informations viables de la phrase en grattant plusieurs occurrences d'un mot important.
Ujjwal

14

Je suppose que vous avez une liste de mots (word_list) dont vous souhaitez supprimer les mots vides. Vous pouvez faire quelque chose comme ceci:

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
ce sera beaucoup plus lent que la compréhension de la liste de Daren Thomas ...
drevicko

12

Pour exclure tous les types de mots vides, y compris les mots vides nltk, vous pouvez faire quelque chose comme ceci:

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]

Je me fais len(get_stop_words('en')) == 174vslen(stopwords.words('english')) == 179
rubencart

6

Il existe un package python léger très simple stop-wordsjuste pour cela.

Installez d'abord le package en utilisant: pip install stop-words

Ensuite, vous pouvez supprimer vos mots sur une ligne en utilisant la compréhension de liste:

from stop_words import get_stop_words

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

Ce package est très léger à télécharger (contrairement à nltk), fonctionne pour les deux Python 2et Python 3, et il a des mots vides pour de nombreuses autres langues comme:

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

3

Utilisez la bibliothèque textcleaner pour supprimer les mots vides de vos données.

Suivez ce lien: https://yugantm.github.io/textcleaner/documentation.html#remove_stpwrds

Suivez ces étapes pour le faire avec cette bibliothèque.

pip install textcleaner

Après l'installation:

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

Utilisez le code ci-dessus pour supprimer les mots vides.


2

en utilisant le filtre :

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

3
si word_listest grand, ce code est très lent. Il est préférable de convertir la liste des mots vides à un ensemble avant de l' utiliser: .. in set(stopwords.words('english')).
Robert

1

vous pouvez utiliser cette fonction, vous devriez remarquer que vous devez abaisser tous les mots

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

Voici mon point de vue à ce sujet, au cas où vous voudriez immédiatement obtenir la réponse dans une chaîne (au lieu d'une liste de mots filtrés):

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

N'utilisez pas cette approche en français sinon vous ne serez pas capturé.
David Beauchemin le

0

Dans le cas où vos données sont stockées en tant que Pandas DataFrame, vous pouvez utiliser remove_stopwordsfrom textero qui utilise la liste de mots vides NLTK par défaut .

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

il est préférable d'ajouter le stopwords.words ("anglais") plutôt que de spécifier tous les mots que vous devez supprimer.
Led
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.