Этот пост является продолжением предыдущей статьи, в которой мы создали приложение Twitter и установили связь между R и Twitter API через приложение. В этой статье мы будем предсказывать настроения. Начнем..

Поскольку Уимблдон-2019 закончился некоторое время назад, мы проведем анализ настроений в связи с последними событиями наводнения в Ассаме, выбрав твиты с хэштегом #AssamFloods.

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

Давайте проверим, что представляют собой первые несколько столбцов.

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

Текст в твите выглядит так.

Стихийные бедствия сеют хаос, но человечество может объединиться и помочь другим, кто в этом нуждается. Каждый из нас может что-то сделать, чтобы помочь людям в Ассаме, пострадавшем от наводнения. Читайте дальше, чтобы узнать:\nhttps://t.co/QiNssWgswx\n#CauseAChatter #AssamFloods «https://t.co/5K0Jx7qyEQ

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

Очистка твитов

Flood_text=Flood_tweets$text

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

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

Хотя мы использовали параметр include_rts=FALSE, чтобы исключить любые ретвиты при получении наших твитов, мы удалим объекты ретвитов из сохраненных твитов (текст).

Flood_text = gsub("(RT|через)((?:\\b\\W*@\\w+)+)", " ", Flood_text)

# Удалить html-ссылки. Не требуется для анализа настроений. Подчеркнуто на изображении выше.

Flood_text = gsub("(f|ht)(tp)(s?)(://)(.*)[.|/](.*)", " ", Flood_text)

# Затем удалите все «#Hashtag». Подчеркнуто на изображении выше.

Flood_text = gsub("#\\w+", " ", Flood_text)

Подчеркнутый выше ненужный символ относится к типу UTF-8. Мы удаляем его с помощью приведенной ниже команды.

Flood_text = iconv(Flood_text, "UTF-8", "ASCII", sub="")

Давайте очистим твиты, если мы каким-то образом удалили все в твите, и все, что осталось, это NA (недоступно).

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

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

Теперь основное намерение состоит в том, чтобы поработать над двумя разными алгоритмами машинного обучения, чтобы предсказать настроение твитов, а затем проверить, какой из них был более точным. Для этого мы разделим наш набор данных твитов и используем первые 1900 строк для обучения модели, а оставшиеся 819 строк — в качестве тестовых данных для прогнозирования их настроений.

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

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

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

Частота термина: это означает, какова частота термина в документе.

Частота документов: это говорит о том, сколько различных документов встречается в этом термине.

Обратная частота документов: это общее количество документов в корпусе, деленное на частоту документов.

У нас есть 2310 документов. Скажем, в первом документе слово «потеря» используется дважды. Этот документ состоит из 15 слов. Таким образом, его Термин Частота составляет 2/15 = 0,133. Если это слово встречается, скажем, в 1000 документах в целом, то частота документа равна 1000. Его обратная частота документа будет равна log10(2310/1000) = 0,36. TF-IDF будет 0,133 * 0,36 = 0,048.

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

Мы создадим три разные функции для частоты термина, обратной частоты документа и частоты термина — обратной частоты документа, как показано ниже.

Теперь давайте применим TF-IDF к нашим твитам.

Мы применяем контролируемые алгоритмы машинного обучения, поскольку у нас есть обучающие данные, на которых алгоритм может учиться. Первый алгоритм — это классификация K-ближайших соседей (KNN), потому что мы хотим классифицировать твиты на положительные, отрицательные и нейтральные настроения.

Что такое алгоритм KNN?

K ближайших соседей — это алгоритм, который требует передачи значения K (количество соседей). При этом каждая новая контрольная точка измеряется по ее расстоянию с заранее определенными соседями, идентифицируется ближайший сосед и производится/прогнозируется классификация. Измерение расстояния может быть евклидовым, манхэттенским, минковским и т. д. Мы устанавливаем пакет с именем class для прогнозирования настроений тестовых твитов с помощью KNN. Мы разделили наши данные в соотношении 70:30, и, следовательно, обучающие данные состоят из 1600 текстов твитов, а тестовые данные — из оставшихся 710 текстов твитов.

Давайте поработаем с тремя разными значениями K (10, 5 и 3) и проанализируем, какое из них более точное.

Из 710 тестовых твитов мы видим, что 246+63+6=315 предсказаний оказались точными.

Из 710 тестовых твитов мы видим, что 388+13+9=410 прогнозов оказались точными.

Из 710 тестовых твитов мы видим, что 377+13+9=399 прогнозов оказались точными.

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

Теперь давайте перейдем к другому алгоритму, который называется Random Forest.

Что такое случайный лес?

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

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

Из 710 тестовых твитов мы видим, что 364+23+69=456 предсказаний оказались точными.

Из 710 тестовых твитов мы видим, что 349+16+87=452 предсказания оказались точными.

Очевидно, что алгоритм Random Forest дает лучшее предсказание настроений, чем подход KNN.

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

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

Первоначально опубликовано на https://www.opencodez.com 31 июля 2019 г.