Анализ тональности использует вычислительные инструменты для определения эмоционального оттенка текста. Этот подход важен, поскольку позволяет понять отношение, мнения и эмоции людей, представленные в ваших данных.
На более высоком уровне анализ тональности включает обработку естественного языка и искусственный интеллект: текст преобразуется в формат, понятный машине, а затем с помощью статистики определяется фактическая тональность.
В этом руководстве мы будем использовать модуль обработки естественного языка nltk для анализа тональности твитов из Twitter.
Анализ тональности — не новая концепция. Существуют тысячи размеченных данных, где метки варьируются от простых «положительно» и «отрицательно» до более сложных систем, определяющих степень позитивности или негативности текста. Поскольку в разметке текстовых данных много неопределённости, не существует единого способа создания классификатора тональности.
Я выбрал предварительно размеченный набор данных, состоящий из твитов, уже классифицированных как положительные или отрицательные. На основе этих данных мы создадим модель анализа тональности с помощью nltk.
Это руководство написано для Python 3.6. Если вы ещё не сделали этого, скачайте Python и Pip. Затем установите пакет nltk, который мы будем использовать в этом руководстве:
Мы будем использовать уже хорошо зарекомендовавшие себя и широко применяемые наборы данных для текстового анализа. Чтобы получить доступ к этим данным, введите следующую команду в командной строке (обратите внимание, что это может занять несколько минут):
Использование Jupyter Notebook — лучший способ максимально эффективно работать с этим руководством благодаря его интерактивным подсказкам. Когда ваш ноутбук будет запущен, вы можете загрузить данные, с которыми мы будем работать в этом примере. Их можно найти в репозитории в файлах `neg_tweets.txt` и `pos_tweets.txt`. Убедитесь, что данные находятся в той же директории, что и ваш ноутбук, и тогда мы можем начинать.
Для тех, кто не знаком с Jupyter Notebook, я привёл краткий обзор функций, которые будут особенно полезны для выполнения этого руководства.
На изображении ниже вы увидите три кнопки с номерами 1–3, которые важно освоить: кнопка сохранения (1), кнопка добавления ячейки (2) и кнопка выполнения ячейки (3).
Первая кнопка — это кнопка, с помощью которой вы будете сохранять свою работу по мере её выполнения (1).
Далее идёт кнопка «добавить ячейку» (2). Ячейки — это блоки кода, которые можно выполнять вместе. Они являются основными строительными блоками Jupyter Notebook, так как позволяют запускать код поэтапно, не выполняя весь код сразу. В этом руководстве вы увидите блоки кода — каждый из них должен соответствовать отдельной ячейке.
И наконец, есть кнопка «выполнить ячейку» (3). Jupyter Notebook не выполняет ваш код автоматически; вы должны указать, когда это делать, нажав «выполнить ячейку». Как и в случае с кнопкой добавления, после написания каждого блока кода в этом руководстве в ячейке вы должны выполнить его, чтобы увидеть результат (если он ожидается). Если результат предполагается, обратите внимание, что он также будет показан в этом руководстве, чтобы вы знали, чего ожидать. Обязательно выполняйте код по мере продвижения, так как многие блоки кода в этом руководстве зависят от предыдущих ячеек.
Теперь мы используем nltk для создания модели анализа тональности на том же наборе данных. nltk требует другой формат данных, поэтому я реализовал следующую функцию:
Функция `format_sentence` преобразует каждый твит в словарь слов, сопоставленных с булевым значением `True`. Хотя это не очевидно из самой функции, в дальнейшем это позволит нам обучить модель прогнозирования, разбивая текст на токены, то есть выполняя *токенизацию* текста.
Отформатируйте положительно и отрицательно размеченные данные с помощью загруженных из репозитория GitHub данных.
Все классификаторы nltk работают со структурами признаков, которые могут быть простыми словарями, сопоставляющими имя признака с его значением. В этом примере мы используем наивный байесовский классификатор, который делает прогнозы на основе частотности слов, связанных с каждой меткой — положительной или отрицательной.
Мы можем вызвать функцию `show_most_informative_features`, чтобы увидеть, какие слова являются наиболее сильными индикаторами положительной или отрицательной метки, поскольку наивный байесовский классификатор полностью основан на частотах, связанных с каждой меткой для данного слова:
Обратите внимание, что есть три столбца. Первый столбец объясняет, почему мы использовали `format_sentence` для сопоставления каждого слова со значением `True`. Эта функция подсчитывает количество вхождений каждого слова для обеих меток и вычисляет соотношение между ними, что и представлено в третьем столбце. Второй столбец показывает, какая метка встречается чаще. Метка слева — это метка, наиболее связанная с соответствующим словом.
Давайте попробуем классификатор на положительном примере, чтобы увидеть, как работает наша модель:
Вывод:
Теперь попробуем пример, который должен получить отрицательную метку:
Мы получаем вывод:
Что произойдёт, если мы смешаем слова с разной тональностью? Рассмотрим этот пример:
Вывод:
Мы обнаружили ошибку в разметке! Наивный байесовский классификатор не учитывает связь *между* словами, поэтому он не смог распознать, что слово «нет» выступает в роли отрицания для слова «головная боль». Вместо этого он увидел два негативных индикатора и классифицировал текст как отрицательный.
Учитывая это, можно ожидать, что точность модели будет неидеальной.
В nltk есть встроенный метод, который вычисляет точность нашей модели:
Результат:
nltk специализируется на задачах обработки естественного языка и *создан* для работы с неочищенными и ненормализованными данными. Но почему даже такие хорошо зарекомендовавшие себя модели дают точность всего около 80%? Всё дело в отсутствии предварительной обработки данных.
Если посмотреть на сами данные, можно увидеть, что они довольно «грязные» — в них есть опечатки, сокращения, всевозможные грамматические ошибки. Нет единого формата для каждого твита, кроме того, что это просто твит. Что же можно сделать в этой ситуации?
Пока что мы вынуждены довольствоваться классификатором с точностью 83%.
Если вам понравилось то, что вы здесь сделали, подписывайтесь на меня в Twitter @lesleyclovesyou, чтобы получать больше контента, рассуждений о науке о данных и, что самое важное, ретвиты очень милых щенков.