Удаление измененных стоп-слов - PullRequest
2 голосов
/ 26 мая 2019

Справочная информация:

1) У меня есть следующий код для удаления stopwords с помощью пакета nltk:

import nltk
from nltk.corpus import stopwords
from nltk.tokenize import sent_tokenize
from nltk.tokenize import word_tokenize

your_string = "The dog does not bark at the tree when it sees a squirrel"
tokens = word_tokenize(your_string)
lower_tokens = [t.lower() for t in tokens]
filtered_words = [word for word in lower_tokens if word not in stopwords.words('english')]

2) Этот код работает для удаления stopwords, например the, как показано здесь:

['dog', 'barks', 'tree', 'sees', 'squirrel']

3) Я изменил stopwords, чтобы сохранить слово not со следующим кодом:

to_remove = ['not']
new_stopwords = set(stopwords.words('english')).difference(to_remove)

Проблема:

4) Но когда я использую new_stopwords со следующим кодом:

your_string = "The dog does not bark at the tree when it sees a squirrel"
tokens = word_tokenize(your_string)
lower_tokens = [t.lower() for t in tokens]
filtered_words = [word for word in lower_tokens if word not in new_stopwords.words('english')]

5) Я получаю следующую ошибку, потому что new_stopwords является set:

AttributeError: 'set' object has no attribute 'words' 

Вопрос:

6) Как использовать недавно определенный new_stopwords для получения желаемого результата:

['dog', 'not','barks', 'tree', 'sees', 'squirrel']

1 Ответ

0 голосов
/ 26 мая 2019

Вы очень близки, но ваше чтение сообщения об ошибке неверно: проблема не в том, что "new_stopwords - это set", как вы говорите, а в том, что "set не делаетимеют атрибут words "

Что, это не так.new_stopwords - это набор, что означает, что вы можете использовать его непосредственно в понимании списка:

filtered_words = [word for word in lower_tokens if word not in new_stopwords]

Вы также можете избавить себя от необходимости создавать модифицированный список стоп-слов и просто использовать два условия:

keep_list = ['not']
filtered_words = [word for word in lower_tokens if (word not in stopwords.words("english")) or (word in keep_list)]
...