Ответ @ alvas выполняет эту работу, но ее можно сделать быстрее. Предположим, что у вас есть documents
: список строк.
from nltk.corpus import stopwords
from nltk.tokenize import wordpunct_tokenize
stop_words = set(stopwords.words('english'))
stop_words.update(['.', ',', '"', "'", '?', '!', ':', ';', '(', ')', '[', ']', '{', '}']) # remove it if you need punctuation
for doc in documents:
list_of_words = [i.lower() for i in wordpunct_tokenize(doc) if i.lower() not in stop_words]
Обратите внимание, что из-за того, что здесь вы ищете в наборе (не в списке), скорость будет теоретически len(stop_words)/2
раз быстрее, что важно, если вам нужно работать с несколькими документами.
Для 5000 документов размером около 300 слов разница составляет 1,8 секунды для моего примера и 20 секунд для @ alvas.
PS в большинстве случаев вам нужно разделить текст на слова, чтобы выполнить некоторые другие задачи классификации, для которых используется tf-idf. Поэтому, скорее всего, было бы лучше использовать штокмер:
from nltk.stem.porter import PorterStemmer
porter = PorterStemmer()
и использовать [porter.stem(i.lower()) for i in wordpunct_tokenize(doc) if i.lower() not in stop_words]
внутри цикла.