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

  • Comprende qué hace la solución.
  • Comprende 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 datos de texto, como comentarios abiertos, a gran escala. Para realizar 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 Natural Language de Google Cloud para analizar las entidades y las opiniones presentes en la cadena. En una tabla dinámica, se resume la puntuación de opinión promedio para 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 hojas de cálculo: Envía los datos de texto a la API de Google Cloud Natural Language y marca cada fila como "Completada" una vez que se analiza su opinión.
  • Servicio de UrlFetch: Se conecta a la API de Google Cloud Natural Language para realizar análisis de entidades y opiniones sobre el texto.

Requisitos previos

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

  • Una Cuenta de Google (es posible que las cuentas de Google Workspace requieran la 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 esta muestra:

  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. O bien, haz clic en Crear proyecto y sigue las instrucciones en pantalla. Si creas un proyecto de Google Cloud, es posible que debas activar la facturación para el 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ú > Google Auth platform > Branding.

    Ir a Desarrollo de la marca

  2. Si ya configuraste Google Auth platform, puedes configurar los siguientes parámetros de configuración de la pantalla de consentimiento de OAuth en Branding, Audience y Data Access. Si ves un mensaje que dice Google Auth platform 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 a la que los usuarios puedan comunicarse 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 en la que puedas recibir 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 la aceptas, 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 el momento, puedes omitir la adición de permisos. En el futuro, cuando crees una app para usarla fuera de tu organización de Google Workspace, deberás 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 habilitado para la facturación 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 muestra Análisis de sentimiento para comentarios. El proyecto de Apps Script para esta solución se adjunta 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 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 muestras de opiniones sobre propiedades de alquiler vacacional de Kaggle o tus propios datos. Puedes agregar más columnas si es necesario, 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 análisis de opiniones > Marcar entidades y opiniones. 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, selecciona Opciones avanzadas > Ir a {Nombre del proyecto} (no seguro) para continuar.

  3. Haz clic en Sentiment Tools > Mark entities and sentiment de nuevo.

  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 los Google Developer Experts.

Próximos pasos