Рост Интернета благодаря социальным сетям, таким как Facebook, Twitter, Linkedin, Instagram и т. д., привел к значительному взаимодействию пользователей и дал им возможность выражать себя наиболее эффективным способом. Но в последнее время из-за бомбардировки социальных сетей мы начинаем терять связь с нашими близкими друзьями через основные формы общения, такие как текстовые сообщения и мероприятия. Чтобы помочь в этом затруднительном положении, мы решили создать модель, которая выполняет анализ настроений между текстовыми сообщениями и с временным анализом предлагает действия, которые необходимо выполнить для улучшения отношений между двумя пользователями.

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

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

Выбор набора данных

Когда дело дошло до поиска жизнеспособного набора данных, мы тщательно искали сообщения, похожие на сообщения чата. Мы столкнулись с очень немногими из-за политики конфиденциальности, запрещающей обмен личными сообщениями. Мы сорвали джекпот, когда нашли 4 набора данных — базу данных электронной почты Enron, набор данных обзора IMDb, набор данных Twitter и, наконец, набор данных freecodecampchat на основе необходимости, мы исключили 3 набора данных — набор данных электронной почты Enron (разговоры были формальными и в электронной почте). формат — формальные разговоры редко встречаются в повседневном непринужденном общении); Набор данных IMDb (поскольку это были просто обзоры фильмов); Набор данных Twitter (Хотя этот набор данных состоял из обычного языка и сленговых слов, он не соответствовал критериям формата сообщения чата между двумя людьми)

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

Создание фрейма данных

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

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

Очистка, травление и токенизация

Каждый набор данных не может использоваться в необработанном виде и требует некоторой очистки, чтобы удалить все ненужные детали. Обучение классификаторов и алгоритмов машинного обучения может занять очень много времени, особенно если вы тренируетесь на большом наборе данных. Можете ли вы представить себе необходимость обучать классификатор каждый раз, когда вы хотите запустить его и использовать? Какой ужас!

Вместо этого мы можем использовать модуль Pickle, чтобы продолжить и сериализовать наш объект классификатора, так что все, что нам нужно сделать, это очень быстро загрузить этот файл. И это то, что мы сделали!

Pickle — это модуль в Python, используемый для сериализации и десериализации объектов Python. Он преобразует объекты Python, такие как списки, словари и т. д., в потоки байтов (нули и единицы). Вы можете преобразовать потоки байтов обратно в объекты Python с помощью процесса, называемого распаковкой.

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

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

Классификатор настроений

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

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

Мы использовали Vader для этого — мы подробнее обсудим это в следующем разделе.

ВЕЙДЕР

VADER (Valence Aware Dictionary for Sentiment Reasoning) — это модель, используемая для анализа тональности текста, которая чувствительна как к полярности (положительные/отрицательные), так и к интенсивности (силе) эмоций. Он доступен в пакете NLTK и может применяться непосредственно к немаркированным текстовым данным.

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

Мы импортировали необходимые пакеты из NLTK — Vader lexicon — в пакет NLTK входит анализатор, который называется SentimentIntensityAnalyzer.

SentimentIntensityAnalyzer() VADER принимает строку и возвращает словарь оценок в каждой из четырех категорий:

отрицательный

нейтральный

положительный

соединение (рассчитано путем нормализации приведенных выше показателей)

Давайте поговорим о математике, стоящей за этим — VADER чувствителен как к Полярности (будь то настроение положительное или отрицательное), так и к Интенсивности (насколько положительное или отрицательное настроение) эмоций.

VADER учитывает это, присваивая слову значение Valence Score. Оценка валентности Оценка валентности измеряется по шкале от -4 до +4, где -4 соответствует наиболее «отрицательному» настроению, а +4 — наиболее «положительному» настроению. Интуитивно можно догадаться, что середина 0 представляет собой «нейтральное» настроение, и именно так оно и определяется на самом деле.

Составная оценка вычисляется путем суммирования оценок валентности каждого слова в лексиконе, скорректированных в соответствии с правилами, а затем нормализована так, чтобы она находилась в диапазоне от -1 (самое крайнее отрицательное) до +1 (самое крайнее положительное). Это наиболее полезная метрика, если вам нужна единая одномерная мера тональности для данного предложения.

Ниже приведена основная формула VADER.

где x = сумма показателей валентности составляющих слов, а α = константа нормализации (значение по умолчанию равно 15).

Добавление оценок в фрейм данных

