Подключитесь к API: анализируйте настроение отзывов

Уровень кодирования : Средний
Продолжительность : 20 минут
Тип проекта : Автоматизация с индивидуальным меню

Цели

  • Поймите, что делает решение.
  • Узнайте, что делают службы Apps Script в решении.
  • Настройте свою среду.
  • Настройте сценарий.
  • Запустите сценарий.

Об этом решении

Вы можете анализировать текстовые данные, такие как открытые отзывы, в любом масштабе. Для выполнения анализа сущностей и настроений из Google Sheets это решение использует службу UrlFetch для подключения к API Google Cloud Natural Language .

Схема того, как работает анализ настроений

Как это работает

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

Службы сценариев приложений

В этом решении используются следующие сервисы:

  • Служба электронных таблиц – отправляет текстовые данные в API Google Cloud Natural Language и помечает каждую строку как «Завершенную» после анализа ее тональности.
  • Служба UrlFetch – подключается к API Google Cloud Natural Language для выполнения анализа сущностей и настроений текста.

Предварительные условия

Для использования этого образца необходимы следующие предварительные условия:

  • Учетная запись Google (для учетных записей Google Workspace может потребоваться одобрение администратора).
  • Веб-браузер с доступом в Интернет.

  • Проект Google Cloud со связанным платежным аккаунтом. См. раздел Включение выставления счетов для проекта .

Настройте свою среду

Откройте свой облачный проект в консоли Google Cloud.

Если он еще не открыт, откройте проект Cloud, который вы собираетесь использовать для этого примера:

  1. В консоли Google Cloud перейдите на страницу «Выбор проекта» .

    Выберите облачный проект

  2. Выберите проект Google Cloud, который вы хотите использовать. Или нажмите «Создать проект» и следуйте инструкциям на экране. Если вы создаете проект Google Cloud, вам может потребоваться включить для него оплату .

Включите Google Cloud Natural Language API.

Это решение подключается к API Google Cloud Natural Language. Прежде чем использовать API Google, вам необходимо включить их в проекте Google Cloud. Вы можете включить один или несколько API в одном проекте Google Cloud.

  • В своем облачном проекте включите API Google Cloud Natural Language.

    Включите API

Для этого решения требуется облачный проект с настроенным экраном согласия. Настройка экрана согласия OAuth определяет, что Google отображает пользователям, и регистрирует ваше приложение, чтобы вы могли опубликовать его позже.

  1. В консоли Google Cloud выберите > API и службы > Экран согласия OAuth .

    Перейдите на экран согласия OAuth.

  2. В качестве типа пользователя выберите «Внутренний» , затем нажмите « Создать» .
  3. Заполните форму регистрации приложения, затем нажмите «Сохранить и продолжить» .
  4. На данный момент вы можете пропустить добавление областей и нажать «Сохранить и продолжить» . В будущем, когда вы создадите приложение для использования за пределами вашей организации Google Workspace, вам необходимо изменить тип пользователя на Внешний , а затем добавить области авторизации, необходимые вашему приложению.

  5. Просмотрите сводку регистрации приложения. Чтобы внести изменения, нажмите «Изменить» . Если регистрация приложения выглядит нормально, нажмите «Вернуться на панель управления» .

Получите ключ API для API Google Cloud Natural Language.

  1. Перейдите в консоль Google Cloud . Убедитесь, что ваш проект с включенной оплатой открыт.
  2. В консоли Google Cloud выберите > API и службы > Учетные данные .

    Перейти к учетным данным

  3. Нажмите Создать учетные данные > Ключ API .

  4. Запишите свой ключ API, чтобы использовать его на следующем этапе.

Настройте сценарий

Создайте проект скрипта приложений.

  1. Нажмите кнопку ниже, чтобы сделать копию образца электронной таблицы анализа настроений для обратной связи . Проект Apps Script для этого решения прикреплен к электронной таблице.
    Сделать копию
  2. Нажмите Расширения > Скрипт приложений .
  3. Обновите следующую переменную в файле сценария, указав свой ключ API:
    const myApiKey = 'YOUR_API_KEY'; // Replace with your API key.
  4. Нажмите «Сохранить». Значок сохранения .

Добавить текстовые данные

  1. Вернитесь к электронной таблице.
  2. Добавьте текстовые данные в столбцы идентификатора и комментариев . Вы можете использовать образцы отзывов о недвижимости для отдыха от Kaggle или использовать свои собственные данные. При необходимости вы можете добавить дополнительные столбцы, но для успешной работы скрипт должен иметь данные в столбцах id и комментариев .

Запустите сценарий

  1. В верхней части таблицы нажмите «Инструменты для определения тональности» > «Отметить объекты и тональности» . Возможно, вам придется обновить страницу, чтобы появилось это пользовательское меню.
  2. При появлении запроса авторизуйте сценарий. Если на экране согласия OAuth отображается предупреждение «Это приложение не проверено» , продолжайте, выбрав «Дополнительно» > «Перейти к {Имя проекта} (небезопасно)» .

  3. Нажмите «Инструменты для определения тональности» > «Отметить объекты и тональности» еще раз.

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

