Connettiti a un'API: analizza il sentiment del feedback

Livello di programmazione: intermedio
Durata: 20 minuti
Tipo di progetto: automazione con un menu personalizzato

Obiettivi

  • Scopri cosa fa la soluzione.
  • Scopri cosa fanno i servizi Apps Script all'interno di questa soluzione.
  • Configurare l'ambiente.
  • Configura lo script.
  • Esegui lo script.

Informazioni su questa soluzione

Puoi analizzare i dati di testo, come i feedback a risposta aperta, su larga scala. Per eseguire l'analisi delle entità e del sentiment dall'interno di Fogli Google, questa soluzione utilizza il servizio UrlFetch per connettersi all'API Google Cloud Natural Language.

diagramma di come funziona l'analisi del sentiment

Come funziona

Lo script raccoglie il testo dal foglio di lavoro e si connette all'API Google Cloud Natural Language per analizzare le entità e il sentiment presenti nella stringa. Una tabella pivot riassume il punteggio di sentiment medio per ogni entità menzionata in tutte le righe di dati di testo.

Servizi Apps Script

Questa soluzione utilizza i seguenti servizi:

  • Servizio fogli di lavoro: invia i dati di testo all'API Google Cloud Natural Language e contrassegna ogni riga come "Completata" dopo che il relativo sentiment è stato analizzato.
  • Servizio UrlFetch: si connette all'API Google Cloud Natural Language per eseguire analisi delle entità e del sentiment sul testo.

Prerequisiti

Per utilizzare questo esempio, devi disporre dei seguenti prerequisiti:

  • Un Account Google (gli account Google Workspace potrebbero richiedere l'approvazione dell'amministratore).
  • Un browser web con accesso a internet.

  • Un progetto Google Cloud a cui è associato un account di fatturazione. Consulta l'articolo Abilitare la fatturazione per un progetto.

configura l'ambiente

Apri il progetto Cloud nella console Google Cloud

Se non è già aperto, apri il progetto Cloud che intendi utilizzare per questo esempio:

  1. Nella console Google Cloud, vai alla pagina Seleziona un progetto.

    Seleziona un progetto Cloud

  2. Seleziona il progetto Google Cloud che vuoi utilizzare. In alternativa, fai clic su Crea progetto e segui le istruzioni sullo schermo. Se crei un progetto Google Cloud, potresti dover attivare la fatturazione per il progetto.

Attivare l'API Google Cloud Natural Language

Questa soluzione si connette all'API Google Cloud Natural Language. Prima di utilizzare le API di Google, devi attivarle in un progetto Google Cloud. Puoi attivare una o più API in un singolo progetto Google Cloud.

  • Nel tuo progetto Cloud, attiva l'API Google Cloud Natural Language.

    Attiva l'API

Questa soluzione richiede un progetto Cloud con una schermata di consenso configurata. La configurazione della schermata per il consenso OAuth definisce ciò che Google mostra agli utenti e registra la tua app in modo che tu possa pubblicarla in un secondo momento.

  1. Nella console Google Cloud, vai a Menu > API e servizi > Schermata consenso OAuth.

    Vai alla schermata per il consenso OAuth

  2. In Tipo di utente, seleziona Interno e poi fai clic su Crea.
  3. Compila il modulo di registrazione dell'app, poi fai clic su Salva e continua.
  4. Per il momento, puoi saltare l'aggiunta di ambiti e fare clic su Salva e continua. In futuro, quando creerai un'app da utilizzare al di fuori della tua organizzazione Google Workspace, dovrai cambiare Tipo di utente in Esterno e poi aggiungere gli ambiti di autorizzazione richiesti dalla tua app.

  5. Rivedi il riepilogo della registrazione dell'app. Per apportare modifiche, fai clic su Modifica. Se la registrazione dell'app è corretta, fai clic su Torna alla dashboard.

Ottenere una chiave API per l'API Google Cloud Natural Language

  1. Vai alla console Google Cloud. Assicurati che il progetto abilitato per la fatturazione sia aperto.
  2. Nella console Google Cloud, vai a Menu > API e servizi > Credenziali.

    Vai a Credenziali

  3. Fai clic su Crea credenziali > Chiave API.

  4. Prendi nota della tua chiave API per utilizzarla in un passaggio successivo.

Configura lo script

Crea il progetto Apps Script

  1. Fai clic sul pulsante di seguito per creare una copia del foglio di lavoro di esempio Analisi del sentiment per il feedback. Il progetto Apps Script per questa soluzione è allegato al foglio di lavoro.
    Crea una copia
  2. Fai clic su Estensioni > Apps Script.
  3. Aggiorna la seguente variabile nel file di script con la tua chiave API:
    const myApiKey = 'YOUR_API_KEY'; // Replace with your API key.
  4. Fai clic su Salva Icona Salva.

Aggiungi dati di testo

  1. Torna al foglio di lavoro.
  2. Aggiungere dati di testo alle colonne id e commenti. Puoi utilizzare esempi di recensioni di case vacanze fornite da Kaggle o usare i tuoi dati. Puoi aggiungere altre colonne se necessario, ma per una corretta esecuzione lo script deve contenere dati nelle colonne id e commenti.

Esegui lo script

  1. Nella parte superiore del foglio di lavoro, fai clic su Sentiment Tools > Contrassegna entità e sentiment. Per visualizzare questo menu personalizzato, potrebbe essere necessario aggiornare la pagina.
  2. Quando richiesto, autorizza lo script. Se nella schermata per il consenso OAuth viene visualizzato l'avviso Questa app non è verificata, continua selezionando Avanzate > Vai a {Nome progetto} (non sicuro).

  3. Fai clic su Sentiment Tools > Contrassegna entità e sentiment di nuovo.

  4. Al termine dello script, passa al foglio Tabella pivot per vedere i risultati.

Rivedi il codice

Per esaminare il codice Apps Script di questa soluzione, fai clic su Visualizza codice sorgente di seguito:

Visualizza codice sorgente

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

Collaboratori

Questo campione è gestito da Google con l'aiuto degli Esperti Google Developers.

Passaggi successivi