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

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

stopwords.words('english')

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


person Alex    schedule 30.03.2011    source источник
comment
Откуда вы взяли стоп-слова? Это из НЛТК?   -  person tumultous_rooster    schedule 08.04.2014
comment
@MattO'Brien from nltk.corpus import stopwords для будущих пользователей Google   -  person danodonovan    schedule 14.05.2015
comment
Также необходимо запустить nltk.download("stopwords"), чтобы сделать доступным словарь стоп-слов.   -  person sffc    schedule 10.07.2015
comment
См. также stackoverflow.com/questions/19130512/stopword-removal-with- нлтк   -  person alvas    schedule 25.08.2016
comment
Обратите внимание, что слово типа not также считается стоп-словом в nltk. Если вы делаете что-то вроде анализа настроений, фильтрации спама, отрицание может изменить весь смысл предложения, и если вы удалите его из этапа обработки, вы можете не получить точных результатов.   -  person Darkov    schedule 04.06.2019


Ответы (13)


Вы также можете установить diff, например:

list(set(nltk.regexp_tokenize(sentence, pattern, gaps=True)) - set(nltk.corpus.stopwords.words('english')))
person David Lemphers    schedule 26.03.2012
comment
Примечание: это преобразует предложение в SET, который удаляет все повторяющиеся слова, и поэтому вы не сможете использовать подсчет частоты в результате. - person David Dehghan; 22.02.2017
comment
преобразование в набор может удалить важную информацию из предложения, очистив несколько вхождений важного слова. - person Ujjwal; 28.11.2019

Чтобы исключить все типы стоп-слов, включая стоп-слова 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]
person sumitjainjr    schedule 27.10.2017
comment
Я получаю len(get_stop_words('en')) == 174 против len(stopwords.words('english')) == 179 - person rubencart; 06.03.2020
comment
Итерация по списку неэффективна. - person Роман Коптев; 29.06.2021

Я полагаю, у вас есть список слов (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
person das_weezul    schedule 30.03.2011
comment
это будет намного медленнее, чем понимание списка Дарена Томаса... - person drevicko; 26.08.2016

Для этого есть очень простой и легкий пакет Python 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
person user_3pij    schedule 22.09.2019

Используйте библиотеку 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

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

person Yugant Hadiyal    schedule 12.02.2019

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

STOPWORDS = set(stopwords.words('english'))
text =  ' '.join([word for word in text.split() if word not in STOPWORDS]) # delete stopwords from text
person justadev    schedule 08.02.2020
comment
Не используйте этот подход во французском языке, иначе не будет захвата. - person David Beauchemin; 22.02.2020

вы можете использовать эту функцию, вы должны заметить, что вам нужно опустить все слова

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
person Mohammed_Ashour    schedule 13.06.2017

с помощью фильтра:

from nltk.corpus import stopwords
# ...  
filtered_words = list(filter(lambda word: word not in stopwords.words('english'), word_list))
person Saeid BK    schedule 02.10.2017
comment
если word_list большое, этот код очень медленный. Перед использованием список стоп-слов лучше преобразовать в набор: .. in set(stopwords.words('english')). - person Robert; 23.09.2019

Хотя вопрос немного устарел, вот новая библиотека, о которой стоит упомянуть, которая может выполнять дополнительные задачи.

В некоторых случаях вы не хотите удалять только стоп-слова. Скорее, вы хотели бы найти стоп-слова в текстовых данных и сохранить их в списке, чтобы вы могли найти шум в данных и сделать их более интерактивными.

Библиотека называется 'textfeatures'. Вы можете использовать его следующим образом:

! pip install textfeatures
import textfeatures as tf
import pandas as pd

Например, предположим, что у вас есть следующий набор строк:

texts = [
    "blue car and blue window",
    "black crow in the window",
    "i see my reflection in the window"]

df = pd.DataFrame(texts) # Convert to a dataframe
df.columns = ['text'] # give a name to the column
df

Теперь вызовите функцию stopwords() и передайте нужные параметры:

tf.stopwords(df,"text","stopwords") # extract stop words
df[["text","stopwords"]].head() # give names to columns

Результат будет:

    text                                 stopwords
0   blue car and blue window             [and]
1   black crow in the window             [in, the]
2   i see my reflection in the window    [i, my, in, the]

Как видите, в последнем столбце есть стоп-слова, включенные в этот документ (запись).

person Taie    schedule 24.02.2021

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

import pandas as pd
import texthero as hero
df['text_without_stopwords'] = hero.remove_stopwords(df['text'])
person Jonathan Besomi    schedule 02.06.2020

Я покажу вам пример. Сначала я извлекаю текстовые данные из фрейма данных (twitter_df) для дальнейшей обработки следующим образом.

     from nltk.tokenize import word_tokenize
     tweetText = twitter_df['text']

Затем для токенизации я использую следующий метод

     from nltk.tokenize import word_tokenize
     tweetText = tweetText.apply(word_tokenize)

Затем, чтобы удалить стоп-слова,

     from nltk.corpus import stopwords
     nltk.download('stopwords')

     stop_words = set(stopwords.words('english'))
     tweetText = tweetText.apply(lambda x:[word for word in x if word not in stop_words])
     tweetText.head()

Я думаю, это поможет вам

person Yasuni Chamodya    schedule 13.10.2020

person    schedule
comment
Благодаря обоим ответам они оба работают, хотя, похоже, у меня есть недостаток в моем коде, препятствующий правильной работе стоп-листа. Должен ли это быть новый пост с вопросами? пока не уверен, как здесь обстоят дела! - person Alex; 30.03.2011
comment
Чтобы повысить производительность, рассмотрите вместо этого stops = set(stopwords.words("english")). - person isakkarlsson; 08.09.2013
comment
››› import nltk ››› nltk.download() Источник - person ; 14.12.2017
comment
stopwords.words('english') в нижнем регистре. Поэтому обязательно используйте в списке слова только в нижнем регистре, например. [w.lower() for w in word_list] - person AlexG; 24.08.2018

person    schedule
comment
лучше добавить stopwords.words(english), чем указывать все слова, которые нужно удалить. - person Led; 05.11.2019