Просмотрите код

Чтобы просмотреть код скрипта приложений для этого решения, нажмите «Просмотреть исходный код» ниже:

Посмотреть исходный код

Код.gs

решения/автоматизация/обратная связь-анализ настроений/code.js
// To learn how to use this script, refer to the documentation:
// https://developers.google.com/apps-script/samples/automations/feedback-sentiment-analysis

/*
Copyright 2022 Google LLC

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

// Sets API key for accessing Cloud Natural Language API.
const myApiKey = 'YOUR_API_KEY'; // Replace with your API key.

// Matches column names in Review Data sheet to variables.
let COLUMN_NAME = {
  COMMENTS: 'comments',
  ENTITY: 'entity_sentiment',
  ID: 'id'
};

/**
 * Creates a Demo menu in Google Spreadsheets.
 */
function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu('Sentiment Tools')
    .addItem('Mark entities and sentiment', 'markEntitySentiment')
    .addToUi();
};

/**
* Analyzes entities and sentiment for each comment in  
* Review Data sheet and copies results into the 
* Entity Sentiment Data sheet.
*/
function markEntitySentiment() {
  // Sets variables for "Review Data" sheet
  let ss = SpreadsheetApp.getActiveSpreadsheet();
  let dataSheet = ss.getSheetByName('Review Data');
  let rows = dataSheet.getDataRange();
  let numRows = rows.getNumRows();
  let values = rows.getValues();
  let headerRow = values[0];

  // Checks to see if "Entity Sentiment Data" sheet is present, and
  // if not, creates a new sheet and sets the header row.
  let entitySheet = ss.getSheetByName('Entity Sentiment Data');
  if (entitySheet == null) {
   ss.insertSheet('Entity Sentiment Data');
   let entitySheet = ss.getSheetByName('Entity Sentiment Data');
   let esHeaderRange = entitySheet.getRange(1,1,1,6);
   let esHeader = [['Review ID','Entity','Salience','Sentiment Score',
                    'Sentiment Magnitude','Number of mentions']];
   esHeaderRange.setValues(esHeader);
  };

  // Finds the column index for comments, language_detected, 
  // and comments_english columns.
  let textColumnIdx = headerRow.indexOf(COLUMN_NAME.COMMENTS);
  let entityColumnIdx = headerRow.indexOf(COLUMN_NAME.ENTITY);
  let idColumnIdx = headerRow.indexOf(COLUMN_NAME.ID);
  if (entityColumnIdx == -1) {
    Browser.msgBox("Error: Could not find the column named " + COLUMN_NAME.ENTITY + 
                   ". Please create an empty column with header \"entity_sentiment\" on the Review Data tab.");
    return; // bail
  };

  ss.toast("Analyzing entities and sentiment...");
  for (let i = 0; i < numRows; ++i) {
    let value = values[i];
    let commentEnCellVal = value[textColumnIdx];
    let entityCellVal = value[entityColumnIdx];
    let reviewId = value[idColumnIdx];

    // Calls retrieveEntitySentiment function for each row that has a comment 
    // and also an empty entity_sentiment cell value.
    if(commentEnCellVal && !entityCellVal) {
        let nlData = retrieveEntitySentiment(commentEnCellVal);
        // Pastes each entity and sentiment score into Entity Sentiment Data sheet.
        let newValues = []
        for (let entity in nlData.entities) {
          entity = nlData.entities [entity];
          let row = [reviewId, entity.name, entity.salience, entity.sentiment.score, 
                     entity.sentiment.magnitude, entity.mentions.length
                    ];
          newValues.push(row);
        }
      if(newValues.length) {
        entitySheet.getRange(entitySheet.getLastRow() + 1, 1, newValues.length, newValues[0].length).setValues(newValues);
      }
        // Pastes "complete" into entity_sentiment column to denote completion of NL API call.
        dataSheet.getRange(i+1, entityColumnIdx+1).setValue("complete");
     }
   }
};

/**
 * Calls the Cloud Natural Language API with a string of text to analyze
 * entities and sentiment present in the string.
 * @param {String} the string for entity sentiment analysis
 * @return {Object} the entities and related sentiment present in the string
 */
function retrieveEntitySentiment (line) {
  let apiKey = myApiKey;
  let apiEndpoint = 'https://language.googleapis.com/v1/documents:analyzeEntitySentiment?key=' + apiKey;
  // Creates a JSON request, with text string, language, type and encoding
  let nlData = {
    document: {
      language: 'en-us',
      type: 'PLAIN_TEXT',
      content: line
    },
    encodingType: 'UTF8'
  };
  // Packages all of the options and the data together for the API call.
  let nlOptions = {
    method : 'post',
    contentType: 'application/json',  
    payload : JSON.stringify(nlData)
  };
  // Makes the API call.
  let response = UrlFetchApp.fetch(apiEndpoint, nlOptions);
  return JSON.parse(response);
};

Авторы

Этот образец поддерживается Google с помощью экспертов-разработчиков Google.

Следующие шаги