Удаление стоп-слов в списке из списка - PullRequest
0 голосов
/ 02 июля 2019

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 02 июля 2019

То, что вы делаете неправильно, это добавление 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)

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

EDIT

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

for s in sent_lower:
    lst = [j for j in s.split() if j not in stop_words]
    filtered_words.append(lst)
1 голос
/ 02 июля 2019

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

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

Выход получается -

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

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

0 голосов
/ 02 июля 2019

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

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...