После необходимой очистки набора данных мы добавили столбцы в исходный DataFrame для хранения словарей polarity_score, извлеченных оценок соединений и новых меток «pos/neg», полученных из оценки соединений.

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

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

ВЕЙДЕР Точность

Чтобы понять, правильно ли работает модель, нам нужно проверить ее точность. Мы решили еще больше очистить текст, чтобы больше сосредоточиться на тексте, а не на знаках препинания, и добавили в наш фрейм данных столбец с именами «cleaned_text» и «cleaned_text_final» (вы узнаете, почему мы делаем это далее в посте!)

Обучение и тестирование

Итак, вы можете подумать: «Почему мы дважды очищали текст? Чтобы понять, работает ли наш анализатор настроений VADER, нам нужно было знать его точность — способен ли он отображать правильное настроение в соответствии с размеченными данными.

Поэтому мы разделили набор данных на независимую переменную (cleaned_text) и зависимую переменную (comp_score), которые затем помогли бы нам создать разделение (набор данных для обучения и тестирования) с test_size, и мы приступили к его рандомизации.

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

Работа еще не сделана! Мы до сих пор не знаем точности. Следующим шагом было вычислить не только точность, но также точность и полноту модели VADER.

94% Точность! Мы на секунду поверили, что это все, это финальная модель, но из этого ничего не вышло. Как когда мы тестировали его на более сложном операторе. Это то, что случилось:

Здесь ВЕЙДЕР принял во внимание слово «ужасно» больше, чем «действительно ХОРОШО», что затем пометило предложение как отрицательное, тогда как на самом деле оно было положительным.

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

Здесь в игру вступают модели машинного обучения.

Наивный байесовский классификатор

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

Он основан на применении правила Байе, определяемого следующей формулой:

В нашем случае текст d представлен вектором из K атрибутов, таких как d = (w, w, …, w). 1 2 k Вычисление P(d|c) нетривиально, и поэтому наивный байесовский подход вводит предположение, что все значения признаков wj независимы при заданной метке категории c . То есть при i=/ j wi и wj условно независимы при заданной метке категории c. Таким образом, правило Байя можно переписать так:

Существует несколько вариантов наивных байесовских классификаторов: многомерная модель Бернулли, полиномиальная модель, модель Гаусса. Для этого проекта наиболее подходящей была полиномиальная модель, так как нам нужно было отображать настроения как положительные, нейтральные и отрицательные.

Обучение и тестирование новой модели наивного байесовского классификатора

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

Мы использовали выборочный набор данных для Наивного Байеса, чтобы сократить время вычислений с одного часа до 18 минут!

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

Точность наивного байесовского классификатора

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

Какая красивая матрица путаницы! Следующим шагом является расчет точности, точности и отзыва для того же

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

Тестирование новой модели с новыми данными

Закончив на хорошей ноте, мы решили протестировать собственное случайное утверждение и посмотреть, работает ли наша модель так, как должна. Мы использовали утверждение -

я думаю, что хороший пример в ссылке прояснит

Вывод: [я думаю, что хороший пример в ссылке пояснит] Положительный

Ура! Мы нашли нашу идеальную модель!

Вывод

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

· Общее время вычислений невелико.

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

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

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

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

Спасибо!

Этот проект занимает особое место в моем сердце, так как это был завершающий проект нашего последнего года в Университете мира MIT в Пуне.

Этот проект был не просто работой одного человека. Потребовалось лучшее из трех человек. Я — Ниведита Шанбхаг и мои замечательные товарищи по команде Ишвари Модак и Джанви Варбхе. Добиться таких результатов было бы невозможно, если бы у меня не было помощи и поддержки товарищей по команде. Все трое работали в унисон над кодом, а также отчетом и представили его нашему университету.

Я очень признателен г-ну Сабаришу Чинте за его руководство и постоянный контроль, а также за предоставление необходимой информации о проекте, а также за его поддержку в завершении проекта. Я хотел бы выразить благодарность руководителю Школы электроники и коммуникаций доктору Арти А. Хапарде за ее любезное сотрудничество и поддержку, которые помогли мне в завершении этого проекта, и доктору Рупали Куте за своевременный вклад и еженедельные отзывы о моей проектной работе.

Я хотел бы выразить особую признательность и благодарность MIT-WPU за предоставленные мне такие прекрасные возможности для улучшения моих навыков.

Я также выражаю благодарность и признательность моим коллегам по разработке проекта и людям, которые охотно помогали мне своими способностями.

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