Вы определенно слышали об анализе настроений в последние несколько лет. В этом руководстве мы рассмотрим, как вы можете анализировать обзоры, сохраненные в Google Таблицах, и использовать комбинацию Скрипт приложений, Облачные функции и Google Cloud Natural Language API для анализа настроений и отображения результатов в Google. Сам лист.

Здесь есть о чем рассказать, но сначала давайте посмотрим, что мы планируем создать к концу этого руководства. Образец таблицы Google показан ниже:

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

Ниже показан тот же Google Sheet с настраиваемым параметром меню, добавленным для анализа настроений по каждой записи.

При нажатии на нее происходит какое-то волшебство, и мы вставляем положительный (зеленый), отрицательный (красный) или нейтральный (желтый) цвет в значения столбца для настроения, как показано ниже:

За кадром произошло следующее:

  1. При нажатии на опцию меню Analyze Sentiment мы пишем немного скрипта приложений (язык сценариев на основе JavaScript, который позволяет вам делать интересные вещи с семейством GSuite, то есть с документами, таблицами, слайдами и т. Д.).
  2. Код скрипта приложений вызывает функцию, которая будет вызывать Google Cloud Natural Language API. Этот API, доступный всего лишь через вызов REST, помогает вам понять естественный язык. Помимо языкового анализа, он может помочь нам понять сущности, которые упоминаются в тексте, и, что наиболее важно, тональность текста. Мощной функцией API является анализ тональности не только для всего текста, но и для каждой из сущностей, которые он находит в тексте.
  3. В зависимости от значения настроения, т. Е. Отрицательного, положительного или нулевого, мы раскрашиваем ячейки соответствующим образом.

Звучит отлично? Пойдем. Я согласен с тем, что мы делаем не так уж и ужасно, и определенно это должна быть ваша версия 0.1 решения для обзоров на базе Google Sheets и Cloud Natural Language API. Я предложу массу улучшений, которые вы можете сделать по сравнению с этой версией, ближе к концу статьи. Моя цель состоит в том, чтобы вы увидели, как все части сочетаются друг с другом, и я уверен, что вы сможете использовать это и создать несколько других приложений на этой основе.

Прежде всего, давайте подробнее рассмотрим API Cloud Natural Language и то, как мы можем использовать его для анализа настроений.

Основы Cloud Natural Language API

Как упоминалось ранее, Google Cloud Natural Language API - это один из его набора API машинного обучения (ML), который предоставляет мощные модели, которые находятся на расстоянии одного вызова REST. Эти API-интерфейсы машинного обучения могут выполнять такие функции, как анализ изображений, видео, текста, преобразования текста в текст, преобразования текста в речь и многого другого.

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

Лучший способ понять красоту этого API - это увидеть его в действии с помощью функции Попробовать API. Посетите https://cloud.google.com/natural-language и прокрутите эту функцию, как показано ниже:

Вы можете использовать предварительно заполненный текст в качестве демонстрации и нажать кнопку АНАЛИЗИРОВАТЬ. Это даст вам возможность разбивки, как показано ниже (я выбрал вкладку результатов, так как это то, что нас интересует).

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

Например, Если я предоставлю вам обзор фильма, который звучит примерно так: «Сценарий был отличным, но песни не вдохновляли», это может оказаться немного сложным. Общее настроение может быть просто нейтральным, потому что настроение фильма кажется положительным, настроение песен кажется отрицательным, и простая математика, кажется, нейтрализует каждое из них. Однако что, если вы хотите понять на более детальном уровне, что работает в фильме? В этом случае было бы здорово определить каждую из сущностей, о которых говорится в обзоре, то есть сценарий и песни. А затем посмотрите на отдельные чувства вокруг них. Именно это и делает функция тональности сущности в Cloud Natural Language API.

Примечание: фильмы и песни…. ??? Болливуд… верно!

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

Оценка представляет собой значение от -1,0 до 1,0, где -1,0 указывает на очень отрицательное значение, а +1,0 - на очень положительное. Значение 0,0 - нейтральное мнение. Но это не все. С каждой оценкой связано значение величины. Более высокое значение величины указывает на силу настроения. Обратитесь к документации, чтобы немного лучше понять ситуацию. Я также воспроизвожу из официальной документации таблицу, в которой показано, как можно использовать два значения вместе, чтобы интерпретировать настроение более значимым и действенным образом.

