nltkまたはpythonを使用してストップワードを削除する方法


110

それで、ストップワードを使用したくないデータセットがあります

stopwords.words('english')

私はコード内でこれを使用して、単にこれらの単語を単に取り出すために苦労しています。このデータセットの単語のリストはすでにあります。私が苦労しているのは、このリストと比較してストップワードを削除することです。どんな助けでもありがたいです。


4
ストップワードはどこから手に入れたのですか?これはNLTKからですか?
tumultous_rooster 14

37
@ MattO'Brien from nltk.corpus import stopwords将来のグーグル
danodonovan

13
またnltk.download("stopwords")、ストップワード辞書を使用可能にするために実行する必要があります。
sffc 2015


1
「not」のような単語もnltkのストップワードと見なされることに注意してください。感情分析やスパムフィルタリングなどを行うと、否定によって文の意味全体が変わる可能性があります。処理フェーズから削除すると、正確な結果が得られない可能性があります。
Darkov

回答:


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

両方の回答のおかげで、どちらも機能しますが、コードに欠陥があり、ストップリストが正しく機能しないようです。これは新しい質問投稿である必要がありますか?ここでの動作がまだわからない!
Alex

51
パフォーマンスを改善するには、stops = set(stopwords.words("english"))代わりに検討してください。
isakkarlsson

1
>>> import nltk >>> nltk.download()ソース

2
stopwords.words('english')小文字です。そのため、リストでは小文字の単語のみを使用してください。例[w.lower() for w in word_list]
AlexG

19

たとえば、次のようにset diffを実行することもできます。

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

15
注:これにより文がSETに変換され、重複する単語がすべて削除されるため、結果に対して頻度カウントを使用できなくなります
David Dehghan

セットに変換すると、重要な単語の複数の出現をこすって、文章から実行可能な情報が削除される場合があります。
Ujjwal

14

ストップワードを削除する単語のリスト(word_list)があると思います。あなたはこのようなことをすることができます:

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
これは、Daren Thomasのリストの理解よりもかなり遅くなります...
drevicko

12

nltkストップワードを含むすべてのタイプのストップワードを除外するには、次のようにします。

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]

私はlen(get_stop_words('en')) == 174vsを取得していますlen(stopwords.words('english')) == 179
rubencart

6

stop-wordsこの目的のために、非常にシンプルで軽量なpythonパッケージがあります。

以下を使用してパッケージを最初からインストールします。 pip install stop-words

次に、リスト内包表記を使用して1行で単語を削除できます。

from stop_words import get_stop_words

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

このパッケージは(nltkとは異なり)ダウンロードが非常に軽量Python 2Python 3、およびの両方で機能します。また、次のような他の多くの言語のストップワードがあります。

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

3

textcleanerライブラリを使用して、データからストップワードを削除します。

このリンクに従ってください:https : //yugantm.github.io/textcleaner/documentation.html#remove_stpwrds

このライブラリを使用するには、次の手順に従います。

pip install textcleaner

インストール後:

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

上記のコードを使用してストップワードを削除します。


1

この関数を使用できます。すべての単語を下げる必要があることに注意してください。

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

フィルターの使用:

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

3
word_listが大きい場合、このコードは非常に遅くなります。ストップワードリストを使用する前に、セットに変換することをお勧めします.. in set(stopwords.words('english'))
ロバート

0

これが私の答えです(フィルターされた単語のリストではなく)すぐに文字列に答えを取得したい場合に備えて:

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

このアプローチをフランス語で使用しないでください。そうしないと、キャプチャされません。
David Beauchemin

0

データがとして保存されている場合、デフォルトで NLTKストップワードリストを使用するtexteroからPandas DataFrame使用できますremove_stopwords

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

削除する必要があるすべての単語を指定するよりも、stopwords.words( "english")を追加するのが最善です。
ツェッペリン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.