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 vai trò của giải pháp.
  • 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 trên quy mô lớn, chẳng hạn như ý kiến phản hồi mở. Để phân tích thực thể và ý kiến 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 bản phân tích quan điểm

Cách hoạt động

Tập lệnh 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à tình cảm có trong chuỗi. Bảng tổng hợp tóm tắt điểm ý kiến 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 Google Cloud Natural Language API và đánh dấu từng hàng là "Hoàn thành" sau khi phân tích ý kiến.
  • 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à quan điểm 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ác tài khoản Google Workspace có thể yêu cầu quản trị viên phê duyệt).
  • Một trình duyệt web có quyền truy cập vào Internet.

  • Một dự án trên Google Cloud có liên kết với một tài khoản thanh toán. Hãy tham khảo bài viết Bật tính năng thanh toán cho dự án.

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

Mở dự án Cloud trong bảng điều khiển Google Cloud

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

  1. Trong bảng điều khiển Google Cloud, hãy chuyển đến trang Chọn dự án.

    Chọn một dự án trên Google Cloud

  2. Chọn dự án trê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 một 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 Google Cloud Natural Language API. Trước khi sử dụng các API của Google, bạn cần bật những API đó trong một dự án trên Google Cloud. Bạn có thể bật một hoặc nhiều API trong một dự án trên Google Cloud.

  • Trong dự án Cloud của bạn, hãy bật Google Cloud Natural Language API.

    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 xin phép đã đị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 sau.

  1. Trong bảng điều khiển Google Cloud, hãy chuyển đến Trình đơn > API và dịch vụ > màn hình đồng ý OAuth.

    Chuyển đến màn hình xin phép bằng OAuth

  2. Đối với Loại người dùng, hãy chọn Nội bộ, rồi nhấp vào Tạo.
  3. Hoàn tất biểu mẫu đăng ký ứng dụng, sau đó nhấp vào Lưu và tiếp tục.
  4. Hiện tại, bạn có thể bỏ qua bước thêm phạm vi và nhấp vào Lưu và tiếp tục. Sau này, khi tạo một ứng dụng để dùng bên ngoài tổ chức Google Workspace của mình, bạn phải thay đổi Loại người dùng thành Bên ngoài, sau đó thêm phạm vi uỷ quyền mà ứng dụng của bạn yêu cầu.

  5. Xem lại tóm tắt đăng ký ứng dụng của bạn. Để chỉnh sửa, hãy nhấp vào Chỉnh sửa. Nếu quá trình đăng ký ứng dụng có vẻ ổn, hãy nhấp vào Back to Dashboard (Quay lại Trang tổng quan).

Nhận khoá API cho Google Cloud Natural Language API

  1. Chuyển đến bảng điều khiển Google Cloud. Đảm bảo dự án có hỗ trợ thanh toán của bạn đang mở.
  2. Trong bảng điều khiển Google Cloud, 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 của bạn để sử dụng trong bước sau.

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 ý kiến cho 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 đây trong tệp tập lệnh bằng khoá API:
    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 idnhận xét. Bạn có thể sử dụng các bài đánh giá mẫu về cơ sở lưu trú kỳ nghỉ trên Kaggle hoặc sử dụng dữ liệu của riêng mình. Bạn có thể thêm nhiều cột hơn 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 id (mã nhận dạng) và comments (nhận xét).

Chạy tập lệnh

  1. Ở đầu bảng tính, hãy nhấp vào Công cụ gửi ý kiến > Đánh dấu đối tượng và ý kiến. Bạn có thể cần phải 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. Nếu màn hình xin phép bằ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 {Tên dự án} (không an toàn).

  3. Nhấp vào Công cụ gửi ý kiến > Đá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 Bảng tổng hợp để xem kết quả.

Xem lại đoạn mã

Để xem lại mã Apps Script cho giải pháp này, hãy nhấp vào phần 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 được Google duy trì với sự trợ giúp của các chuyên gia nhà phát triển của Google.

Các bước tiếp theo