Connettiti a un'API: analizza il sentiment del feedback

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

Obiettivi

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

Informazioni su questa soluzione

Puoi analizzare su larga scala i dati di testo, ad esempio il feedback a risposta aperta. Per eseguire l'analisi di entità e sentiment da Fogli Google, questa soluzione utilizza UrlFetch Service 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 del sentiment medio per ogni entità menzionata in tutte le righe dei dati di testo.

Servizi Apps Script

Questa soluzione utilizza i seguenti servizi:

  • Servizio di foglio di lavoro: invia i dati di testo all'API Natural Language di Google Cloud e contrassegna ogni riga come "Completa" dopo aver analizzato il suo sentiment.
  • Servizio UrlFetch: si connette all'API Google Cloud Natural Language per eseguire analisi di entità e sentiment sul testo.

Prerequisiti

Per utilizzare questo esempio, sono necessari i 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 con un account di fatturazione associato. Fai riferimento all'articolo Attivare la fatturazione per un progetto.

Configura l'ambiente

Aprire 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.

Attiva l'API Google Cloud Natural Language

Questa soluzione si connette all'API Google Cloud Natural Language. Prima di utilizzare le API 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 approvazione configurata. La configurazione della schermata per il consenso OAuth definisce ciò che Google mostra agli utenti e registra la tua app in modo da poterla pubblicare in un secondo momento.

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

    Vai alla schermata per il consenso OAuth

  2. In Tipo di utente, seleziona Interno e poi fai clic su Crea.
  3. Completa il modulo di registrazione dell'app, quindi 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 crei un'app da utilizzare al di fuori della tua organizzazione Google Workspace, devi modificare il Tipo di utente in Esterno, quindi 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 sembra corretta, fai clic su Torna alla dashboard.

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

  1. Vai alla console Google Cloud. Assicurati che il progetto con la fatturazione abilitata 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 chiave API da utilizzare in un passaggio successivo.

Configurare lo script

Crea il progetto Apps Script

  1. Fai clic sul pulsante qui sotto per creare una copia del foglio di lavoro di esempio sull'analisi del sentiment per i 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 dello script con la tua chiave API:
    const myApiKey = 'YOUR_API_KEY'; // Replace with your API key.
  4. Fai clic su Salva Icona Salva.

Aggiungere dati di testo

  1. Torna al foglio di lavoro.
  2. Aggiungi i dati di testo alle colonne id e comments. Puoi utilizzare recensioni di case vacanze di esempio di Kaggle o utilizzare i tuoi dati. Se necessario, puoi aggiungere altre colonne, ma per essere eseguito correttamente lo script deve contenere dati nelle colonne id e comments.

Esegui lo script

  1. Nella parte superiore del foglio di lavoro, fai clic su Strumenti per il rilevamento del sentiment > 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 {Project Name} (non sicuro).

  3. Fai di nuovo clic su Strumenti per il rilevamento del sentiment > Contrassegna entità e sentiment.

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

Esamina il codice

Per esaminare il codice di Apps Script per 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 Sample è gestito da Google con l'aiuto degli esperti Google Developer.

Passaggi successivi