So entfernen Sie Stoppwörter mit nltk oder Python

109

Ich habe also einen Datensatz, dessen Verwendung ich Stoppwörter entfernen möchte

stopwords.words('english')

Ich habe Probleme damit, dies in meinem Code zu verwenden, um diese Wörter einfach herauszunehmen. Ich habe bereits eine Liste der Wörter aus diesem Datensatz. Der Teil, mit dem ich zu kämpfen habe, besteht darin, mit dieser Liste zu vergleichen und die Stoppwörter zu entfernen. Jede Hilfe wird geschätzt.

Alex
quelle
4
Woher hast du die Stoppwörter? Ist das von NLTK?
tumultous_rooster
37
@ MattO'Brien from nltk.corpus import stopwordsfür zukünftige Googler
danodonovan
13
Es muss auch ausgeführt nltk.download("stopwords")werden, um das Stoppwortwörterbuch verfügbar zu machen.
sffc
1
Achten Sie darauf, dass ein Wort wie "nicht" auch in nltk als Stoppwort betrachtet wird. Wenn Sie beispielsweise eine Stimmungsanalyse oder eine Spam-Filterung durchführen, kann eine Negation die gesamte Bedeutung des Satzes ändern. Wenn Sie ihn aus der Verarbeitungsphase entfernen, erhalten Sie möglicherweise keine genauen Ergebnisse.
Darkov

Antworten:

205
from nltk.corpus import stopwords
# ...
filtered_words = [word for word in word_list if word not in stopwords.words('english')]
Daren Thomas
quelle
Dank beider Antworten funktionieren beide, obwohl ich anscheinend einen Fehler in meinem Code habe, der die ordnungsgemäße Funktion der Stoppliste verhindert. Sollte dies ein neuer Fragenbeitrag sein? Ich bin mir noch nicht sicher, wie es hier läuft!
Alex
51
Ziehen Sie stops = set(stopwords.words("english"))stattdessen in Betracht, um die Leistung zu verbessern .
Isakkarlsson
1
>>> import nltk >>> nltk.download () Source
2
stopwords.words('english')sind Kleinbuchstaben. [w.lower() for w in word_list]
Stellen Sie
19

Sie können auch ein Set-Diff ausführen, zum Beispiel:

list(set(nltk.regexp_tokenize(sentence, pattern, gaps=True)) - set(nltk.corpus.stopwords.words('english')))
David Lemphers
quelle
15
Hinweis: Dadurch wird der Satz in ein SET konvertiert, das alle doppelten Wörter entfernt. Daher können Sie die Frequenzzählung für das Ergebnis nicht verwenden
David Dehghan,
Durch das Konvertieren in eine Menge werden möglicherweise brauchbare Informationen aus dem Satz entfernt, indem mehrere Vorkommen eines wichtigen Wortes entfernt werden.
Ujjwal
14

Ich nehme an, Sie haben eine Liste von Wörtern (word_list), aus denen Sie Stoppwörter entfernen möchten. Sie könnten so etwas tun:

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
quelle
5
Dies wird viel langsamer sein als Daren Thomas 'Listenverständnis ...
Drevicko
12

Um alle Arten von Stoppwörtern, einschließlich nltk-Stoppwörtern, auszuschließen, können Sie Folgendes tun:

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
quelle
Ich bekomme len(get_stop_words('en')) == 174vslen(stopwords.words('english')) == 179
rubencart
6

stop-wordsNur für diesen Zweck gibt es ein sehr einfaches, leichtes Python-Paket .

Installieren Sie das Paket zunächst mit: pip install stop-words

Dann können Sie Ihre Wörter in einer Zeile mithilfe des Listenverständnisses entfernen:

from stop_words import get_stop_words

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

Dieses Paket ist sehr leicht herunterzuladen (im Gegensatz zu nltk), funktioniert für beide Python 2und enthält Stoppwörter Python 3für viele andere Sprachen wie:

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

Verwenden Sie die Textcleaner- Bibliothek, um Stoppwörter aus Ihren Daten zu entfernen.

Folgen Sie diesem Link: https://yugantm.github.io/textcleaner/documentation.html#remove_stpwrds

Befolgen Sie diese Schritte, um dies mit dieser Bibliothek zu tun.

pip install textcleaner

Nach der 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

Verwenden Sie den obigen Code, um die Stoppwörter zu entfernen.

Yugant Hadiyal
quelle
1

Wenn Sie diese Funktion verwenden können, sollten Sie beachten, dass Sie alle Wörter senken müssen

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

mit Filter :

from nltk.corpus import stopwords
# ...  
filtered_words = list(filter(lambda word: word not in stopwords.words('english'), word_list))
Saeid BK
quelle
2
Wenn word_listgroß, ist dieser Code sehr langsam. Es ist besser, die Stoppwortliste in einen Satz zu konvertieren, bevor Sie sie verwenden : .. in set(stopwords.words('english')).
Robert
0

Hier ist meine Meinung dazu, falls Sie die Antwort sofort in eine Zeichenfolge (anstelle einer Liste gefilterter Wörter) einfügen möchten:

STOPWORDS = set(stopwords.words('english'))
text =  ' '.join([word for word in text.split() if word not in STOPWORDS]) # delete stopwords from text
justadev
quelle
Verwenden Sie diesen Ansatz nicht auf Französisch l 'sonst wird nicht erfasst.
David Beauchemin
0

Falls Ihre Daten als gespeichert sind Pandas DataFrame, können Sie remove_stopwordsvon textero , dass die NLTK Stoppwörter Liste verwenden Standard .

import pandas as pd
import texthero as hero
df['text_without_stopwords'] = hero.remove_stopwords(df['text'])
Jonathan Besomi
quelle
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
quelle
-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
quelle
Es ist am besten, die stopwords.words ("Englisch") hinzuzufügen, als alle Wörter anzugeben, die Sie entfernen müssen.
Led