Файл: Основы проектирования программ. Этапы создания программного обеспеченияКурсовая работа.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 30.03.2023

Просмотров: 318

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Сравнение и результат обзора методов анализа тональности текстов

SemEval – это ежегодные соревнования международного масштаба по решению различных задач NLP. В 2017 году были проведены соревнования (SemEval-2017 Task 4) по созданию системы, которая будет осуществлять анализ тональности постов, сделанных в социальной сети Twitter [9].

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

Лучшие показатели не только по этой задаче, но и по большинству остальных, принадлежат команде BB_twtr (табл. 8):

Таблица 8

Топ-10 команд по решению задачи классификации твитов на 3 класса: положительный, негативный, нейтральный

#

System

Recall

F1

Accuracy

1

BB_twtr

0.681

0.685

0.658

2

DataStories

0.681

0.677

0.651

3

LIA

0.676

0.674

0.661

4

Senti17

0.674

0.665

0.652

5

NNEMBs

0.669

0.658

0.664

6

Tweester

0.659

0.648

0.648

7

INGEOTEC

0.649

0.645

0.633

8

SiTAKA

0.645

0.628

0.643

9

TSA-INF

0.643

0.620

0.616

10

UCAC-NLP

0.642

0.624

0.565

За основу своей разработанной системы они взяли свёрточную нейронную сеть в совокупности с LSTM (Long short-term memory –подвид рекуррентных нейронных сетей). Следующие 4 команды также использовали глубокое обучение и ансамбли нейронных сетей. Команды INGEOTEC, SiTAKA и UCAC-NLP за основу своих работ взяли SVM классификатор.

Также в совместной работе специалистов из Intel и университета Карнеги-Меллона (Carnegie-Mellon University) было продемонстрировано преимущество свёрточной нейронной сети над рекуррентной, в частности, над LSTM [29].


Таким образом, за основу web-сервиса была взята именно свёрточная нейронная сеть, так как она продемонстрировала высокие показатели в решении задач NLP, в частности, в классификации текстов по их тональности.

ГЛАВА 2 РАЗРАБОТКА ПРОГРАММЫ

2.1 Используемый функционал на языке программирования Python

Для реализации web-сервиса для классификации постов из Twitter на 4 класса: позитивный, негативный, реклама/поздравление и неопределенный использовался высокоуровневый язык программирования Python. Он как нельзя лучше подходит для реализации нейронных сетей, в нашем случае – свёрточных сетей и метода Word2Vec из-за наличия множества библиотек, в которых уже реализована немалая часть функционала, фреймворка Django и Jupyter Notebook.

Основные библиотеки, которые использовали для реализации ПО:

  • NLTK – это пакет библиотек и программ для работы с данными на естественном языке [30]. Её мы используем для токенизации предложений и стемминга слов (выделение основы слова).
  • Gensim – библиотека для тематического моделирования (извлечения основных тем, которым посвящен обрабатываемый текст) и дистрибутивной семантики (вычисление семантической близости слов) [31]. Из неё берется реализованный метод Word2Vec.
  • Keras - это нейросетевая библиотека, представляющая собой надстройку над фреймворками Deeplearning4j, TensorFlow и Theano [32]. Используется для оперативной работы с нейронными сетями. В нашем случае применяется для реализации сверточной нейронной сети;
  • python-twitter – библиотека, обеспечивающая работу с функционалом API Twitter [33];
  • pymorphy2 – морфологический анализатор. Библиотека, обеспечивающая получение лексемы (всех форм) слова.

Фреймворк Django является полнофункциональным серверным web-фреймворком, который очень популярен среди разработчиков [34]. Он позволяет оперативно реализовывать любые web-сайты, начиная с систем управления контента и заканчивая социальными сетями, из-за своей гибкой структуры и наличием всего необходимого «в коробке», из-за чего можно полностью сосредоточиться на написании своего приложения. Именно по этим причинам он нам подходит для реализации поставленной задачи.