Давайте посмотрим на другой пример, который показывает мощь API естественного языка в сравнении с анализом настроений на уровне сущности. Вот реальный обзор, который я взял из местного ресторана:

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

Завершим негативные черты этого места:

ЕДА: Мы заказали свежую содовую (сладкую), курицу с чесночным маслом и холодные креветки для начала.

Свежая лаймовая сода была горькой на вкус

Курица была жевательной, а сливочно-чесночный соус был липким.

Чизван-чатни, который подавали на наш стол, был несвежим и имел неприятный запах.

Хотя мы планировали здесь ужин, мы передумали после дегустации еды.

Продолжайте и вставьте указанный выше текст в функцию «Попробовать API». Вы обнаружите, что он смог проанализировать настроение каждого предложения, каждой сущности и отлично справился как с положительными, так и с отрицательными настроениями для соответствующих сущностей в обзоре. Фрагмент того же приведен ниже:

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

Важная заметка

В рамках этого урока мы будем простыми и рассмотрим только две вещи:

  1. Общее настроение на уровне документа, а не мнение отдельных лиц.
  2. Мы просто посмотрим на значение оценки, чтобы определить, является ли настроение положительным (›0), нейтральным (= 0) или отрицательным (‹ 0).

Вызов API анализа настроений

Теперь, когда у нас есть базовое представление о том, как работает анализ настроений в Cloud Natural Language API, давайте посмотрим, что нам нужно сделать, чтобы вызвать его и получить некоторые результаты.

Во-первых, имейте в виду, что это REST API, поэтому вы можете вызывать его через HTTP, если хотите, или вы можете использовать одну из многих клиентских библиотек, которые доступны для скрытия деталей вдали от сети и управления. HTTP-запрос / ответ. Но хорошо понимать то же самое на уровне протокола.

Нам нужно отправить POSTrequest методу documents:analyzeSentiment в конечной точке REST, как показано ниже:

https://language.googleapis.com/v1/documents:analyzeSentiment

Для этой конечной точки нам необходимо предоставить объект JSON в данных, как показано ниже:

'document': {
    'type': 'PLAIN_TEXT',
    'content': '--YOUR TEXT HERE--'
  }

Это вернет следующий ответ JSON.

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

{
  "documentSentiment": {
    "magnitude": 0.8,
    "score": 0.8
  },
  "language": "en",
  "sentences": [
    {
      "text": {
        "content": "--YOUR TEXT HERE--",
        "beginOffset": 0
      },
      "sentiment": {
        "magnitude": 0.8,
        "score": 0.8
      }
    }
  ]
}

Значения, возвращаемые для величины и оценки, являются всего лишь выборочными значениями.

Примечание.

  1. Вы можете передать значение document.language в запросе JSON, чтобы указать, на каком языке находится текст. Если он не указан, API автоматически определит его из нескольких языков, которые он в настоящее время поддерживает.
  2. Вместо document.content в запросе JSON вы можете использовать document.gcsContentUri, который может указывать на существующий документ, который вы сохранили в Google Cloud Storage.

Теперь, когда мы немного узнали об API Google Cloud Natural Language, давайте приступим к его применению.

Настройка нашего проекта Google Cloud Platform

Первое, что нужно сделать, - это настроить новый проект Google Cloud Platform и включить несколько API.

Предположу следующее:

  1. У вас есть учетная запись Google Cloud Platform с включенным биллингом. Помните, что всегда есть бесплатный уровень.
  2. Вы создали новый проект в GCP с помощью веб-консоли. Обратите внимание, что projectid для того же.
  3. Нам нужно включить несколько API в нашем проекте Google Cloud Platform: Cloud Functions API и Cloud Natural Language API. В облачной консоли нажмите главное меню в верхнем левом углу и перейдите в Меню → API и службы → Панель управления, как показано ниже:

Нажмите Включить API и службы. Это вызовет экран, как показано ниже, где вы можете ввести Cloud Functions в поле поиска.

