Нгуен Хунг Куанг Кхай

I) Введение

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

Анализ настроений уже нашел широкое применение в нашей реальной жизни, особенно в бизнесе. Одним из наиболее известных применений анализа настроений является предоставление полного 360-градусного представления о том, как имя, продукт или бизнес воспринимаются потребителями и заинтересованными сторонами. Отзывы о продуктах и ​​социальные сети, например, являются широко доступными средствами массовой информации, которые могут раскрывать ключевую информацию о том, правильно или неправильно поступает компания. Компании могут использовать анализ настроений для оценки эффективности нового продукта, рекламной кампании или других маркетинговых инициатив.

Еще одним приложением является оценка качества обслуживания в супермаркете или ресторане. Используя методы машинного обучения, владелец может понять качество своего обслуживания, узнать свои недостатки и лучше улучшить свое обслуживание. В этом проекте я буду применять анализ настроений, чтобы предсказывать настроения каждого отзыва клиента в ресторане.

II) Описание данных

Данные под названием «restaurant_review» зафиксировали 1000 комментариев клиентов. Данные имеют 2 столбца, которые называются «Обзор» и «Понравилось». В столбце «Отзыв» записываются комментарии клиентов, в столбце «Понравилось» отображается положительный или отрицательный отзыв. Если комментарий положительный, он будет помечен «1», а отрицательный — «0». Здесь показаны первые несколько строк в наборе данных.

Наша миссия в этом проекте — использовать машинное обучение для автоматического прогнозирования того, является ли данный комментарий положительным или отрицательным. Это приложение помогает значительно сократить время, затрачиваемое владельцем ресторана на чтение каждого комментария и определение его настроения.

III) Реализация

В этом проекте я покажу детали выполнения анализа настроений. Шаги описаны следующим образом:

Шаг 1. Очистка текста

Шаг 2. Разработка признаков и разделение данных для обучения/тестирования

Шаг 3. Предварительная обработка данных для подбора моделей машинного обучения

Шаг 4. Подгонка нескольких моделей машинного обучения и методов ансамбля

Оценка результатов и заключение будут даны в разделе IV)

Шаг 1. Очистка текста

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

а) Нижнее литье

Первым шагом в нормализации текстовых данных является уменьшение всех заглавных слов. Чтобы выполнить этот шаг в Python, мы используем метод str.lower() для создания нового столбца с именем «нижний текст» в наборе данных обзора.

б) Удаление знаков препинания

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

В питоне я определил функцию для удаления знаков препинания. Обратите внимание, что я использовал string.punctuation для загрузки всех знаков препинания на английском языке. После этого я использую метод apply, чтобы применить функцию remove_punctuation к столбцу «нижний текст» в наборе данных обзора.

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

c) Удаление стоп-слов

При работе с приложениями для анализа текста часто используются термины «стоп-слова». Стоп-слова — это группа широко используемых слов, которые можно использовать на любом языке, а не только на английском. Удаление стоп-слов позволяет нам сосредоточиться на важных словах, а не на словах, которые широко используются в языке.

Например, в поисковой системе при поиске по запросу «Как научиться анализировать данные в python». Движок просто сохраняет «Как изучить Python для анализа данных» в качестве ключевых слов и ищет результаты для вас.

В английском языке много стоп-слов, но, к счастью, в python уже есть для нас список стоп-слов из пакета nltk. Однако помните, что «не», «не будет», «не имеет»,.. тоже стоп-слова, удалять эти слова в нашем случае проекта неразумно.

Например, в предложении «Мне не нравится эта еда», если мы удалим «не» в этом предложении и оставим только ключевые слова, оно станет «как эта еда». Конечно, эти два предложения имеют разные значения и статусы. Поэтому в приведенном ниже коде я удалил некоторые слова, чтобы убедиться, что при удалении стоп-слов не удаляются перечисленные мною слова.

Затем я определяю функцию для удаления стоп-слов и применяю ее к данным.

г) лемматизация

