Як видалити стоп-слова за допомогою nltk або python


110

Тож у мене є набір даних, який я хотів би видалити стоп-слова з використання

stopwords.words('english')

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


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')]

Завдяки обом відповідям, вони обидва працюють, хоча, здавалося б, у мене є недолік у моєму коді, що перешкоджає правильному роботі списку зупинок. Це має бути новий запитання? не впевнений, як тут все працює тут!
Алекс

51
Для підвищення продуктивності продумайте stops = set(stopwords.words("english"))замість цього.
isakkarlsson

1
>>> імпортувати 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')))

15
Примітка: це перетворює речення в SET, яке видаляє всі повторювані слова, і тому ви не зможете використовувати частотний підрахунок результату
Девід Дехган,

перетворення на набір може видалити життєздатну інформацію з речення, скребливши кілька випадків важливого слова.
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
це буде набагато повільніше, ніж розуміння списку Дарена Томаса ...
drevicko

12

Щоб виключити всі типи стоп-слів, включаючи слова nltk stop, ви можете зробити щось подібне:

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')) == 174протиlen(stopwords.words('english')) == 179
rubencart

6

Саме для цього є дуже простий пакет пітонів stop-words.

Кулак встановіть пакет, використовуючи: 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

3

Використовуйте бібліотеку текстового очищення, щоб видалити стоп-слова зі своїх даних.

Перейдіть за цим посиланням: 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')).
Роберт

1

Ось мій погляд на це, якщо ви хочете негайно отримати відповідь у рядку (замість списку відфільтрованих слів):

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

Не використовуйте цей підхід у французькій мові, інакше не буде захоплення.
Девід Бошемін

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) 

-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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.