Нажмите Google Cloud Functions API, а затем нажмите Включить. Это позволит использовать API в вашем проекте Google Cloud Platform.

Повторите тот же процесс, т. е. включите Google Cloud Natural Language API.

Давайте перейдем к созданию нашей таблицы Google.

Наша таблица Google

Вот образец листа, который вы можете просмотреть и использовать в своей учетной записи Google:



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

Использование скрипта приложений и Cloud Natural Language API

В этом разделе мы будем вызывать API Cloud Natural Language из кода скрипта приложений на нашем листе.

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

Чтобы сгенерировать ключ API, нам нужно снова посетить нашу облачную консоль для проекта. Посетите консоль и перейдите в API и службы → Библиотека, как показано ниже.

Вперед, введите Cloud Natural Language API в поле поиска и выберите его. Вы должны увидеть, что API включен, как показано ниже:

Нажмите УПРАВЛЕНИЕ, а затем нажмите Учетные данные.

На экране учетных данных выберите API-ключ, как показано ниже:

Это сгенерирует API-ключ. Просто скопируйте это значение пока безопасно. Мы будем называть это API_KEY позже в документе.

Теперь, когда у нас есть API-ключ, давайте поработаем над нашим листом Google.

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

Не стесняйтесь добавлять в свой собственный текст обзора вместо предоставленных образцов.

Теперь мы напишем скрипт приложений, который будет принимать каждый текст обзора, вызывать API Cloud Natural Language для текста и, в зависимости от значения оценки тональности, мы изменим цвет фона для столбца тональности на листе выше.

Перейдите к следующему пункту (Редактор сценария) в главном меню, как показано ниже:

Это вызовет редактор кода, как показано ниже:

Замените этот код на код, показанный ниже:

Разберем немного код:

функция onOpen

Эта функция вызывается при открытии документа. Мы создаем новый пункт главного меню под названием Review Analysis Tools, а внутри него мы добавляем пункт меню под названием Analyze Sentiment. Это приводит к появлению следующего дополнительного пункта меню, как показано ниже (обратите внимание на правую часть пункта меню Help):

Если вы щелкнете по пункту меню, он вызовет функцию с именем analyzeSentiment.

Функция analysisSentiment

Первое, что делает эта функция, - это извлекает объект для текущего активного листа в Google Sheet. Затем мы устанавливаем несколько переменных, которые сообщают нам начало и конец строк и столбцов, содержащих данные. Обратите внимание, что для переменной startRow установлено значение 2, поскольку первая строка содержит столбцы заголовков, то есть только имена.

Затем мы используем метод getRange для получения данных таблицы. Возвращаемые данные представляют собой двумерный массив, в котором у вас есть индекс строки, а затем для каждой строки у вас есть массив значений, представляющих каждое значение ячейки. Сейчас нас интересует только значение ячейки для столбца с названием review, потому что это текст, который мы будем передавать в Cloud Natural Language API и получать взамен оценку тональности и величину для всего текста.

Итак, для каждой ячейки данных, представляющих текст обзора, мы вызываем функцию retrieveSentiment, которая возвращает нам оценку. Оценка, как мы знаем из нашего понимания Cloud Natural Language API, варьируется от -1,0 до 1,0, то есть от отрицательного до положительного.

Наконец, функция устанавливает цвет фона для каждой ячейки в зависимости от значения оценки тональности → Красный (меньше 0), Желтый (равен 0) и Зеленый (больше 0). Я также закомментировал значение оценки для заполнения ячейки, но оставляю это вам.

retrieveSentiment функция

Эта функция в первую очередь отвечает за выполнение REST-вызова API Cloud Natural Language. Ранее мы изучали механику выполнения вызова REST и коснулись объектов Request JSON и Response JSON, которые связаны с Cloud Natural Language API.

В Apps Script есть отличный UrlFetchApp класс, который выполняет всю тяжелую работу по вызову REST API. Обратите внимание, что вам нужно будет использовать API_KEY для Cloud Natural API, который вы создали ранее, и использовать это значение для переменной apiKey в коде.

Попробуйте, и вы увидите следующий результат:

