Пошаговое руководство, включая образцы кода и результаты анализа

Контекст

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

В серии публикаций мы собираемся изучить один из таких инструментов, Google Natural Language API, чтобы понять как теоретические основы этого инструмента, его применение в различных наборах данных, так и его эффективность для различных бизнес-целей. .

Сегодня мы начнем с базового введения в обработку естественного языка и примера, показывающего, как применить анализ настроений к анонимному набору данных отзывов о ресторанах с помощью Google NLP API.

Обработка естественного языка

Вообще говоря, обработку естественного языка (часто сокращенно НЛП) можно рассматривать как пересечение ряда различных областей исследования, включая (но не ограничиваясь) лингвистику, информатику и искусственный интеллект. Более конкретно, его часто определяют как подполе исследований искусственного интеллекта, которые фокусируются на использовании компьютерного программирования для обработки и вывода значения «естественных» человеческих языков, то есть тех языков, устных или письменных, которые возникли с течением времени с развитие различных человеческих культур.

Приложения НЛП включают:

  • Машинный перевод с одного языка на другой
  • Распознавание речи или преобразование устной речи в текст
  • Перевод письменного текста в устную речь
  • Анализ настроения, а также того, насколько позитивен или негативен язык
  • Извлечение темы и классификация текста
  • Язык моделирования, т. Е. Создание текста в виде полных предложений.
  • Понимание цели вопросов и предоставление ответов

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

  • Анализ настроений
  • Извлечение сущности (идентификация предмета)
  • Классификация контента
  • Синтаксический анализ

Настраивать

Для целей этого исследования, а не для выполнения пользовательских вызовов API к конечной точке естественного языка, я использовал клиент Google Natural Language Python.

Настройка для клиента более или менее проста. Он доступен через PyPI и может быть установлен через pip.

pip install --upgrade google-cloud-language

Я импортировал клиента в Jupyter Notebook для интерактивного анализа и импортировал некоторые подмодули в свое пространство имен для удобства.

from google.cloud import language
from google.cloud.language import enums
from google.cloud.language import types

Чтобы действительно выполнять вызовы службы через API, вы должны сначала настроить учетную запись Google Cloud Platform или организацию и включить API. Затем создайте учетную запись службы с необходимым доступом к API и сгенерируйте ключ доступа, который можно загрузить в виде файла JSON. Задайте переменную среды с именем GOOGLE_APPLICATION_CREDENTIALS и укажите ее на этот файл (это менее простая часть процесса настройки). Мне нравится использовать модуль python os для установки таких переменных среды.

import os
os.environ[‘GOOGLE_APPLICATION_CREDENTIALS’] = ‘gcp-sandbox-key.json’

После того, как переменная GOOGLE_APPLICATION_CREDENTIALS установлена, вызовы API могут быть выполнены путем создания экземпляра клиентского объекта, а затем применения фактического метода конечной точки.

gcp_language_client = language.LanguageServiceClient()

Анализ настроений

После создания объекта LanguageServiceClient вы можете выполнять вызовы определенных конечных точек с помощью методов, определенных для клиентского класса. Анализ тональности выполняется с помощью метода analysis_sentiment (), который принимает в качестве входных данных объект Document (определяется отдельно). Документ в контексте API Google включает как фактический текст, который нужно проанализировать, так и параметры, указывающие его формат и язык.

def get_sentiment(text_to_analyze, gcp_language_client):
    """
    Uses the Google Natural Language API to analyze sentiment of
    input.
    """
    # language not explicitly set, so API will auto-detect
    document = types.Document(
        content = text_to_analyze,
        type = enums.Document.Type.PLAIN_TEXT
        )
    sentiment = gcp_language_client.analyze_sentiment(
        document=document).document_sentiment
    sentiment_dict = {}
    sentiment_dict[‘magnitude’] = sentiment.magnitude
    sentiment_dict[‘score’] = sentiment.score
    return sentiment_dict

Для удобства я включил в свою функцию get_sentiment () компонент, который преобразует возвращаемый объект в словарь Python, содержащий два ключа:

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

