Классификация отзывов пользователей соцсетей с помощью машинного обучения

Перед нами стояла задача проанализировать мнение и отзывы пользователей соцсетей по отношению к нашей компании, классифицировать их и определить общую тональность. На помощь пришли методы AI.

Далее мы подробно опишем наш метод решения задачи, основанный на использовании Python, который позволит использовать ее даже начинающему DS-специалисту.

С помощью библиотеки requests и api-методов социальных сетей была произведена автоматизированная выгрузка комментариев с сайтов и форумов по направлению деятельности нашей организации. Далее была поставлена задача построения модели классификатора, выявляющей негативные комментарии в адрес нашей компании.

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

Вначале нам необходимо импортировать библиотеки:

from __future__ import division, print_function import numpy as np import matplotlib.pyplot as plt %matplotlib inline import seaborn as sns from sklearn.datasets import load_files from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer, TfidVecorizer from sklearn.linear_model import LogisticRegression from sklearn.svm import LinearSVC

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

reviews_train = load_files(“train”) text_train, y_train = reviews_train.data, reviews_train.target

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

Структура файлов для обучающей выборки:

В папке neg содержатся примеры отрицательных отзывов, в папке pos – положительных и нейтральных.

Пример содержимого папки с негативными отзывами (такая же структура файлов и в папке с положительными отзывами).

В каждом файле содержится текст одного позитивного или негативного отзыва, предварительно обработанного и приведенного к нормальной форме средствами NLP.

Теперь загрузим данные тестовой выборки, имеющие такую же структуру, как и в обучающей выборке:

reviews_test = load_files(“test”) text_test, y_test = reviews_test.data, reviews_test.target

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

cv = CountVectorizer() cv.fit(text_train)

Узнать количество уникальных слов, участвующих в формировании модели можно, запустив данную строку:

print(len(cv.vocabulary_))

После формирования словаря мы произвели преобразование текстов комментариев в векторную форму на основании индексов входящих слов:

X_train = cv.transform(text_train) X_test = cv.transform(text_test)

Далее обучим модель логистической регрессии, в качестве параметров для обучения используя полученные векторы предложений:

logit = LogisticRegression(n_jobs=-5, random_state=10) logit.fit(X_train, y_train)

Выводим долю правильных ответов для обучающих и тестовых выборок:

print(round(logit.score(X_train, y_train),3), round(logit.score(X_test, y_test),3))

В данном случае число 0.994 говорит о том, что на основании обучающей выборки модель может правильно классифицировать более 99% комментариев. Число 0.727 же показывает, как эта же самая модель на самом деле справляется с классификацией комментариев, не участвовавших в процессе обучения.

По этим двум числам разработчик может сделать вывод о точности модели и необходимости её улучшения, ведь в некоторых случаях необходимо разрабатывать модель, дающую точность близкую к стопроцентной, а в некоторых случаях точность классификации выше восьмидесяти процентов является недостижимой величиной.

В случае, если по мнению разработчика модель даёт недостаточно высокую точность классификации и требует дальнейшей доработки, есть два возможных пути решения данной проблемы: обогащение обучающей выборки данными или выявление и обработка (удаление из выборки, приведение к нормальной форме и т.д) слов, негативно влияющих на обучение модели (например, слов, которые часто встречаются как в негативной выборке, так и в позитивной).

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

def show_words(classifier, feature_names, n_top_features = 20) coef = classifier.coef_.ravel() pos_coeffs = np.argsort(coef)[-n_top_features:] neg_coeffs = np.argsort(coef)[: n_top_features] interest_coeffs = np.hstack([neg_coeffs, pos_coeffs]) plt.figure(figsize=(15,5)) colors = [“orange” if c <0 else “green” for c in coef[interest_coeffs]] plt.bar(np.arange(2*n_top_features), coef[interest_coeffs], color=colors) feature_names = np.array(feature_names) plt.xticks(np.arange(1, 1+2*n_top_features), feature_names[interest_coeffs], rotation=60, ha=”right”) show_words(logit, cv.get_feature_names())

В данном случае, на гистограмме будут отображены по 20 слов из негативной и позитивной обучающих выборок, которые наиболее сильно повлияли на процесс обучения нашей модели (на гистограмме столбцы с отрицательными значениями отвечают за слова из негативной выборки, положительными — позитивные).

Благодаря полученной гистограмме, разработчик сможет выбрать слова, которые стоит обработать (удалить, заменить, привести к нормальной форме). После всех этих манипуляций необходимо заново обучить нашу модель на исправленных данных.

В итоге, с помощью программного средства, реализующего модель логистической регрессии на сформированной обучающей выборке, удалось выяснить, что доля негативных комментариев в отношении компании составляет лишь 3,5% от общей выборки. Выявленные негативные комментарии могут быть использованы для анализа и совершенствования бизнес-процессов, а также минимизации различного рода рисков.

0
Комментарии
-3 комментариев
Раскрывать всегда