Если вы уже заметили, Apps Script упрощает интеграцию с любым REST API, а не только с Cloud Natural Language API. В идеале мне бы хотелось не использовать API_KEY в таком коде. Конечно, могут быть и другие способы разделить ваш код и уберечь его, но я подумал об использовании и здесь облачных функций. Это дало бы мне дополнительную гибкость, чтобы, возможно, удалить весь этот код API Cloud Natural Language из скрипта приложений и просто заменить его вызовом REST для моей облачной функции на основе триггера HTTP. Я потенциально мог бы сделать более богатые облачные функции, которые разделяли бы проблемы.

Итак, давайте посмотрим, как мы можем немного изменить здесь, чтобы использовать облачные функции. Если вы новичок в Google Cloud Functions, я предлагаю мою серию руководств по Cloud Functions.



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

Добавление облачных функций

Сейчас мы собираемся сделать следующее:

  1. Напишите функцию Google Cloud, которая будет отвечать за ввод текста и возвращение оценки настроения. Внутренне реализация облачной функции вызовет для нас Cloud Natural Language API.
  2. После развертывания облачной функции мы изменим код скрипта приложений. Метод analyzeSentiment вызывал метод retrieveSentiment(review). Мы заменим его следующей строкой кода: retrieveSentimentCF(text)
  3. Мы запрограммируем метод retriveSentimentCF() в скрипте приложений.

Давайте идти.

Облачная функция Google для вызова Cloud Natural Language API

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

Нажмите Создать функцию.

Далее вы увидите устрашающую форму, как показано ниже:

Заполните данные, как указано ниже.

  • Имя: дайте имя вашей функции. Назовем его analyzeSentiment
  • Память: выберите 256 МБ, это значение по умолчанию.
  • Триггер: мы собираемся использовать триггер HTTP, поскольку мы хотим вызывать его напрямую через конечную точку HTTP. Идите вперед и выберите HTTP Trigger. Обратите внимание на уникальный URL-адрес, который он сгенерировал.
  • Время выполнения: в настоящее время у него будут все среды выполнения, которые находятся либо в общедоступной (GA), либо в бета-версии. В нашем случае выберите Node.js 6.
  • Исходный код: мы можем вставить сюда наш исходный код. Вам предоставляется шаблон по умолчанию. Замените его кодом, показанным ниже:

Код прост, и мы используем пакет npm Node.js для Google Natural Language API, чтобы упростить нам задачу. Мы просто создаем экземпляр и получаем клиента. Мы можем создать тот же объект JSON запроса, который мы видели до сих пор, вызвать конечную точку API естественного языка и проанализировать результаты. Мы не принимаем во внимание настроения отдельных предложений (отсюда и комментарии), а просто принимаем общий балл и величину тональности документа. Это объект ответа, генерируемый нашей Облачной функцией.

Перейдите на вкладку package.json и используйте следующий фрагмент кода:

{
 “name”: “sentiment-api-example”,
 “version”: “0.0.1”,
 “dependencies”: {
 “@google-cloud/language”: “1.2.0”
 }
}
  • В файле index.js обратите внимание на функцию, которую мы экспортируем с помощью оператора exports.analyzeSentiment.
  • В поле для выполнения функции необходимо соответствие exportsstatement, следовательно, это значение будет analyzeSentiment.

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

После успешного выполнения операции вы увидите свою функцию в списке функций, как показано ниже:

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

Перейдите на вкладку Testing, как показано ниже, и введите текст JSON, как показано ниже. Нажмите Проверить функцию. Это вызовет функцию для вас, и вы увидите, что результат отображается в разделе Вывод. Красиво .. не правда ли?

URL-адрес триггера HTTP облачной функции

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

Мы будем ссылаться на этот URL:

YOUR_CLOUDFUNCTIONS_HTTPS_ENDPOINT

Изменения кода скрипта приложений Google Apps

Теперь вернитесь к своему коду скрипта приложений и сначала перейдите к функции analyzeSentiment. Замените следующую строку:

var score = retrieveSentiment(review);

с участием

var score = retrieveSentimentCF(review);

Добавьте новую функцию retrieveSentimentCF в редактор скриптов, как показано ниже:

Ничего особенного здесь нет, кроме того, что вместо прямого вызова API Cloud Natural Language мы вызвали конечную точку HTTPS Cloud Functions.