В качестве примера рассмотрим набор данных отзывов о ресторанах, найденных на Kaggle.com. Этот набор данных состоит из 1000 отзывов с указанием того, понравился ли ресторан клиенту, в форме логического значения. В таблице ниже показаны первые пять точек данных, а также предполагаемая оценка настроения и величина, сгенерированные Google NLP API.

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

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

Оценка модели

Если мы возьмем очень простой подход и предположим, что любая запись с оценкой выше 0 указывает на «Понравившийся» ресторан, любая запись с оценкой ниже 0 указывает на ресторан «Не нравится», а любая запись с ровно 0 мнений указывает на нейтральный настроения, то мы получаем следующие результаты:

Таким образом, из 1000 записей API Google Natural Language точно определил настроение 902 отзывов о ресторанах, что привело к точности немногим более 90%. Для времени разработки, составляющего менее часа, это довольно хороший результат и потенциально может сэкономить значительное количество человеческого труда или добавить дополнительное измерение к текстовым данным, которое было трудно анализировать. Если мы исключим нейтральные значения, то наш рейтинг точности вырастет до 95%.

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

Применение другого порога

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

[Также интересно отметить, что для приведенной ниже диаграммы мне пришлось применить джиттер, чтобы различать результаты графически - многие точки данных имели точно перекрывающиеся значения. Таким образом, хотя результаты вывода представлены в виде десятичных значений, фактическая точность для конкретной оценки, похоже, не может быть меньше 0,1 как для настроения, так и для величины. ]

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

При этом давайте все равно сделаем это и посмотрим, что у нас получится. Среднее значение оценки настроения составляет около 0,09 со стандартным отклонением 0,71.

Давайте применим следующие пороговые значения, которые установлены на +/- одно стандартное отклонение от среднего значения. Предполагая нормальное распределение оценок настроений, результаты разбиваются на 3 группы - нейтральная группа будет составлять примерно 2/3 от общего количества, а остальные положительные и отрицательные группы будут составлять около 1/6 от общего количества.

  • От -1,0 до -0,62: отрицательно
  • От -0,62 до 0,8: нейтральный
  • 0,8 до 1,0: положительный

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

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

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

Сарказм

Из результатов, которые противоречили рейтингам «Понравилось», некоторые из них иллюстрируют общую проблему обработки естественного языка, которая связана с обнаружением саркастической лексики. Подобно четырехлетнему ребенку или данным андроида в Star Trek: The Next Generation, моделям искусственного интеллекта трудно понять, саркастичен кто-то или нет. Для интерпретации сарказма необходимы опыт и мировые знания, чтобы понять контекст языка. Если мы посмотрим на приведенный ниже пример, то увидим, как наивная интерпретация может классифицировать этот обзор как положительный (в конце концов, он «действительно впечатляет» !!!), но с нашим мировым опытом мы можем сказать иное.

Плохие данные

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

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

Заключение

На первый взгляд, и для анализа настроений, API естественного языка Google работает очень хорошо, выявляя положительные и отрицательные настроения с точностью более 99% (без учета нейтральных данных). Время на разработку было минимальным, хотя требовался некоторый анализ результатов, чтобы сделать их полезными.

API на самом деле работал достаточно хорошо, поэтому было трудно найти примеры, в которых обработка естественного языка не работает так же хорошо (например, контекстно-зависимые утверждения и опровергнутые ожидания). Возможно, стоит изучить другие инструменты НЛП или более глубоко погрузиться в набор данных, чтобы найти эти примеры. На данный момент также неясно, как могут работать другие аспекты NLP API, такие как классификация контента.

Наконец, хотя с Google NLP API у нас есть готовый инструмент для анализа настроений, есть еще много областей, которые необходимо изучить с точки зрения его приложений. Хотя возможность автоматически анализировать настроения отзывов клиентов удобна, поскольку клиенты уже могут предоставлять количественную обратную связь в виде звездочек и кнопок «Понравилось», неясно, что предоставляет API, чего еще нет.

Я рассмотрю эти и другие вопросы в следующих статьях. Будьте на связи!