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 Google Cloud Natural Language API để 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 trung bình về cảm xúc 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.

Các dịch vụ của 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 tất" sau khi phân tích cảm xúc.
  • Dịch vụ UrlFetch – Kết nối với Google Cloud Natural Language API để thực hiện 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 đáp ứng các điều kiện tiên quyết sau:

  • Một Tài khoản Google (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ó 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 Cloud trong Google Cloud Console

Nếu chưa mở, hãy mở dự án trên Cloud mà bạn dự định 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 trong 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 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 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 Cloud, 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 Cloud có màn hình đồng ý đã được định cấu hình. Việc định cấu hình màn hình đồng ý OAuth sẽ xác định những gì Google hiển thị cho người dùng và đăng ký ứng dụng của bạn để sau này bạn có thể xuất bản ứng dụng.

  1. Trong bảng điều khiển Google Cloud, hãy chuyển đến phần Trình đơn > Google Auth platform > Thương hiệu.

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

  2. Nếu đã định cấu hình Google Auth platform, 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 Thương hiệu, Đối tượngQuyền truy cập vào dữ liệu. Nếu bạn thấy thông báo Google Auth platform chưa được định cấu hình, hãy nhấp vào Bắt đầu:
    1. Trong phần Thông tin về ứng dụng, hãy nhập tên cho ứng dụng trong mục Tên ứng dụng.
    2. Trong phần Email hỗ trợ người dùng, hãy chọn một địa chỉ email hỗ trợ mà người dùng có thể liên hệ với bạn nếu họ có thắc mắc về sự đồng ý của mình.
    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 kỹ 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. Trong tương lai, 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 đó, hãy 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 ý của OAuth.

Lấy 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ó bật tính năng thanh toán của bạn đang mở.
  2. Trong Google Cloud Console, hãy chuyển đến phần Trình đơn > API và dịch vụ > Thông tin xác thực.

    Chuyển đến phần Thông tin đăng nhập

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

  4. Hãy 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 tình cảm đối với ý 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 đây trong tệp kịch bản 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ác cột idcomments. Bạn có thể sử dụng các bài đánh giá mẫu về nhà/căn hộ du lịch trên Kaggle hoặc sử dụng dữ liệu của riêng bạn. 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ác cột idcomments.

Chạy tập lệnh

  1. Ở đầu bảng tính, hãy nhấp vào Công cụ phân tích tình cảm > Đánh dấu thực thể và tình cảm. 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 Tuỳ chọn nâng cao > Truy cập vào {Tên dự án} (không an toàn).

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

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

Xem lại mã

Để xem lại 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 các Chuyên gia Google về phát triển.

Các bước tiếp theo