Phân tích cảm xúc trong ý kiến phản hồi bằng Google Cloud Natural Language API

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. Để 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 Google Cloud Natural Language API.

hình minh hoạ 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 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 tính có trong chuỗi. Bảng tổng hợp dữ liệu cho thấy điểm ý kiến trung bình cho từng đối tượng đượ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ụ Trang tính: Gửi dữ liệu văn bản đến Cloud Natural Language API và đánh dấu từng hàng là "Hoàn tất" sau khi phân tích ý kiến.
  • 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à phân tích 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:

  • 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).
  • Trình duyệt web có quyền truy cập vào Internet.

  • Dự án trên đám mây của Google Cloud có tài khoản thanh toán được liên kết. Hãy 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

Để sử dụng giải pháp này, hãy hoàn tất các bước thiết lập sau.

Mở dự án trên đám mây trong bảng điều khiển Cloud

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

  1. Trong bảng điều khiển Cloud, hãy chuyển đến trang Select a project (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 Create project (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 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 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 trên đám mây, 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 đám mây có màn hình xin phép đã đượ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 những gì Google hiển thị cho người dùng và đăng ký ứng dụng của bạn để bạn có thể xuất bản ứng dụng đó sau này.

  1. Trong Google API Console, hãy chuyển đến trình đơn Menu > Google Auth platform > Branding.

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

  2. Nếu đã định cấu hình Nền tảng xác thực của Google, bạn có thể định cấu hình các chế độ cài đặt sau đây cho Màn hình xin phép bằng OAuth trong phầ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 cho biết Google Auth platform not configured yet (Nền tảng xác thực của Google chưa được định cấu hình), hãy nhấp vào Get Started (Bắt đầu):
    1. Trong phần App Information (Thông tin ứng dụng), ở mục App name (Tên ứng dụng), hãy nhập tên cho ứng dụng.
    2. Trong User support email (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 có thắc mắc về việc xin phép.
    3. Nhấp vào Next (Tiếp theo).
    4. Trong phần Đối tượng, hãy chọn Nội bộ.
    5. Nhấp vào Next (Tiếp theo).
    6. Trong phần Contact Information (Thông tin liên hệ), hãy nhập Email address (Đị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 Next (Tiếp theo).
    8. Trong phần Finish (Hoàn tất), hãy xem lại Chính sách dữ liệu người dùng của các dịch vụ API của Google. Nếu đồng ý, hãy chọn I agree to the Google API Services: User Data Policy (Tôi đồng ý với Chính sách dữ liệu người dùng của các dịch vụ API của Google).
    9. Nhấp vào Continue (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 màn hình xin phép bằng OAuth.

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

  1. Chuyển đến Google API Console. Đảm bảo dự án đã bật tính năng thanh toán đang mở.
  2. Trong Google API Console, hãy chuyển đến trình đơn Menu > APIs & Services > Credentials (Thông tin xác thực).

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

  3. Nhấp vào Create credentials > API key (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

Hãy hoàn tất các bước sau để thiết lập tập lệnh.

Tạo dự án Apps Script

  1. Nhấp vào nút sau để tạo bản sao của bảng tính mẫu Sentiment analysis for feedback (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ới bảng tính.

    Tạo bản sao

  2. Nhấp vào Extensions (Tiện ích mở rộng) > Apps Script.

  3. Cập nhật biến sau 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 Nút Lưu dự án trong trình chỉnh sửa.

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 (nhận xét). Bạn có thể sử dụng các bài đánh giá mẫu về cơ sở lưu trú cho 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ác cột idcomments (nhận xét).

Chạy tập lệnh

  1. Ở đầu bảng tính, hãy nhấp vào Sentiment Tools > Mark entities and sentiment. 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. <<../_snippets/oauth.md>>
  3. Nhấp lại vào Sentiment Tools > Mark entities and sentiment.
  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 dữ liệu) để 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 View source code:

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.
const 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
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const dataSheet = ss.getSheetByName("Review Data");
  const rows = dataSheet.getDataRange();
  const numRows = rows.getNumRows();
  const values = rows.getValues();
  const 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.
  const entitySheet = ss.getSheetByName("Entity Sentiment Data");
  if (entitySheet == null) {
    ss.insertSheet("Entity Sentiment Data");
    const entitySheet = ss.getSheetByName("Entity Sentiment Data");
    const esHeaderRange = entitySheet.getRange(1, 1, 1, 6);
    const 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.
  const textColumnIdx = headerRow.indexOf(COLUMN_NAME.COMMENTS);
  const entityColumnIdx = headerRow.indexOf(COLUMN_NAME.ENTITY);
  const 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) {
    const value = values[i];
    const commentEnCellVal = value[textColumnIdx];
    const entityCellVal = value[entityColumnIdx];
    const reviewId = value[idColumnIdx];

    // Calls retrieveEntitySentiment function for each row that has a comment
    // and also an empty entity_sentiment cell value.
    if (commentEnCellVal && !entityCellVal) {
      const nlData = retrieveEntitySentiment(commentEnCellVal);
      // Pastes each entity and sentiment score into Entity Sentiment Data sheet.
      const newValues = [];
      for (let entity in nlData.entities) {
        entity = nlData.entities[entity];
        const 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) {
  const apiKey = myApiKey;
  const apiEndpoint = `https://language.googleapis.com/v1/documents:analyzeEntitySentiment?key=${apiKey}`;
  // Creates a JSON request, with text string, language, type and encoding
  const 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.
  const nlOptions = {
    method: "post",
    contentType: "application/json",
    payload: JSON.stringify(nlData),
  };
  // Makes the API call.
  const 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 Google Developer Experts.

Các bước tiếp theo