"Машинное обучение"

Классификация текста с помощью XGBoost и других: пример использования новостных статей BBC

Сравнительное исследование различных моделей векторного пространства и методов классификации текста, таких как XGBoost и другие.

В этой статье мы обсудим различные методы классификации текста для решения проблемы категоризации новых статей BBC. Мы также обсудим различные модели векторного пространства для представления текстовых данных.

Мы будем использовать Python, Sci-kit-learn, Gensim и библиотеку Xgboost для решения этой проблемы.

Получение данных

Данные по этой задаче можно найти в Kaggle. Этот набор данных содержит текст новостей BBC и их категорию в формате CSV с двумя столбцами. Посмотрим, что там

Похоже, там длинные тексты. Мы увидим это в следующих разделах. Проблема здесь в том, что если дан «текст», мы должны предсказать его «категорию». Определенно, это проблема классификации текста на несколько классов.

Исследование и визуализация данных

Сначала посмотрим, сколько категорий есть

Итак, есть 5 разных категорий. Мы можем называть их «классами». Из сюжета видно, что в распределении классов не так уж и много перекоса.

В качестве следующего шага мы должны увидеть, какой тип содержимого содержится в «текстовом» поле набора данных. Для этого мы должны сначала очистить тексты.

Типичный процесс очистки текста включает следующие шаги

  1. Преобразование в нижний регистр
  2. Удаление знаков препинания
  3. Удаление целых чисел, чисел
  4. Удаление лишних пробелов
  5. Удаление тегов (например, ‹html›, ‹p› и т. Д.)
  6. Удаление стоп-слов (например, "и", "к", "то" и т. Д.)
  7. Stemming (преобразование слов в корневую форму)

Мы будем использовать библиотеку Python «gensim» для очистки всего текста.

Мы можем использовать эту функцию «clean_text» для выполнения работы.

Напечатаем первое содержимое текстового поля записи

bbc_text_df.iloc[2,1]

После очистки

clean_text(bbc_text_df.iloc[2,1])

Текст стал немного неграмматическим, но он необходим для понимания.

Мы напишем функцию для визуализации «текстового» содержимого в виде «облака слов».

Мы должны объединить все тексты и передать их этой функции

texts = ''
for index, item in bbc_text_df.iterrows():
    texts = texts + ' ' + clean_text(item['text'])
    
plot_word_cloud(texts)

Мы получим сейчас

Слова большего размера означают «чаще». Итак, "год", "время", "люди" и т. Д. - самые частые слова.

Теперь мы увидим более значимую информацию: «Облако слов» или «текст» для определенной «категории».

Мы напишем для этого универсальную функцию

Мы увидим «Облако слов» для «категории» «технология».

plot_word_cloud_for_category(bbc_text_df,'tech')

Итак, для категории «технология» наиболее частыми словами являются «люди», «технический журнал», «игра» и т. Д.

Аналогично для "спорта"

plot_word_cloud_for_category(bbc_text_df,'sport')

Наиболее частые слова - «игра», «игра», «игрок», «победа», «матч», «Англия» и т. Д.

Для категории "политика"

plot_word_cloud_for_category(bbc_text_df,'politics')

«Управлять», «народ», «блэр», «страна», «министр» - самые частые слова.

Определенно, в каждой категории есть слова, которые отличают их от других категорий. Или это может быть так: каждый «текст» подразумевает некоторый контекст, определяющий его категорию.

Нам нужно провести анализ векторного пространства и использовать его в модели, чтобы получить подтверждение вышеуказанного факта.

Моделирование векторного пространства и построение трубопровода

Моделирование векторного пространства необходимо для решения любой проблемы НЛП. Мы попробуем использовать две самые популярные модели векторного пространства: «Doc2Vec» и «Tf-Idf». Сначала мы разделим данные на функции и категории.

df_x = bbc_text_df['text']
df_y = bbc_text_df['category']

Doc2Vec

Мы будем использовать Doc2Vec API библиотеки «gensim» и напишем общий «Doc2VecTransfoemer»

Мы увидим, как выглядит «Doc2Vec», применив этот преобразователь.

doc2vec_trf = Doc2VecTransformer()
doc2vec_features = doc2vec_trf.fit(df_x).transform(df_x)
doc2vec_features

Итак, это числовое представление текстовых данных. Мы можем использовать эти числовые функции в любом алгоритме машинного обучения. Мы попробуем с LogisticRegression, RandomForest и XGBoost

Для каждого из случаев мы проведем 5-кратную перекрестную проверку модели с набором данных и протестируем ее. Оценка точности будет в среднем 5 раз.

Конвейер Doc2Vec и LogisticRegression

Точность оказалась довольно низкой !!

Мы увидим другие классификаторы

Конвейер Doc2Vec и RandomForest

Опять не здорово !!

Конвейер Doc2Vec и XGBoost

Не такое уж большое улучшение.

"Doc2Vec" не подходит.

Мы увидим модель векторного пространства Tf-Idf.

Tf-Idf

Напишем аналогичный преобразователь и для «Tf-Idf».

Теперь посмотрим, как он трансформирует тексты.

tfidf_transformer = Text2TfIdfTransformer()
tfidf_vectors = tfidf_transformer.fit(df_x).transform(df_x)

Печать его размеров

tfidf_vectors.shape

Всего 18754 токенов

print(tfidf_vectors)

Теперь мы будем использовать эту модель в реальных моделях машинного обучения.

Tf-Idf и логистическая регрессия

Tf-Idf дает хорошую точность !!

Tf-Idf и RandomForest

Tf-Idf и XGBoost

Итак, лучшее наконец-то !!

Конечно, для решения этой проблемы мы выберем комбинацию Tf-Idf и XGBoost

Объяснение результатов

Хотя «Doc2Vec» является более продвинутой моделью в НЛП, чем «Tf-Idf», но все же в нашем случае она не дает должных результатов. Мы пробовали использовать линейный классификатор, основанный на бэггинге и бустинге соответственно.

Эту причину можно объяснить. В нашем наборе данных каждое «текстовое» поле содержит несколько слов / токенов, которые определяют его категорию, и их частота довольно высока. Таким образом, создание контекстно-зависимой модели может чрезмерно усложнить ситуацию или разбавить эту информацию. Поскольку частота некоторых токенов в некоторых текстовых категориях высока, они вносят достаточно большие значения в определение «Tf-Idf». Кроме того, «тексты» зависят от предметной области.

Например, весьма вероятно, что слово «блэр» будет присутствовать в категории «политика», а не «спорт». Так что наличие этого способствует «Tf-Idf».

Кроме того, модель «Doc2Vec» больше подходит для очень хорошо написанных грамматически правильных текстов. В нашем случае тексты имеют довольно грубый характер.

Одним из примеров грамматически правильного текста могут быть тексты из Википедии.

На различных примерах и экспериментах Data Scientist также доказано, что хотя модель «Tf-Idf» уступает модели «Doc2Vec», но все же дает лучший результат при классификации текстов, очень специфичных для предметной области.

Заключение

Это подходит к концу. Мы протестировали со всеми комбинациями классификаторов и моделей векторного пространства. Блокнот Jupyter для этого можно найти на GitHub.



Недавно я написал книгу по ML (https://twitter.com/bpbonline/status/1256146448346988546)