Я хотел бы удалить стоп-слова, которые есть в списке списка, при этом сохраняя формат (то есть список списка)

Ниже приведен код, который я уже пробовал

sent1 = 'I have a sentence which is a list'
sent2 = 'I have a sentence which is another list'

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

lst = [sent1, sent2]
sent_lower = [t.lower() for t in lst]

filtered_words=[]
for i in sent_lower:
    i_split = i.split()
    lst = []
    for j in i_split:
        if j not in stop_words:
            lst.append(j)
            " ".join(lst)
            filtered_words.append(lst)

Текущий вывод отфильтрованных слов:

filtered_words
[['sentence', 'list'],
 ['sentence', 'list'],
 ['sentence', 'another', 'list'],
 ['sentence', 'another', 'list'],
 ['sentence', 'another', 'list']]

Желаемый вывод фильтрованных слов:

filtered_words
[['sentence', 'list'],
 ['sentence', 'another', 'list']]

Я получаю дубликат списка. Что я могу делать не так в цикле? Также есть ли лучший способ сделать это, чем писать так много для циклов?

0
Molia 2 Июл 2019 в 17:24

3 ответа

Лучший ответ

То, что вы делаете неправильно, это добавление lst к filtered_words каждый раз, когда вы находите нестационарное слово. Вот почему у вас есть 2 повторения отфильтрованного sent1 (оно содержит 2 не-стоп-слова) и 3 повторения отфильтрованного sent2 (оно содержит 3 не-стоп-слова). Просто добавьте после того, как вы изучили каждое предложение:

for i in sent_lower:
    i_split = i.split()
    lst = []
    for j in i_split:
        if j not in stop_words:
            lst.append(j)
    filtered_words.append(lst)

Кстати, заявление

" ".join(lst)

Бесполезно, так как вы что-то вычисляете (строку), но нигде не храните.

< Сильный > ИЗМЕНИТЬ

Более Pythonic способ сделать это с пониманием списка:

for s in sent_lower:
    lst = [j for j in s.split() if j not in stop_words]
    filtered_words.append(lst)
3
Diego Chinellato 2 Июл 2019 в 15:13

Это даст вам желаемый результат

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

sent1 = 'I have a sentence which is a list'
sent2 = 'I have a sentence which is another list'

sent1 = sent1.lower().split()
sent2 = sent2.lower().split()

l = [sent1, sent2]

for n, sent in enumerate(l):
    for stop_word in stop_words:
        sent = [word for word in sent if word != stop_word]
    l[n] = sent

print(l)
0
grizzasd 2 Июл 2019 в 15:14

Вы можете использовать itertools после получения дублированного результата в filtered_words -

import itertools
filtered_words.sort()
list(filtered_words for filtered_words,_ in itertools.groupby(filtered_words))

Выход выходит -

[['предложение', 'другое', 'список'], ["предложение", "список"]]

Я перешел по ссылке в StackOverflow - Удалить дубликаты из списка списка

1
samhanndean 2 Июл 2019 в 14:58