Kết nối với API: Phân tích ý kiến phản hồi

Cấp độ lập trình: Trung cấp
Thời lượng: 20 phút
Loại dự án: Tự động hoá bằng trình đơn tuỳ chỉnh

Mục tiêu

  • Tìm hiểu chức năng của giải pháp.
  • Tìm hiểu chức năng của các dịch vụ Apps Script trong giải pháp.
  • Thiết lập môi trường.
  • Thiết lập tập lệnh.
  • Chạy tập lệnh.

Giới thiệu về giải pháp này

Bạn có thể phân tích dữ liệu văn bản (chẳng hạn như ý kiến phản hồi không giới hạn) trên quy mô lớn. Để thực hiện phân tích thực thể và cảm xúc trong Google Trang tính, giải pháp này sử dụng Dịch vụ UrlFetch để kết nối với API Ngôn ngữ tự nhiên của Google Cloud.

sơ đồ về cách hoạt động của tính năng phân tích cảm xúc

Cách hoạt động

Tập lệnh này thu thập văn bản từ bảng tính và kết nối với API Ngôn ngữ tự nhiên của Google Cloud để phân tích các thực thể và cảm xúc có trong chuỗi. Bảng tổng hợp tóm tắt điểm số cảm xúc trung bình cho từng thực thể được đề cập trên tất cả các hàng dữ liệu văn bản.

Dịch vụ Apps Script

Giải pháp này sử dụng các dịch vụ sau:

  • Dịch vụ bảng tính – Gửi dữ liệu văn bản đến API Ngôn ngữ tự nhiên của Google Cloud và đánh dấu từng hàng là "Đã hoàn tất" sau khi phân tích cảm xúc.
  • Dịch vụ UrlFetch – Kết nối với API Ngôn ngữ tự nhiên của Google Cloud để phân tích thực thể và cảm xúc trên văn bản.

Điều kiện tiên quyết

Để sử dụng mẫu này, bạn cần có các điều kiện tiên quyết sau:

  • Tài khoản Google (có thể cần có sự phê duyệt của quản trị viên đối với tài khoản Google Workspace).
  • Một trình duyệt web có quyền truy cập Internet.

  • Một dự án Google Cloud có tài khoản thanh toán được liên kết. Tham khảo bài viết Bật tính năng thanh toán cho một dự án.

Thiết lập môi trường

Mở dự án trên Google Cloud trong Google Cloud Console

Nếu chưa mở, hãy mở dự án trên Google Cloud mà bạn dự định sử dụng cho mẫu này:

  1. Trong Google Cloud Console, hãy chuyển đến trang Chọn một dự án.

    Chọn một dự án trên Đám mây

  2. Chọn dự án Google Cloud mà bạn muốn sử dụng. Hoặc nhấp vào Tạo dự án rồi làm theo hướng dẫn trên màn hình. Nếu tạo dự án trên Google Cloud, bạn có thể cần phải bật tính năng thanh toán cho dự án đó.

Bật Google Cloud Natural Language API

Giải pháp này kết nối với API Ngôn ngữ tự nhiên của Google Cloud. Trước khi sử dụng API của Google, bạn cần bật các API đó trong một dự án Google Cloud. Bạn có thể bật một hoặc nhiều API trong một dự án Google Cloud.

  • Trong dự án trên Google Cloud, hãy bật API Ngôn ngữ tự nhiên của Google Cloud.

    Bật API

