удаление стоп-слов в списке python - PullRequest
2 голосов
/ 07 апреля 2020

У меня есть следующий список предложений

pylist=['This is an apple', 'This is an orange', 'The pineapple is yellow','A grape is red']

Если я определю список стоп-слов, например

stopwords=['This', 'is', 'an', 'The']

Можно ли применить это ко всему списку так что мой вывод

pylist=['apple','orange','pineapple is yellow','A grape is red']

PS: я пытался использовать apply с функцией, определенной для удаления стоп-слов, как [removewords(x) for x in pylist], но не смог (плюс не уверен, что это самый эффективный способ ). Спасибо!

Ответы [ 2 ]

2 голосов
/ 07 апреля 2020

Я думаю, что ваш вывод не то, что вы действительно хотите. Стоп-слово 'is' все еще включено.

Моя попытка будет следующей:

pylist = ['This is an apple', 'This is an orange', 'The pineapple is yellow', 'A grape is red']
stopwords = ['This', 'is', 'an', 'The']

stopwords = set(w.lower() for w in stopwords)


def remove_words(s, stopwords):
    s_split = s.split()
    s_filtered = [w for w in s_split if not w.lower() in stopwords]
    return " ".join(s_filtered)


result = [remove_words(x, stopwords) for x in pylist]

с result, равным

['apple', 'orange', 'pineapple yellow', 'A grape red']

Чтобы получить разумный эффективный поиск (поиск в наборе занимает, конечно, постоянное время), я сохранил строчную форму стоп-слов в наборе. Обычно при удалении стоп-слов регистр не учитывается.

Примечание: Очень часто бывает полезно или даже необходимо удалить стоп-слова. Но учтите, что в некоторых случаях удаление стоп-слов нежелательно: https://towardsdatascience.com/why-you-should-avoid-removing-stopwords-aa7a353d2a52

Обновление: Когда вы действительно уверены, что вы нужно избавиться от всех возможных стоп-слов, убедиться, что вы не пропустили ни одного - примите совет yatu: взгляните на nltk . Особенно, если в следующем году у вас может возникнуть проблема с добавлением Spani sh palabra de paradas, French mot d'arrêt и German Stopp-Wörter.

1 голос
/ 07 апреля 2020

Вы можете использовать понимание вложенного списка и определить stopwords как set, чтобы уменьшить сложность поиска до O(1):

pylist=['This is an apple', 'This is an orange', 'The pineapple is yellow',
        'A grape is red']
stopwords = set(['This', 'is', 'an', 'The'])

[' '.join([w for w in s.split() if w not in stopwords]) for s in pylist]
# ['apple', 'orange', 'pineapple yellow', 'A grape red']

Обратите внимание, что для более общего подхода вы можно использовать stopwords из nltk в английском sh корпусе:

from nltk.corpus import stopwords
stop_w = set(stopwords.words('english'))

[' '.join([w for w in s.split() if w.lower() not in stop_w]) for s in pylist]
# ['apple', 'orange', 'pineapple yellow', 'grape red']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...