Jupyter Notebook - это интерактивная оболочка языка программирования Python, которая представляет собой инструмент, позволяющий объединить код, текст и диаграммы. Он применялся для реализации и обучения метода Word2Vec и сверточной нейронной сети.

Реализация и обучение Word2Vec

Данные для обучения были взяты с персонального сайта Юлии Рубцовой, где представлен корпус русскоязычных сообщений из Twitter, который содержит в себе 114 991 записей с положительным тональным окрасом и 111 923 с негативным окрасом (в виде файлов с расширением .sql и .csv), а также 17 639 674 неопределенных (файл с расширением .sql) [35].

Изначально, база с неопределенными твитами была конвертирована в формат SQLite с помощью специально скрипта для удобства работы с ней [36]. Затем все твиты предобрабатываются:

  • все символы переведены в нижний регистр;
  • буква «ё» заменена буквой «е»;
  • все ссылки, значки ретвитов, обращения к другим пользователям удалены;
  • удалены все символы, кроме букв русского и английского алфавита, и цифр;
  • стемминг русскоязычных слов.

Далее происходит обучение модели Word2Vec, с заданными значениями параметров:

  • size=300 – размер признакового пространства, куда будут отображаться слова;
  • sg=0 – «0» - соответствует методу CBoW, «1» - методу Skip-gram;
  • window=5 – размер окна, которым будем проходить по предложения для выделения n-грам;
  • min_count=5 – если слово встретилось меньше 5 раз, оно не учитывается.

Сохраняем модель.

Результат работы модели представлен на рисунке 16. Для слов «баскетбол», «музыка», «ненависть», «oxxxymiron» выведены по 20 наиболее близких к ним по значению слов.

Рис. 16. Результат работы метода Word2Vec

Код представлен в приложении 1.

Создание баз с неопределенными твитами и твитами с рекламой и поздравлениями

Для обучения нейронной сети требуются данные. В нашем случае необходимы твиты, размеченные по 4 классам: позитивный, негативный, неопределенный и реклама/поздравления. К сожалению, используемый корпус неопределенных твитов был перемешан с рекламой и поздравлениями. Для того, чтобы выделить их в отдельные базы были составлены списки стоп-слов и фраз, по которым отфильтровывались твиты с поздравлением и рекламой и сохранялись в отдельный файл.

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

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


Список стоп-фраз из триграм: 'c днем рождения', 'с 8 марта', 'с 23 февраля', 'с новым годом', 'днем защитника отечества', 'день защитника отечества', 'днем народного единства', 'с первым снегом', 'получи в подарок'.

Таким образом, поочередно брались твиты, делились на n-грамы, где n – количество слов, и сравнивались с соответствующими списками стоп-слов.

Код представлен в приложении 2.

2.2Реализация и обучение свёрточной нейронной сети

Изначально загружаем файлы с размеченными по классам твитам, уравниваем их количество, осуществляем их предобработку, которая была описана в пункте 3.2, конвертируем метки классов в one-hot векторы (метка в виде целого числа «1», относящаяся к положительному классу, конвертируется в вектор [1, 0, 0, 0], где единица стоит на том месте, которое соответствует твиту с положительной тональностью).

Затем разделяем твиты на обучающую и тестовую выборки в пропорции 80 на 20. Далее реализовываем функции precision(y_true, y_pred), recall(y_true, y_pred), f1(y_true, y_pred), которые будут оценивать работу нашего классификатора, где y_true – это правильный ответ для поданного на вход твита, y_pred – предсказанный ответ классификатором.

Ищем наиболее подходящий размер матрицы (рис. 17), которая будет обрабатываться после embedding слоя остальными слоями. Выводим процент, который соответствует количеству твитов длины меньше, чем представленная. Выбран размер матрицы 30 на 300, так как при таком размере покрывается 99.991% всех твитов.

Рис. 17.