Giải pháp này yêu cầu một dự án trên Google Cloud có màn hình đồng ý được định cấu hình. Việc định cấu hình màn hình xin phép bằng OAuth sẽ xác định nội dung mà Google hiển thị cho người dùng và đăng ký ứng dụng của bạn để bạn có thể phát hành ứng dụng đó sau.

  1. Trong Google Cloud Console, hãy chuyển đến Trình đơn > > Tạo thương hiệu.

    Chuyển đến phần Thương hiệu

  2. Nếu đã định cấu hình , bạn có thể định cấu hình các chế độ cài đặt sau đây cho Màn hình đồng ý OAuth trong phần Gắn thương hiệu, Đối tượngQuyền truy cập dữ liệu. Nếu bạn thấy thông báo chưa được định cấu hình, hãy nhấp vào Bắt đầu:
    1. Trong phần Thông tin ứng dụng, trong mục Tên ứng dụng, hãy nhập tên cho ứng dụng.
    2. Trong phần Email hỗ trợ người dùng, hãy chọn địa chỉ email hỗ trợ mà người dùng có thể liên hệ với bạn nếu họ có câu hỏi về sự đồng ý của họ.
    3. Nhấp vào Tiếp theo.
    4. Trong phần Đối tượng người xem, hãy chọn Nội bộ.
    5. Nhấp vào Tiếp theo.
    6. Trong phần Thông tin liên hệ, hãy nhập Địa chỉ email để bạn có thể nhận thông báo về mọi thay đổi đối với dự án của mình.
    7. Nhấp vào Tiếp theo.
    8. Trong phần Hoàn tất, hãy xem lại Chính sách dữ liệu người dùng của Dịch vụ API của Google. Nếu bạn đồng ý, hãy chọn Tôi đồng ý với Chính sách dữ liệu người dùng của Dịch vụ API của Google.
    9. Nhấp vào Tiếp tục.
    10. Nhấp vào Tạo.
  3. Hiện tại, bạn có thể bỏ qua bước thêm phạm vi. Sau này, khi tạo một ứng dụng để sử dụng bên ngoài tổ chức Google Workspace, bạn phải thay đổi Loại người dùng thành Bên ngoài. Sau đó, thêm các phạm vi uỷ quyền mà ứng dụng của bạn yêu cầu. Để tìm hiểu thêm, hãy xem hướng dẫn đầy đủ về cách Định cấu hình sự đồng ý OAuth.

Lấy khoá API cho Google Cloud Natural Language API

  1. Truy cập vào Bảng điều khiển Google Cloud. Đảm bảo dự án đã bật tính năng thanh toán đang mở.
  2. Trong Google Cloud Console, hãy chuyển đến Trình đơn > API và dịch vụ > Thông tin xác thực.

    Chuyển đến phần Thông tin xác thực

  3. Nhấp vào Tạo thông tin xác thực > Khoá API.

  4. Ghi lại khoá API để sử dụng trong bước tiếp theo.

Thiết lập tập lệnh

Tạo dự án Apps Script

  1. Nhấp vào nút bên dưới để tạo bản sao của bảng tính mẫu Phân tích cảm xúc cho ý kiến phản hồi. Dự án Apps Script cho giải pháp này được đính kèm vào bảng tính.
    Tạo bản sao
  2. Nhấp vào Tiện ích > Apps Script.
  3. Cập nhật biến sau trong tệp tập lệnh bằng khoá API của bạn:
    const myApiKey = 'YOUR_API_KEY'; // Replace with your API key.
  4. Nhấp vào biểu tượng Lưu Biểu tượng Lưu.

Thêm dữ liệu văn bản

  1. Quay lại bảng tính.
  2. Thêm dữ liệu văn bản vào cột idcomments. Bạn có thể sử dụng các bài đánh giá mẫu về cơ sở lưu trú du lịch từ Kaggle hoặc sử dụng dữ liệu của riêng mình. Bạn có thể thêm cột khác nếu cần, nhưng để chạy thành công, tập lệnh phải có dữ liệu trong cột idcomments.

Chạy tập lệnh

  1. Ở đầu bảng tính, hãy nhấp vào Công cụ đo lường cảm xúc > Đánh dấu thực thể và cảm xúc. Bạn có thể cần làm mới trang để trình đơn tuỳ chỉnh này xuất hiện.
  2. Khi được nhắc, hãy cho phép tập lệnh chạy. Nếu màn hình đồng ý OAuth hiển thị cảnh báo Ứng dụng này chưa được xác minh, hãy tiếp tục bằng cách chọn Nâng cao > Chuyển đến {Project Name} (không an toàn).

  3. Nhấp vào Công cụ cảm xúc > Đánh dấu thực thể và cảm xúc một lần nữa.

  4. Khi tập lệnh hoàn tất, hãy chuyển sang trang tính Pivot Table (Bảng tổng hợp) để xem kết quả.

Xem lại mã

Để xem xét mã Apps Script cho giải pháp này, hãy nhấp vào Xem mã nguồn bên dưới:

Xem mã nguồn

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

Người đóng góp

Mẫu này do Google duy trì với sự trợ giúp của Chuyên gia phát triển của Google.

Các bước tiếp theo