Mit einer API verbinden: Feedback-Sentiment analysieren

Codierungslevel: Mittel
Dauer: 20 Minuten
Projekttyp: Automatisierung mit einem benutzerdefinierten Menü

Zielsetzungen

  • Informieren Sie sich über die Funktionsweise der Lösung.
  • Informationen zu den Aufgaben der Apps Script-Dienste in der Lösung
  • die Umgebung einrichten
  • Richten Sie das Script ein.
  • Führen Sie das Skript aus.

Informationen zu dieser Lösung

Sie können Textdaten wie ergebnisoffenes Feedback in großem Umfang analysieren. Um Entitäts- und Sentimentanalysen in Google Tabellen durchzuführen, wird in dieser Lösung der UrlFetch-Dienst verwendet, um eine Verbindung zur Google Cloud Natural Language API herzustellen.

Diagramm zur Funktionsweise der Sentimentanalyse

Funktionsweise

Das Script sammelt Text aus der Tabelle und stellt eine Verbindung zur Google Cloud Natural Language API her, um die im String enthaltenen Entitäten und das Sentiment zu analysieren. In einer Pivot-Tabelle wird der durchschnittliche Sentimentwert für jede erwähnte Entität in allen Zeilen der Textdaten zusammengefasst.

Apps Script-Dienste

Für diese Lösung werden die folgenden Dienste verwendet:

  • Tabellendienst: Die Textdaten werden an die Google Cloud Natural Language API gesendet und jede Zeile wird als „Abgeschlossen“ markiert, sobald das Sentiment analysiert wurde.
  • UrlFetch-Dienst: Stellt eine Verbindung zur Google Cloud Natural Language API her, um eine Entitäts- und Sentimentanalyse des Textes durchzuführen.

Vorbereitung

Für die Verwendung dieses Beispiels sind die folgenden Voraussetzungen erforderlich:

  • Ein Google-Konto (für Google Workspace-Konten ist möglicherweise die Administratorzustimmung erforderlich).
  • Einen Webbrowser mit Internetzugriff.

  • Ein Google Cloud-Projekt mit einem verknüpften Rechnungskonto. Weitere Informationen finden Sie unter Abrechnung für ein Projekt aktivieren.

Umgebung einrichten

Cloud-Projekt in der Google Cloud Console öffnen

Öffnen Sie das Cloud-Projekt, das Sie für dieses Beispiel verwenden möchten, falls noch nicht geschehen:

  1. Rufen Sie in der Google Cloud Console die Seite Projekt auswählen auf.

    Cloud-Projekt auswählen

  2. Wählen Sie das Google Cloud-Projekt aus, das Sie verwenden möchten. Sie können auch auf Projekt erstellen klicken und der Anleitung auf dem Bildschirm folgen. Wenn Sie ein Google Cloud-Projekt erstellen, müssen Sie möglicherweise die Abrechnung für das Projekt aktivieren.

Google Cloud Natural Language API aktivieren

Diese Lösung stellt eine Verbindung zur Google Cloud Natural Language API her. Bevor Sie Google APIs verwenden können, müssen Sie sie in einem Google Cloud-Projekt aktivieren. Sie können eine oder mehrere APIs in einem einzelnen Google Cloud-Projekt aktivieren.

  • Aktivieren Sie in Ihrem Cloud-Projekt die Google Cloud Natural Language API.

    API aktivieren

Für diese Lösung ist ein Cloud-Projekt mit einem konfigurierten Einwilligungsbildschirm erforderlich. Mit der Konfiguration des OAuth-Zustimmungsbildschirms legen Sie fest, was Google Nutzern anzeigt, und registrieren Ihre App, damit Sie sie später veröffentlichen können.

  1. Klicken Sie in der Google Cloud Console auf das Dreistrich-Menü  > APIs und Dienste > OAuth-Zustimmungsbildschirm.

    Zum OAuth-Zustimmungsbildschirm

  2. Wählen Sie unter Nutzertyp die Option Intern aus und klicken Sie dann auf Erstellen.
  3. Füllen Sie das Formular zur App-Registrierung aus und klicken Sie dann auf Speichern und fortfahren.
  4. Sie können das Hinzufügen von Bereichen vorerst überspringen und auf Speichern und fortfahren klicken. Wenn Sie in Zukunft eine App für die Verwendung außerhalb Ihrer Google Workspace-Organisation erstellen, müssen Sie den Nutzertyp in Extern ändern und dann die erforderlichen Autorisierungsbereiche hinzufügen.

  5. Überprüfen Sie die Zusammenfassung der App-Registrierung. Wenn Sie Änderungen vornehmen möchten, klicken Sie auf Bearbeiten. Wenn die App-Registrierung korrekt ist, klicken Sie auf Zurück zum Dashboard.

API-Schlüssel für die Google Cloud Natural Language API abrufen

  1. Öffnen Sie die Google Cloud Console. Das Projekt, für das die Abrechnung aktiviert ist, muss geöffnet sein.
  2. Gehen Sie in der Google Cloud Console zu „Menü“  > APIs und Dienste > Anmeldedaten.

    Zu den Anmeldedaten

  3. Klicken Sie auf Anmeldedaten erstellen > API-Schlüssel.

  4. Notieren Sie sich Ihren API-Schlüssel, da Sie ihn in einem späteren Schritt benötigen.

Script einrichten

Apps Script-Projekt erstellen

  1. Klicken Sie auf die Schaltfläche unten, um eine Kopie der Beispieltabelle Sentimentanalyse für Feedback zu erstellen. Das Apps Script-Projekt für diese Lösung ist an die Tabelle angehängt.
    Kopie erstellen
  2. Klicken Sie auf Erweiterungen > Apps Script.
  3. Aktualisieren Sie die folgende Variable in der Scriptdatei mit Ihrem API-Schlüssel:
    const myApiKey = 'YOUR_API_KEY'; // Replace with your API key.
  4. Klicken Sie auf „Speichern“ Symbol „Speichern“.

Textdaten hinzufügen

  1. Kehren Sie zur Tabelle zurück.
  2. Fügen Sie den Spalten id und comments Textdaten hinzu. Sie können Beispielrezensionen für Ferienunterkünfte von Kaggle oder Ihre eigenen Daten verwenden. Sie können bei Bedarf weitere Spalten hinzufügen. Damit das Script jedoch ausgeführt werden kann, müssen die Spalten id und comments Daten enthalten.

Skript ausführen

  1. Klicken Sie oben in der Tabelle auf Sentiment-Tools > Entitäten und Sentiment markieren. Möglicherweise müssen Sie die Seite aktualisieren, damit dieses benutzerdefinierte Menü angezeigt wird.
  2. Autorisieren Sie das Script, wenn Sie dazu aufgefordert werden. Wenn auf dem OAuth-Zustimmungsbildschirm die Warnung Diese App ist nicht bestätigt angezeigt wird, wählen Sie Erweitert > Zu {Project Name} (unsicher) aus.

  3. Klicken Sie noch einmal auf Sentiment-Tools > Entitäten und Sentiment markieren.

  4. Wenn das Script abgeschlossen ist, wechseln Sie zum Tabellenblatt Pivot-Tabelle, um die Ergebnisse zu sehen.

Code ansehen

Wenn Sie den Apps Script-Code für diese Lösung ansehen möchten, klicken Sie unten auf Quellcode ansehen:

Quellcode ansehen

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);
};

Beitragende

Dieses Beispiel wird von Google mithilfe von Google Developer Experts verwaltet.

Nächste Schritte