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

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

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

1. Введение

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

Мотивация

Анализ тональности означает присвоение текстовым элементам настроения с помощью обработки естественного языка. Исходя из делового контекста, я начал анализировать отношение к крупным компаниям в социальных сетях. Действительно, мнение о компаниях в социальных сетях имеет решающее значение для их успеха. Поэтому компаниям необходимо автоматически отслеживать настроения в социальных сетях, чтобы иметь возможность реагировать как можно быстрее. Однако когда вы пытаетесь провести анализ настроений на платформах микроблогов, таких как Twitter, вы столкнетесь с собственными проблемами. Люди используют в своих твитах смайлики, хэштеги и гиперссылки, из-за чего вам сложнее решить, какие элементы текста полезны для анализа, а какие — шум.

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

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

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

Данные, с которыми мы работаем

Мы будем работать над одним из этих нескольких корпусов, корпусом под названием SB10K. Этот корпус был представлен в статье 2017¹ и изначально включал почти 10 000 твитов, помеченных настроением (положительным, нейтральным, отрицательным). Выбор твитов следовал сложной схеме. Поскольку большинство твитов в Твиттере вообще не содержат никакого мнения, выбор случайного набора твитов для ручной аннотации приведет к несбалансированному набору почти исключительно нейтральных твитов. Для каждого твита они подсчитали количество слов положительной и отрицательной полярности в твите, используя немецкий словарь ключей полярности. Поскольку авторам было разрешено предоставить только список идентификаторов твитов (из-за проблем с авторскими правами), не все изначально использованные твиты по-прежнему доступны.

Изучение данных

Корпус немецких твитов SB10K, над которым мы работаем, включает идентификаторы 9939 твитов. Отбор твитов проходил по сложной процедуре¹. Для нашего анализа единственными атрибутами данных, которые нам нужны, являются фактический текст твита и соответствующее настроение, обозначенное создателями. Как упоминалось ранее, не все твиты были доступны на момент создания этого сообщения в блоге. Твиты могут быть удалены или соответствующие аккаунты могут быть заблокированы. Тем не менее, я смог получить более 6500 твитов, что является хорошим началом для большинства моделей машинного обучения. Анализ распределения настроений показывает, что существует 1480 положительных твитов, 4078 нейтральных твитов и 981 отрицательный твит, как показано на рисунке 1. Эта статистика показывает, что подавляющее большинство (примерно 60%) твитов имеют нейтральный тон. Это было задумано издателями корпуса, поскольку большинство твитов, опубликованных в Твиттере, не содержат сантиментов.

Пример твита:

«Aber wenigstens kommt #Supernatural heute mal wieder um 22 Uhr — ein schwacher Trost»

Перевод на:

«Но, по крайней мере, #Сверхъестественное вернется сегодня в 22:00 — небольшое утешение».

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

2 Предварительная обработка и обучение

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

Шумоподавление и унификация текстовых элементов

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

Когда люди используют последовательные периоды («…»), количество периодов сильно различается. Мы предполагаем, что настроение одинаково, независимо от того, использует ли кто-то, например. две точки («..») или четыре точки («….»). Мы объединяем каждую последовательность последовательных периодов от 2 до n периодов в последовательность из трех периодов ("…").

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

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

Разделение твитов

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

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

Приведение слов к их основе

Еще одна функция, которая нам нужна, — это стеммер. Стеммеры пытаются возвратить каждое слово к его основе. Они работают, отсекая конец или начало слова, принимая во внимание список общих префиксов и суффиксов, которые можно найти во флективном слове. Цель состоит в том, чтобы классифицировать слова не только по точному выражению, но и по другим возможным формам слов, которые мы использовали. Например: мы хотим, чтобы два слова «великий» и «больше» рассматривались как одно слово, предполагая, что они несут одно и то же значение. Поскольку эта процедура является очень специфичной задачей для каждого языка, мы используем специализированный стеммер для немецкого языка. Я проверил работу двух популярных немецких стеммеров: GermanStemmer и CiStem. Из которых последний дал наилучшие результаты.

Удаление бессмысленных слов

Не все слова в предложении необходимы для того, чтобы понять его значение или настроение. Стоп-слова – это слова, которые не добавляют смысла предложению. Их можно смело игнорировать, не теряя смысла предложения. Например, самые распространенные стоп-слова в английском языке: the, is, at, which и on. Поскольку стоп-слова различаются для каждого языка, мы используем немецкие стоп-слова, предоставленные NLTK.

Сделайте его доступным для классификаторов машинного обучения

Последним этапом предварительной обработки твитов является переход от элементов текста к числам, чтобы сделать их доступными для классификаторов машинного обучения. Для этого мы используем TfidfVectorizer от NLTK. Это то же самое, что использовать CountVectorizer от NLTK, за которым следует TfidfTransformer. Первый преобразует набор текстовых документов в матрицу количества токенов, а второй преобразует матрицу количества в нормализованное представление TF-IDF. Теперь мы почти закончили.

Подготовьте целевые переменные

Один шаг предварительной обработки применяется не к твиту, а к меткам: мы заменяем метки настроений целыми числами в шаблоне: (положительное:2), (нейтральное:1) и (отрицательное:0).

Сваливая все вместе

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

  • Преобразовать все строки в нижний регистр
  • Замените гиперссылки и упоминания токеном, представляющим каждый класс текстового элемента.
  • Объединить последовательные периоды
  • Удалить номер, не являющийся частью буквенно-цифровой строки
  • Удалите «RT» для ретвитов и «#» из хэштегов.
  • Токенизация с помощью TweetTokenizer
  • Удалить стоп-слова
  • Составление слов с использованием (специфично для немецкого языка) CiStem
  • Использование TfidfVectorizer для словаря и векторного представления твитов
  • Замените метки тональности целыми числами.

Это наша процедура предварительной обработки от одного твита до списка текстовых элементов:

И этот малыш преобразует наши списки текстовых элементов в матрицу функций TF-IDF:

Теперь все готово, и мы можем обучить нашу модель. Я использовал SVM sklearn со стандартными параметрами:

Он был обучен на фиксированном разделении корпуса (10%), а затем протестирован на оставшихся текстах.

3. Результаты

Как измерить успех

Для оценки нашей модели мы используем оценку F1 (также F-оценку или F-меру). Это мера точности теста. Основой расчета является точность и полнота теста. Точность — это количество правильно идентифицированных положительных результатов, деленное на количество всех положительных результатов, включая
неправильно идентифицированные. Отзыв представляет собой количество правильно идентифицированных положительных результатов, деленное на количество всех образцов, которые должны были быть идентифицированы как положительные. Рассчитав эти две метрики, оценка F1 является гармоническим средним значением точности и полноты. Лучшее значение F1 равно 1, что означает идеальную точность и полноту. Поскольку у нас есть три метки настроений (положительные, нейтральные, отрицательные), мы можем рассчитать баллы F1 для каждого из трех настроений. Обычным в области анализа настроений является оценка F1, усредненная на макроуровне из F1 для положительных настроений и оценки F1 для отрицательных настроений. Кроме того, мы будем использовать фактическую точность (правильные прогнозы/все прогнозы) и матрицу путаницы.

Насколько хороши наши прогнозы?

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

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

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

Этот код можно использовать для получения оценки F1 и матрицы путаницы:

Заключение

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

использованная литература

[1]: М. Челебак, Дж. М. Дериу, Д. Эггер и Ф. Уздилли, Корпус Твиттера и эталонные ресурсы для анализа настроений в Германии (2017 г.), Ассоциация компьютерной лингвистики.