Conéctate a una API: Analiza las opiniones

Nivel de programación: Intermedio
Duración: 20 minutos
Tipo de proyecto: Automatización con un menú personalizado

Objetivos

  • Comprender qué hace la solución
  • Comprender qué hacen los servicios de Apps Script dentro de la solución
  • Configura el entorno.
  • Configura la secuencia de comandos.
  • Ejecuta la secuencia de comandos.

Acerca de esta solución

Puedes analizar a gran escala los datos de texto, como los comentarios abiertos. Para realizar el análisis de entidades y opiniones desde Hojas de cálculo de Google, esta solución usa el servicio UrlFetch para conectarse a la API de Natural Language de Google Cloud.

diagrama de cómo funciona el análisis de opiniones

Cómo funciona

La secuencia de comandos recopila texto de la hoja de cálculo y se conecta a la API de Google Cloud Natural Language para analizar las entidades y las opiniones presentes en la cadena. Una tabla dinámica resume la puntuación de sentimiento promedio de cada entidad mencionada en todas las filas de datos de texto.

Servicios de Apps Script

En esta solución, se usan los siguientes servicios:

  • Servicio de hoja de cálculo: Envía los datos de texto a la API de Google Cloud Natural Language y marca cada fila como "Completa" una vez que se haya analizado su sentimiento.
  • Servicio UrlFetch: Se conecta a la API de Google Cloud Natural Language para realizar análisis de entidades y opiniones en el texto.

Requisitos previos

Para usar esta muestra, debes cumplir con los siguientes requisitos previos:

  • Una Cuenta de Google (es posible que las cuentas de Google Workspace requieran aprobación del administrador)
  • Un navegador web con acceso a Internet

  • Un proyecto de Google Cloud con una cuenta de facturación asociada. Consulta Habilita la facturación para un proyecto.

Configura tu entorno

Abre tu proyecto de Cloud en la consola de Google Cloud

Si aún no está abierto, abre el proyecto de Cloud que deseas usar para este ejemplo:

  1. En la consola de Google Cloud, ve a la página Seleccionar un proyecto.

    Selecciona un proyecto de Cloud

  2. Selecciona el proyecto de Google Cloud que deseas usar. También puedes hacer clic en Create project y seguir las instrucciones en pantalla. Si creas un proyecto de Google Cloud, es posible que debas activar la facturación del proyecto.

Activa la API de Google Cloud Natural Language

Esta solución se conecta a la API de Google Cloud Natural Language. Antes de usar las APIs de Google, debes activarlas en un proyecto de Google Cloud. Puedes activar una o más APIs en un solo proyecto de Google Cloud.

  • En tu proyecto de Cloud, activa la API de Google Cloud Natural Language.

    Activa la API

Esta solución requiere un proyecto de Cloud con una pantalla de consentimiento configurada. Configurar la pantalla de consentimiento de OAuth define lo que Google muestra a los usuarios y registra tu app para que puedas publicarla más adelante.

  1. En la consola de Google Cloud, ve a Menú > > Desarrollo de la marca.

    Ve a Desarrollo de la marca

  2. Si ya configuraste , puedes configurar la siguiente configuración de la pantalla de consentimiento de OAuth en Desarrollo de la marca, Público y Acceso a los datos. Si ves un mensaje que dice aún no se configuró, haz clic en Comenzar:
    1. En Información de la app, en Nombre de la app, ingresa un nombre para la app.
    2. En Correo electrónico de asistencia del usuario, elige una dirección de correo electrónico de asistencia para que los usuarios se comuniquen contigo si tienen preguntas sobre su consentimiento.
    3. Haz clic en Siguiente.
    4. En Público, selecciona Interno.
    5. Haz clic en Siguiente.
    6. En Información de contacto, ingresa una dirección de correo electrónico a la que se te puedan enviar notificaciones sobre cualquier cambio en tu proyecto.
    7. Haz clic en Siguiente.
    8. En Finalizar, revisa la Política de Datos del Usuario de los Servicios de las APIs de Google y, si estás de acuerdo, selecciona Acepto la Política de Datos del Usuario de los Servicios de las APIs de Google.
    9. Haz clic en Continuar.
    10. Haz clic en Crear.
  3. Por ahora, puedes omitir agregar permisos. En el futuro, cuando crees una app para usarla fuera de tu organización de Google Workspace, debes cambiar el Tipo de usuario a Externo. Luego, agrega los permisos de autorización que requiere tu app. Para obtener más información, consulta la guía completa Configura el consentimiento de OAuth.

Obtén una clave de API para la API de Google Cloud Natural Language

  1. Ve a la consola de Google Cloud. Asegúrate de que tu proyecto con facturación habilitada esté abierto.
  2. En la consola de Google Cloud, ve a Menú > APIs y servicios > Credenciales.

    Ir a Credenciales

  3. Haz clic en Crear credenciales > Clave de API.

  4. Toma nota de tu clave de API para usarla en un paso posterior.

Configura la secuencia de comandos

Crea el proyecto de Apps Script

  1. Haz clic en el siguiente botón para crear una copia de la hoja de cálculo de ejemplo de análisis de sentimiento para comentarios. El proyecto de Apps Script para esta solución está adjunto a la hoja de cálculo.
    Crear una copia
  2. Haz clic en Extensiones > Apps Script.
  3. Actualiza la siguiente variable en el archivo de secuencia de comandos con tu clave de API:
    const myApiKey = 'YOUR_API_KEY'; // Replace with your API key.
  4. Haz clic en Guardar Ícono de guardar.

Agrega datos de texto

  1. Regresa a la hoja de cálculo.
  2. Agrega datos de texto a las columnas id y comments. Puedes usar opiniones de propiedades de vacaciones de muestra de Kaggle o usar tus propios datos. Si es necesario, puedes agregar más columnas, pero para que se ejecute correctamente, la secuencia de comandos debe tener datos en las columnas id y comments.

Ejecuta la secuencia de comandos:

  1. En la parte superior de la hoja de cálculo, haz clic en Herramientas de sentimiento > Marcar entidades y sentimiento. Es posible que debas actualizar la página para que aparezca este menú personalizado.
  2. Cuando se te solicite, autoriza la secuencia de comandos. Si la pantalla de consentimiento de OAuth muestra la advertencia Esta app no está verificada, continúa seleccionando Avanzado > Ir a {nombre del proyecto} (no seguro).

  3. Vuelve a hacer clic en Herramientas de sentimiento > Marcar entidades y sentimiento.

  4. Cuando finalice la secuencia de comandos, cambia a la hoja Tabla dinámica para ver los resultados.

Revisa el código

Para revisar el código de Apps Script de esta solución, haz clic en Ver código fuente a continuación:

Ver el código fuente

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

Colaboradores

Google mantiene esta muestra con la ayuda de expertos en desarrollo de Google.

Próximos pasos