Se connecter à une API: analyser le sentiment des commentaires

Niveau de codage: intermédiaire
Durée: 20 minutes
Type de projet: automatisation avec un menu personnalisé

Objectifs

  • Comprendre ce que fait la solution.
  • Découvrez le rôle des services Apps Script dans la solution.
  • configurer votre environnement ;
  • Configurez le script.
  • Exécutez le script.

À propos de cette solution

Vous pouvez analyser des données textuelles, comme les commentaires ouverts, à grande échelle. Pour effectuer une analyse des entités et des sentiments à partir de Google Sheets, cette solution utilise le service URLFetch pour se connecter à l'API Google Cloud Natural Language.

schéma illustrant le fonctionnement de l'analyse des sentiments

Comment ça marche ?

Le script collecte le texte de la feuille de calcul et se connecte à l'API Google Cloud Natural Language pour analyser les entités et les sentiments présents dans la chaîne. Un tableau croisé dynamique récapitule le score de sentiment moyen pour chaque entité mentionnée sur toutes les lignes de données textuelles.

Services Apps Script

Cette solution utilise les services suivants:

  • Service Spreadsheet : envoie les données textuelles à l'API Google Cloud Natural Language et marque chaque ligne comme "Complete" (Terminée) une fois son sentiment analysé.
  • Service URLFetch : se connecte à l'API Google Cloud Natural Language pour effectuer une analyse des entités et des sentiments sur le texte.

Prérequis

Pour utiliser cet exemple, vous devez remplir les conditions préalables suivantes:

  • Un compte Google (les comptes Google Workspace peuvent nécessiter l'approbation d'un administrateur)
  • Un navigateur Web avec accès à Internet.

  • Un projet Google Cloud avec un compte de facturation associé Consultez la section Activer la facturation pour un projet.

Configurer votre environnement

Ouvrir votre projet Cloud dans la console Google Cloud

S'il n'est pas déjà ouvert, ouvrez le projet Cloud que vous souhaitez utiliser pour cet exemple:

  1. Dans la console Google Cloud, accédez à la page Sélectionner un projet.

    Sélectionner un projet Cloud

  2. Sélectionnez le projet Google Cloud que vous souhaitez utiliser. Vous pouvez également cliquer sur Créer un projet et suivre les instructions à l'écran. Si vous créez un projet Google Cloud, vous devrez peut-être activer la facturation pour ce projet.

Activer l'API Google Cloud Natural Language

Cette solution se connecte à l'API Google Cloud Natural Language. Avant d'utiliser les API Google, vous devez les activer dans un projet Google Cloud. Vous pouvez activer une ou plusieurs API dans un même projet Google Cloud.

  • Dans votre projet Cloud, activez l'API Google Cloud Natural Language.

    Activer l'API

Cette solution nécessite un projet Cloud avec un écran d'autorisation configuré. La configuration de l'écran de consentement OAuth permet de définir ce que Google présente aux utilisateurs et d'enregistrer votre application pour que vous puissiez la publier ultérieurement.

  1. Dans la console Google Cloud, accédez à Menu > API et services > Écran de consentement OAuth.

    Accéder à l'écran de consentement OAuth

  2. Pour Type d'utilisateur, sélectionnez Interne, puis cliquez sur Créer.
  3. Remplissez le formulaire d'enregistrement de l'application, puis cliquez sur Save and Continue (Enregistrer et continuer).
  4. Pour l'instant, vous pouvez ignorer l'ajout de champs d'application et cliquer sur Enregistrer et continuer. Par la suite, lorsque vous créerez une application destinée à être utilisée en dehors de votre organisation Google Workspace, vous devrez définir le type d'utilisateur sur Externe, puis ajouter les niveaux d'autorisation requis par votre application.

  5. Consultez le résumé d'enregistrement de votre application. Pour apporter des modifications, cliquez sur Modifier. Si l'enregistrement de l'application semble correct, cliquez sur Back to Dashboard (Revenir au tableau de bord).

Obtenir une clé API pour l'API Google Cloud Natural Language

  1. Accédez à Google Cloud Console. Assurez-vous que votre projet pour lequel la facturation est activée est ouvert.
  2. Dans la console Google Cloud, accédez à Menu > API et services > Identifiants.

    Accéder à "Identifiants"

  3. Cliquez sur Créer des identifiants > Clé API.

  4. Notez votre clé API, car vous en aurez besoin lors d'une prochaine étape.

Configurer le script

Créer le projet Apps Script

  1. Cliquez sur le bouton ci-dessous pour créer une copie de l'exemple de feuille de calcul Analyse des sentiments pour les commentaires. Le projet Apps Script correspondant à cette solution est joint à la feuille de calcul.
    Créer une copie
  2. Cliquez sur Extensions > Apps Script.
  3. Mettez à jour la variable suivante dans le fichier de script avec votre clé API :
    const myApiKey = 'YOUR_API_KEY'; // Replace with your API key.
  4. Cliquez sur Enregistrer Icône Enregistrer.

Ajouter des données textuelles

  1. Revenez à la feuille de calcul.
  2. Ajoutez des données textuelles aux colonnes id et comments. Vous pouvez utiliser des exemples d'avis sur des établissements de vacances provenant de Kaggle ou utiliser vos propres données. Vous pouvez ajouter d'autres colonnes si nécessaire, mais pour que le script s'exécute correctement, les colonnes id et comments doivent contenir des données.

Exécuter le script

  1. En haut de la feuille de calcul, cliquez sur Outils de sentiment > Marquer des entités et un sentiment. Vous devrez peut-être actualiser la page pour que ce menu personnalisé s'affiche.
  2. Lorsque vous y êtes invité, autorisez le script. Si l'écran de consentement OAuth affiche l'avertissement Cette application n'est pas validée, continuez en sélectionnant Paramètres avancés > Accéder à {Project Name} (non sécurisé).

  3. Cliquez sur Outils de sentiment > Marquer des entités et des sentiments à nouveau.

  4. Une fois le script terminé, passez à la feuille Tableau croisé dynamique pour voir les résultats.

Examiner le code

Pour examiner le code Apps Script de cette solution, cliquez sur Afficher le code source ci-dessous:

Afficher le code source

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

Contributeurs

Cet échantillon est géré par Google avec l'aide d'Experts Google Developers.

Étapes suivantes