Połączenie z interfejsem API: analizowanie nastawienia w opiniach

Poziom kodowania: Średni
Czas trwania: 20 minut
Typ projektu: automatyzacja przy użyciu menu niestandardowego

Cele

  • Dowiedz się, do czego służy dane rozwiązanie.
  • dowiedzieć się, jak usługi Apps Script działają w danym rozwiązaniu.
  • skonfigurować środowisko,
  • Skonfiguruj skrypt.
  • Uruchom skrypt.

Informacje o rozwiązaniu

Możesz na dużą skalę analizować dane tekstowe, takie jak opinie otwarte. Aby przeprowadzić analizę encji i nastawienia w Arkuszach Google, to rozwiązanie korzysta z usługi UrlFetch i łączy się z interfejsem Google Cloud Natural Language API.

diagram przedstawiający działanie analizy nastawienia

Jak to działa

Skrypt zbiera tekst z arkusza kalkulacyjnego i łączy się z interfejsem Google Cloud Natural Language API w celu analizowania encji i nastawienia w ciągu znaków. Tabela przestawna zawiera podsumowanie średniego wyniku nastawienia dla każdego elementu wymienionego we wszystkich wierszach danych tekstowych.

Usługi Apps Script

To rozwiązanie korzysta z następujących usług:

  • Usługa arkusza kalkulacyjnego – wysyła dane tekstowe do interfejsu Google Cloud Natural Language API i oznacza każdy wiersz jako „Complete” (Zakończone) po przeanalizowaniu jego wyrażenia.
  • UrlFetch – łączy się z Google Cloud Natural Language API, by przeprowadzić analizę encji i nastawienia w tekście.

Wymagania wstępne

Aby korzystać z tego przykładu, musisz spełnić te wymagania wstępne:

  • konta Google (konta Google Workspace mogą wymagać zatwierdzenia przez administratora),
  • Przeglądarka z dostępem do internetu.

  • Projekt Google Cloud z powiązanym kontem rozliczeniowym. Więcej informacji znajdziesz w artykule Włączanie płatności w projekcie.

Konfigurowanie środowiska

Otwieranie projektu Cloud w konsoli Google Cloud

Jeśli nie jest jeszcze otwarty, otwórz projekt Cloud, którego chcesz użyć w tym przykładzie:

  1. W konsoli Google Cloud otwórz stronę Wybierz projekt.

    Wybierz projekt Cloud

  2. Wybierz projekt Google Cloud, którego chcesz użyć. Możesz też kliknąć Utwórz projekt i postępować zgodnie z instrukcjami wyświetlanymi na ekranie. Jeśli utworzysz projekt Google Cloud, może być konieczne włączenie dla niego płatności.

Włączanie interfejsu Google Cloud Natural Language API

To rozwiązanie łączy się z interfejsem Google Cloud Natural Language API. Zanim zaczniesz korzystać z interfejsów API Google, musisz włączyć je w projekcie Google Cloud. W jednym projekcie Google Cloud możesz włączyć 1 lub więcej interfejsów API.

To rozwiązanie wymaga projektu Cloud ze skonfigurowanym ekranem zgody. Skonfigurowanie ekranu zgody OAuth określa, co Google wyświetla użytkownikom, i rejestruje aplikację, dzięki czemu możesz ją później opublikować.

  1. W konsoli Google Cloud otwórz Menu > Interfejsy API i usługi > Ekran akceptacji OAuth.

    Otwórz ekran zgody OAuth

  2. W polu Typ użytkownika wybierz Wewnętrzny i kliknij Utwórz.
  3. Wypełnij formularz rejestracji aplikacji, a następnie kliknij Zapisz i kontynuuj.
  4. Na razie możesz pominąć dodawanie zakresów i kliknąć Zapisz i kontynuuj. Gdy w przyszłości będziesz tworzyć aplikację do użytku poza organizacją Google Workspace, musisz zmienić Typ użytkownika na Zewnętrzny, a następnie dodać zakresy autoryzacji wymagane przez Twoją aplikację.

  5. Przejrzyj podsumowanie rejestracji aplikacji. Aby wprowadzić zmiany, kliknij Edytuj. Jeśli rejestracja aplikacji wygląda na prawidłową, kliknij Back to Dashboard (Powrót do panelu).

Uzyskiwanie klucza interfejsu API dla interfejsu Google Cloud Natural Language API

  1. Otwórz konsolę Google Cloud. Sprawdź, czy projekt z włączonymi płatnościami jest otwarty.
  2. W konsoli Google Cloud kliknij Menu > Interfejsy API i usługi > Dane logowania.

    Otwórz stronę Dane logowania

  3. Kliknij Utwórz dane logowania > Klucz interfejsu API.

  4. Zanotuj swój klucz interfejsu API – będzie Ci potrzebny w późniejszym kroku.

Konfigurowanie skryptu

Tworzenie projektu Apps Script

  1. Kliknij przycisk poniżej, aby utworzyć kopię przykładowego arkusza kalkulacyjnego Analiza nastawienia na potrzeby opinii. Projekt Apps Script dla tego rozwiązania jest dołączony do arkusza kalkulacyjnego.
    Utwórz kopię
  2. Kliknij Rozszerzenia > Apps Script.
  3. Zaktualizuj tę zmienną w pliku skryptu za pomocą klucza interfejsu API:
    const myApiKey = 'YOUR_API_KEY'; // Replace with your API key.
  4. Kliknij Zapisz Ikona zapisania.

Dodaj dane tekstowe

  1. Wróć do arkusza kalkulacyjnego.
  2. Dodaj dane tekstowe do kolumn id (identyfikator) i komentarzy. Możesz skorzystać z przykładowych opinii o obiektach wakacyjnych Kaggle lub użyć własnych danych. W razie potrzeby możesz dodać więcej kolumn, ale aby działanie skryptu przebiegło pomyślnie, skrypt musi zawierać dane w kolumnach id i comments.

Uruchom skrypt

  1. U góry arkusza kalkulacyjnego kliknij Narzędzia nastawienia > Oznacz elementy i nastawienie. Aby wyświetlić to niestandardowe menu, może być konieczne odświeżenie strony.
  2. Gdy pojawi się odpowiedni komunikat, autoryzuj skrypt. Jeśli na ekranie zgody OAuth wyświetli się ostrzeżenie: Ta aplikacja nie jest zweryfikowana, wybierz Zaawansowane > Otwórz projekt {Project Name} (niebezpieczny).

  3. Kliknij ponownie Narzędzia do nastawienia > Oznacz elementy i nastawienie.

  4. Gdy skrypt zakończy działanie, przełącz się na arkusz Tabela przestawna, aby zobaczyć wyniki.

Sprawdź kod

Aby sprawdzić kod Apps Script dla tego rozwiązania, kliknij Wyświetl kod źródłowy poniżej:

Pokaż kod źródłowy

Code.gs

solutions/automations/feedback-sentiment-analysis/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);
};

Współtwórcy

Ta próbka jest opracowywana przez Google z pomocą Ekspertów Produktowych Google.

Dalsze kroki