Mit einer API verbinden: Feedback-Sentiment analysieren

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

Zielsetzungen

  • Verstehen Sie, was die Lösung leisten kann.
  • Was die Apps Script-Dienste innerhalb der Lösung leisten
  • die Umgebung einrichten
  • Richten Sie das Skript ein.
  • Führen Sie das Skript aus.

Informationen zu dieser Lösung

Sie können Textdaten wie offenes Feedback in großem Umfang analysieren. Zum Durchführen einer Entitäts- und Sentimentanalyse in Google Tabellen verwendet diese Lösung den UrlFetch-Dienst, um eine Verbindung zur Google Cloud Natural Language API herzustellen.

Diagramm zur Funktionsweise der Sentimentanalyse

Funktionsweise

Das Skript erfasst Text aus der Tabelle und stellt eine Verbindung zur Google Cloud Natural Language API her, um die Entitäten und die Stimmung im String zu analysieren. Eine Pivot-Tabelle fasst den durchschnittlichen Sentimentwert für jede erwähnte Entität in allen Zeilen von Textdaten zusammen.

Apps Script-Dienste

Diese Lösung verwendet die folgenden Dienste:

  • Tabellendienst: Sendet die Textdaten an die Google Cloud Natural Language API und markiert jede Zeile als "Abgeschlossen", nachdem die Stimmung analysiert wurde.
  • UrlFetch-Dienst: Stellt eine Verbindung zur Google Cloud Natural Language API her, um Entitäts- und Sentimentanalysen des Texts durchzuführen.

Voraussetzungen

Sie benötigen die folgenden Voraussetzungen, um dieses Beispiel verwenden zu können:

  • Ein Google-Konto (Google Workspace-Konten erfordern möglicherweise die Administratorgenehmigung).
  • Ein Webbrowser mit Zugang zum Internet.

  • 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

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

  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. Oder klicken Sie auf Projekt erstellen und folgen Sie der Anleitung auf dem Bildschirm. 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

Diese Lösung erfordert ein Cloud-Projekt mit einem konfigurierten Zustimmungsbildschirm. Wenn Sie den OAuth-Zustimmungsbildschirm konfigurieren, legen Sie fest, was Google den Nutzern anzeigt, und registrieren Ihre Anwendung, damit Sie sie später veröffentlichen können.

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

    Zum OAuth-Zustimmungsbildschirm

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

  5. Prüfen Sie die Zusammenfassung der App-Registrierung. Wenn Sie Änderungen vornehmen möchten, klicken Sie auf Bearbeiten. Wenn die Anwendungsregistrierung in Ordnung 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 mit aktivierter Abrechnung muss geöffnet sein.
  2. Klicken Sie in der Google Cloud Console auf das Dreistrich-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. Sie benötigen ihn in einem späteren Schritt.

Skript 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 Skriptdatei 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 Tabellenkalkulation zurück.
  2. Fügen Sie den Spalten id und comments Textdaten hinzu. Sie können Beispielüberprüfungen von Ferienunterkünften von Kaggle oder Ihre eigenen Daten verwenden. Sie können bei Bedarf weitere Spalten hinzufügen. Damit das Skript jedoch erfolgreich ausgeführt werden kann, müssen die Spalten id und comments Daten enthalten.

Skript ausführen

  1. Klicken Sie oben in der Tabelle auf Sentimenttools > Entitäten und Sentiment markieren. Möglicherweise müssen Sie die Seite aktualisieren, damit dieses benutzerdefinierte Menü angezeigt wird.
  2. Autorisieren Sie das Skript, wenn Sie dazu aufgefordert werden. Wenn auf dem OAuth-Zustimmungsbildschirm die Warnung Diese Anwendung wurde nicht überprüft angezeigt wird, wählen Sie Erweitert > Zu {Projektname} (unsicher) aus.

  3. Klicken Sie auf Sentimenttools > Entitäten und Stimmung markieren.

  4. Wenn das Skript fertig 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 sehen 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 mit Unterstützung von Google Developers-Experten verwaltet.

Nächste Schritte