Лемматизация — это процесс сведения изменчивых слов к их словесной основе из текстовых данных, но при этом сохраняется корневое слово, принадлежащее языку.
Например, "делать, делает, делать" сводится только к "делать". Этот процесс помогает нам уменьшить размер признаков при выполнении алгоритмов машинного обучения.
Для выполнения лемматизации я использовал WordNetLemmatizer() из пакета nltk.
Процедура демонстрируется в приведенном ниже коде:

Примените функцию lemmatize_words() выше к набору данных обзора, мы имеем:

После выполнения всех нормализованных шагов я сохранил его в новые переменные с именем clean_review.

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

Шаг 2. Разработка признаков и разделение данных для обучения/тестирования

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

В этом проекте я создал еще 3 новые функции: среднюю длину слова, длину предложения и количество восклицательных знаков.

Средняя длина слова — это средняя длина слов в предложении. Например, в предложении «Я люблю торт» средняя длина слова равна (1+4+4)/3 = 3.

Длина предложения – это количество слов в предложении. Например, предложение «Я люблю ходить на пляж» имеет длину 5.

Подсчет восклицательных знаков — это количество восклицательных знаков в предложении. В предложении «Я очень люблю кошку !!!» 3 восклицательных знака.

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

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

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

Выходные данные после добавления этих новых функций:

Наконец, позвольте передать данные для обучения/тестирования с помощью функции train_test_split() в python.

Шаг 3. Предварительная обработка данных для подбора моделей машинного обучения

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

Прежде чем сделать это, читатели должны знать концепцию N-грамм. N-граммы — это просто последовательность N слов или N токенов. Например, предложение «Сегодня прекрасная погода».

  • 1-грамм (униграмм) приведенного выше предложения равен {Погода, сегодня, замечательная}
  • 2-граммы (биграммы) приведенного выше предложения: {Погода, погода сегодня, сегодня прекрасная}
  • 3-граммы (триграммы) приведенного выше предложения {Сегодня погода, сегодня погода, сегодня чудесная}

В этом проекте я использовал n-граммы (1,2) (что означает как униграммы, так и биграммы), потому что я хочу учитывать группу слов, таких как «нехорошо», «не вкусно», мы ясно знаем, что слово «не» перед тем, как некоторые положительные слова будут иметь отрицательное значение.

Чтобы преобразовать исходные данные, я использовал CountVectorizer() из sklearn.feature_extraction.text. Для уменьшения размеров я просто оставляю 1000 признаков, так как считаю, что 1000 признаков достаточно для объяснения важных слов. Следовательно, гиперпараметры, которые я ввожу в CountVectorizer(), равны ngram_range=(1,2), max_features=1000. Код показан здесь, обратите внимание, что я применяю ngram(1,2) только к столбцу «lemmtext».

Из, мы видим, что столбцы являются словами или парами слов. Каждая строка записывает частоту каждого слова/пары слов в каждом предложении.

Наконец, я объединил функции, которые я создал на этапе разработки функций. Новая переменная под названием «X_train_final» создана для объединения функций, результат показан здесь:

Шаг 4. Подгонка нескольких моделей машинного обучения и методов объединения

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

Обратите внимание, что в алгоритмах Логистическая регрессия, Повышение градиента, Случайный лес я также выполняю шаг настройка гиперпараметров. При поиске оптимальных гиперпараметров в каждой модели я использовал для их поиска алгоритм RandomSearchCV.

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

а) Логистическая регрессия

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

Мы измеряем условную вероятность зависимой переменной Y при заданной независимой переменной X в бинарной регрессии. P(Y=1|X) или P(Y=0|X) два способа написать это. В логистической регрессии P (Y | X) аппроксимируется как сигмовидная функция, применяемая к линейной комбинации входных функций.

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

Я настроил два гиперпараметра в логистической регрессии, а именно:

l1_ratio: Параметр смешивания эластичной сетки

C: обратная сила регуляризации, меньшие значения указывают на более сильную регуляризацию.

Код Python для всего процесса:

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

