Как удалить стоп-слова с помощью nltk или python

110

Итак, у меня есть набор данных, из которого я хотел бы удалить стоп-слова.

stopwords.words('english')

Я изо всех сил пытаюсь использовать это в своем коде, чтобы просто убрать эти слова. У меня уже есть список слов из этого набора данных, часть, с которой я борюсь, сравнивает с этим списком и удаляет стоп-слова. Любая помощь приветствуется.

Alex
источник
4
Откуда у вас стоп-слова? Это от НЛТК?
tumultous_rooster
37
@ MattO'Brien from nltk.corpus import stopwordsдля будущих гуглеров
данодонован
13
Также необходимо запустить nltk.download("stopwords"), чтобы словарь стоп-слов стал доступным.
sffc
1
Обратите внимание, что слово типа «не» также считается стоп-словом в nltk. Если вы выполните что-то вроде анализа настроений, фильтрации спама, отрицание может изменить весь смысл предложения, и если вы удалите его из фазы обработки, вы можете не получить точных результатов.
Дарков

Ответы:

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 07
1
>>> import nltk >>> nltk.download () Источник
2
stopwords.words('english')строчные. Поэтому убедитесь, что вы используете в списке только строчные буквы, например[w.lower() for w in word_list]
AlexG
19

Вы также можете сделать набор различий, например:

list(set(nltk.regexp_tokenize(sentence, pattern, gaps=True)) - set(nltk.corpus.stopwords.words('english')))
Дэвид Лемферс
источник
16
Примечание: это преобразует предложение в SET, который удаляет все повторяющиеся слова, и поэтому вы не сможете использовать частотный подсчет для результата
Дэвид Дехан
1
преобразование в набор может удалить жизнеспособную информацию из предложения, вычищая несколько вхождений важного слова.
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
das_weezul
источник
5
это будет намного медленнее, чем понимание списка
Дарена
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]
Sumitjainjr
источник
Я получаю len(get_stop_words('en')) == 174противlen(stopwords.words('english')) == 179
rubencart
6

stop-wordsТолько для этого есть очень простой легкий пакет python .

Сначала установите пакет, используя: pip install stop-words

Затем вы можете удалить свои слова в одну строку, используя понимание списка:

from stop_words import get_stop_words

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

Этот пакет очень легкий для загрузки (в отличие от nltk), работает для обоих Python 2и Python 3, и в нем есть стоп-слова для многих других языков, например:

    Arabic
    Bulgarian
    Catalan
    Czech
    Danish
    Dutch
    English
    Finnish
    French
    German
    Hungarian
    Indonesian
    Italian
    Norwegian
    Polish
    Portuguese
    Romanian
    Russian
    Spanish
    Swedish
    Turkish
    Ukrainian
user_3pij
источник
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

Используйте приведенный выше код, чтобы удалить стоп-слова.

Югант Хадиял
источник
2

используя фильтр :

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')).
Роберт
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

Вот мой вариант на тот случай, если вы хотите немедленно получить ответ в виде строки (вместо списка отфильтрованных слов):

STOPWORDS = set(stopwords.words('english'))
text =  ' '.join([word for word in text.split() if word not in STOPWORDS]) # delete stopwords from text
Justadev
источник
Не используйте этот подход во французском l ', иначе не будет захвачено.
Дэвид Бошемин,
0

Если ваши данные хранятся в виде файла Pandas DataFrame, вы можете использовать remove_stopwordsиз textero, который по умолчанию использует список запрещенных слов NLTK .

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) 
HM
источник
-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 ("английский"), чем указывать все слова, которые нужно удалить.
Led