Определяем размер словаря равным 90 000 слов. Обучаем токенизатор (на 90 000 самых частых слов из корпуса) и переводим каждый текст в массив идентификаторов токенов. Таким образом, теперь каждый твит представлен последовательностью из 30 чисел, где каждое число является уникальным для каждого слова. Если длина предложения меньше 30, то оставшееся место в массиве заполняется нулями.

Подключаем уже обученную модель Word2Vec. Создаём матрицу для embedding слоя размером 90 000 на 300, где каждая строка будет векторным отображением слова из уже обученного токенизатора.

Рис. 18. Архитектура свёрточной нейронной сети

Архитектура нашей сверточной нейронной сети (рис. 18) имеет такой же вид, как и описанная в пункте 2.5.6 сеть, за исключение того, что будет присутствовать входной слой, который принимает тексты в виде последовательностей идентификаторов токенов, embedding слой, который будет отображать идентификаторы в векторное пространство, добавленных dropout слоёв со значением вероятности 0.2 после embedding слоя и слоя конкатенации карт признаков в один общий вектор. Также перед выходным слоем был добавлен скрытый слой из 30 нейронов с функцией активации ReLU, чтобы улучшить качество классификации, по примеру из работы Мэтью Клише, который занял 1 первое в классификации твитов по тональности [22]. Сам же выходной слой представляет собой 4 нейрона функцией активации softmax, по каждому нейрону на класс. В виде функции обратного распространения ошибки была взята функция категориальной кросс-энтропии (27):


(27)

Где M –количество классов, log – натуральный логарифм, y – индикатор метки класса, o – объект классификации, c – класс, p – предсказанная вероятность принадлежности объекта к корректному классу.

Более того, согласно работе Ye Zhang и Byron C. Wallace наиболее оптимальной высотой фильтров для датасетов с достаточно небольшими текстами (в Twitter ограничение на количество символов в 280) являются 2, 3, 4, 5 [28]. Мы возьмём по 10 таких фильтров для получения более качественных карт признаков.

Компилируем модель и обучаем на протяжении 12 эпох. Необходимо обучить 27 043 394 параметра. Размер батча (партии) равняется 32, таким образом, нейронная сеть каждый раз после пропуска через себя 32 примеров будет настраивать веса. Это поможет использовать меньше памяти и скорость обучения станет выше. Размер валидационной выборки равен 25%. После каждой эпохи сравниваем показатель f1-меры модели с предыдущими и наилучшую сохраняем.

Каждая эпоха занимала около 50 минут на процессоре Intel(R) Core(TM) i5-8250U CPU @ 1.60 GHz 1.80 GHz. Занимаемая память обученной модели 317 231 КБ.

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

Рис. 19.

Средняя точность классификации твитов по их тональности на 4 класса: позитивный, негативный, реклама/поздравления и неопределенные равна 0.81438 %. Взяли результат micro avg, так как размер классов отличается друг от друга.

На рис. 20 представлены результаты классификации четырёх предложений: «Замечательный фильм, его стоит посмотреть», «Погода этим утром - ужас», «Товарищи, с Новым годом», «Каждое утро надо чистить зубы».

Рис. 20. Пример результата классификации отдельных текстов

Ссылаясь на таблицу 8, проведём сравнение показателей (табл. 9) нашей модели с результатами модели (Word2Vec + свёрточная нейронная сеть + LSTM) Мэтью Клише при классификации текстов на 3 класса: позитивный, негативный и нейтральный.

Таблица 9

Сравнение результатов модели с моделью Мэтью Клише

precision

recall

f1-мера

accuracy

Модель Мэтью Клише

-

0.681

0.685

0.658

Моя модель

0.79931

0.65443

0.71408

-

Однако, такое сравнение не совсем корректно, так как в данной работе классификация проходила на 4 класса: позитивный, негативный, неопределенный, реклама/поздравления. За счёт высоких показателей для последнего класса эта модель кажется предпочтительнее на фоне модели Мэтью Клише.