Убедитесь, что все работает нормально, как раньше.

Деньги деньги деньги !

Теперь, когда мы увидели, как все это работает, как насчет стоимости этого решения. Здесь мы рассматриваем 2 конкретных услуги:

  1. Облачные функции
  2. Cloud Natural Language API

Помните, что у нас есть Всегда бесплатный уровень, доступный на Google Cloud Platform, и вот ограничения бесплатного использования для различных сервисов.

Теперь, когда речь идет именно об облачных функциях, на уровне бесплатного пользования доступно следующее:

Это то, над чем вы должны попытаться работать. Из основных показателей, предоставляемых облачными функциями, вам нужно будет понять не только количество вызовов, но и среднее время, которое требуется для выполнения вашей функции, и тип среды, в которой вы выбрали выполнение своей облачной функции. https://rominirani.com/google-cloud-functions-tutorial-pricing-9cc6dc47f7c0 »для руководства по ценообразованию с рабочим примером.

Теперь давайте посмотрим на цены на Cloud Natural Language API. На бесплатном уровне мы получаем:

Что означает единица? Если углубиться в Цены на Cloud Natural Language API, вы обнаружите, что единица измерения определяется как текстовая запись. Я воспроизвожу следующий текст из официальной документации, поскольку это лучше всего объясняет:

Текстовая запись соответствует Документу, предоставленному в качестве входных данных для запроса API естественного языка, содержащему до 1000 символов Unicode (включая символы пробела и любые символы разметки, такие как теги HTML или XML).

Если документ содержит более 1000 символов, он считается одной текстовой записью на каждые 1000 символов. Например, если вы отправляете три запроса к API естественного языка, которые содержат 800, 1500 и 600 символов соответственно, с вас будет взиматься плата за четыре текстовые записи: одну за первый запрос (800), две за второй запрос (1500). и один для третьего запроса (600).

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

Сосредоточьтесь на второй строке, то есть на анализе настроений. Это должно дать вам хорошее представление о сумме, которую вам обойдется Cloud Natural Language API, поскольку вы будете знать количество запросов, которые вы сделаете, и приблизительный размер для каждого запроса в единицах (1000 символов).

Добавление дополнительных функций

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

Мнение отдельных лиц

Вы заметили, что мы ограничили это руководство общей тональностью и оценкой документа. Это хорошо, но вы, вероятно, получите намного больше, если исследуете использование настроений отдельных сущностей. Итак, вместо того, чтобы вызывать только analyzeSentiment вызов в Cloud Natural Language API, как насчет экспериментов с analyzeEntitySentimentmethod. Ознакомьтесь с документацией.

Визуализация

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

Заполнять обзорный лист автоматически

Я предоставил вам Лист с автоматически заполненными данными. Но в реальной системе вам может потребоваться способ перенести данные обзора в таблицу. Для этого может потребоваться интеграция с вашей текущей системой отзывов или с популярными сайтами обзоров. Но имейте в виду, что вы можете это сделать и также можете заполнить лист через API Google Sheets. Вы даже можете создать веб-крючок на базе Google Cloud Functions, который может получать рецензию по мере поступления в систему, а затем заполнять таблицу Google.

Обработка нескольких файлов обзора

Что, если бы вы получили несколько листов с отзывами с разных сайтов. Хорошим вариантом было бы сохранить все эти файлы в Google Cloud Storage, а затем объединить их с Google Cloud Functions для создания конвейера бессерверной обработки данных. Посмотрите на одну из таких возможностей в следующем потоке:

Полезные ссылки

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

Ознакомьтесь с этим сообщением в блоге Алисии Уильямс, консультанта по облачным технологиям в Google.



Ознакомьтесь с этой записью в блоге Ивана Кутиля, эксперта по разработке приложений Google Apps Script.



Есть отличная лаборатория кода от Google по аналогичной технике использования естественного языка из Google Docs. Очень полезно для проверки тона вашего документа и т. Д.



Проект Github

Получите весь исходный код здесь.

Надеюсь, вы нашли этот пост в блоге полезным. Дайте мне знать, что вы на нем построите. Ваше здоровье.