Відповідь @ alvas робить свою справу, але це можна зробити набагато швидше. Якщо припустити, що у вас є documents
: список рядків.
from nltk.corpus import stopwords
from nltk.tokenize import wordpunct_tokenize
stop_words = set(stopwords.words('english'))
stop_words.update(['.', ',', '"', "'", '?', '!', ':', ';', '(', ')', '[', ']', '{', '}'])
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]
всередині циклу.