Шаг 187.
Введение в машинное обучение с использованием Python.
Работа с текстовыми данными. Стоп-слова

    На этом шаге мы рассмотрим работу с такими словами.

    Еще один способ, с помощью которого мы можем избавиться от неинформативных слов - исключение слов, которые встречаются слишком часто, чтобы быть информативными. Существуют два основных подхода: использование списка стоп-слов (на основе соответствующего языка), или удаление слов, которые встречаются слишком часто. Библиотека scikit-learn предлагает встроенный список английских стоп-слов, реализованный в модуле feature_extraction.text:

[In 20]:
from sklearn.feature_extraction.text import ENGLISH_STOP_WORDS
print("Количество стоп-слов: {}".format(len(ENGLISH_STOP_WORDS)))
print("Каждое 10-е стоп-слово:\n{}".format(list(ENGLISH_STOP_WORDS)[::10]))

Количество стоп-слов: 318
Каждое 10-е стоп-слово:
['an', 'toward', 'sixty', 'nevertheless', 'ie', 'co', 'beside', 'between', 'which', 'etc', 
'hereupon', 'might', 'became', 'neither', 'former', 'until', 'has', 'none', 'thereby', 
'ourselves', 'twelve', 'someone', 'per', 'not', 'them', 'becoming', 'me', 'found', 'via', 
'elsewhere', 'seem', 'any']

    Очевидно, что удаление стоп-слов с помощью списка может уменьшить количество признаков лишь ровно на то количество, которое есть в списке (318), но, возможно, это позволит улучшить качество модели. Давайте попробуем:

[In 21]:
# настройка stop_words="english" задает встроенный список стоп-слов.
# мы можем также расширить его и передать свой собственный.
vect = CountVectorizer(min_df=5, stop_words="english").fit(text_train)
X_train = vect.transform(text_train)
print("X_train с использованием стоп-слов:\n{}".format(repr(X_train)))

X_train с использованием стоп-слов:
<75000x44223 sparse matrix of type '<class 'numpy.int64'>'
	with 6577418 stored elements in Compressed Sparse Row format>

    Теперь у нас стало на 309 признаков меньше (количество признаков уменьшилось с 44532 до 44223). Это означает, что большинство стоп-слов (но не все) встретились в корпусе документов. Давайте снова запустим решетчатый поиск:

[In 22]:
grid = GridSearchCV(LogisticRegression(), param_grid, cv=5)
grid.fit(X_train, y_train)
print("Наилучшее значение перекр проверки: {:.2f}".format(grid.best_score_))

Наилучшее значение перекр проверки: 0.84

    При использовании стоп-слов качество модели чуть снизилось. Это не повод для беспокойства, однако учитывая тот факт, что исключение 309 признаков из более чем 44000 вряд ли сильно изменит качество или интерпретабельность модели, признаем, использование списка стоп-слов в данном случае бесполезно. Как правило, фиксированные списки могут быть полезны при работе с небольшими наборами данных. Небольшие наборы данных не имеют достаточного объема информации, позволяющего модели самостоятельно определить, какие слова являются стоп-словами. В качестве примера вы можете попробовать другой подход, исключив часто встречающиеся слова, задав опцию max_df для CountVectorizer и посмотреть, как это повлияет на количество признаков и качество модели.

    На следующем шаге мы рассмотрим масштабирование данных с помошью tf-idf.




Предыдущий шаг Содержание Следующий шаг