Из приведенного выше вывода у нас есть оптимальная логистическая модель, найденная алгоритмом Random Search CV, — это модель, которая имеет l1_ratio около 0,15 и C около 5,5. 4-кратная точность перекрестной проверки оптимальной модели составляет 79%.

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

Точность нашей логистической модели довольно высока, до 80%.

b) Классификатор случайного леса

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

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

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

  • критерий: {"джини", "энтропия"}:Функция для измерения качества разделения. Поддерживаемые критерии: «джини» для примеси Джини и «энтропия» для получения информации.
  • max_features: количество функций, которые следует учитывать при поиске лучшего сплита.
  • max_depth: максимальная глубина дерева
  • n_estimators: количество деревьев в лесу.
  • min_weight_fraction_leaf: Минимальная взвешенная доля суммы весов (всех входных выборок), необходимая для конечного узла.
  • min_samples_split : минимальное количество сэмплов, необходимое для разделения внутреннего узла.

Код Python для поиска оптимальной модели случайного леса показан здесь:

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

Оптимальные гиперпараметры показаны выше, 4-кратная точность перекрестной проверки оптимальной модели случайного леса составляет 77,85%.

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

c) Классификатор повышения градиента

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

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

Точность Gradient Boosting составляет 78,33%, что выше, чем у алгоритма случайного леса.

d) Наивный байесовский метод

Наивный байесовский метод — это метод классификации, основанный на теореме Байеса с предположением о независимости предикторов. Проще говоря, наивный байесовский классификатор предполагает, что наличие определенной функции в классе не связано с наличием какой-либо другой функции.

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

Теорема Байеса обеспечивает способ вычисления апостериорной вероятности P(c|x) из P(c), P(x) и P(x|c). Посмотрите на уравнение ниже:

Выше,

  • P(c|x) — апостериорная вероятность класса (c, цель) с учетом предиктора (x, атрибуты).
  • P(c) — априорная вероятность класса.
  • P(x|c) — это вероятность, которая является вероятностью предиктора данного класса.
  • P(x) — априорная вероятность предиктора.

Чтобы подогнать наивный байесовский алгоритм в python, я использовал GaussianNB() из sklearn.naive_bayes. Процедура очень проста. Мы вызываем GaussianNB(), затем подгоняем его к обучающим данным, затем используем модель для прогнозирования на тестовом наборе и оцениваем ее точность.

Код этого процесса показан здесь:

Точность с использованием наивного байесовского алгоритма составляет 75,33%.

e) Бернуллиевский байесовский и полиномиальный байесовский

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

Как и в случае подбора наивного байесовского алгоритма, этапы выполнения такие же. Чтобы соответствовать байесовскому алгоритму Бернулли, я использовал BernoulliNB() из sklearn.naive_bayes, тогда как для соответствия объекту MultinomialNB(). Я показываю код установки 2 из них ниже:

Результат довольно ясен, точность бернуллиевского байесовского и полиномиального байесовского алгоритмов составляет 78,67% и 80% соответственно.

f) Методы ансамбля (классификатор голосования и метод суммирования)

Классификатор голосования и метод суммирования являются двумя широко известными ансамблевыми методами. Его основная идея — объединить сильные стороны нескольких моделей машинного обучения. Подробнее об этих 2-х алгоритмах читатели могут узнать здесь.

Чтобы соответствовать классификатору голосования, я использовал объект VotingClassifier() из sklearn.ensemble. Я перечислил все оценки, такие как логистическая регрессия, повышение градиента, случайный лес, наивный байесовский, бернуллиевский байесовский и мультиномиальный байесовский, которые я нашел на предыдущих шагах, полный код показан здесь:

Метод подбора стека такой же, как и подбор классификатора для голосования, здесь я представляю код

На выходе точность методов VotingClassifier и Stacking составляет 81% и 80,33% соответственно.

IV) Оценка результатов и выводы

Точность каждой модели представлена ​​в этой таблице.

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

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

Полный код этого проекта вы можете найти здесь.

Спасибо, что уделили время на прочтение моей статьи, надеюсь, моя статья окажется для вас полезной. Я также с нетерпением жду комментариев от вас.