احساسات بازخورد را با استفاده از Google Cloud Natural Language API تجزیه و تحلیل کنید

سطح کدنویسی : متوسط
مدت زمان : ۲۰ دقیقه
نوع پروژه : اتوماسیون با منوی سفارشی

اهداف

  • بفهمید که راه حل چه کاری انجام می‌دهد.
  • درک کنید که سرویس‌های Apps Script در این راهکار چه کاری انجام می‌دهند.
  • محیط خود را تنظیم کنید.
  • اسکریپت را تنظیم کنید.
  • اسکریپت را اجرا کنید.

درباره این راهکار

شما می‌توانید داده‌های متنی، مانند بازخوردهای باز، را در مقیاس بزرگ تجزیه و تحلیل کنید. برای انجام تجزیه و تحلیل موجودیت و احساسات از درون Google Sheets، این راهکار از سرویس UrlFetch برای اتصال به API زبان طبیعی Google Cloud استفاده می‌کند.

نمودار نحوه عملکرد تحلیل احساسات

چگونه کار می‌کند؟

این اسکریپت متن را از صفحه گسترده جمع‌آوری می‌کند و به API زبان طبیعی گوگل کلود متصل می‌شود تا موجودیت‌ها و احساسات موجود در رشته را تجزیه و تحلیل کند. یک جدول محوری، میانگین امتیاز احساسات را برای هر موجودیت ذکر شده در تمام ردیف‌های داده‌های متنی خلاصه می‌کند.

سرویس‌های اسکریپت برنامه‌ها

این راهکار از سرویس‌های زیر استفاده می‌کند:

  • سرویس صفحه گسترده - داده‌های متنی را به API زبان طبیعی گوگل کلود ارسال می‌کند و پس از تجزیه و تحلیل احساسات، هر سطر را به عنوان "کامل" علامت‌گذاری می‌کند.
  • سرویس UrlFetch - به API زبان طبیعی Google Cloud متصل می‌شود تا تحلیل موجودیت و احساسات را روی متن انجام دهد.

پیش‌نیازها

برای استفاده از این نمونه، به پیش‌نیازهای زیر نیاز دارید:

  • یک حساب گوگل (حساب‌های کاربری گوگل ورک‌اسپیس ممکن است نیاز به تأیید مدیر داشته باشند).
  • یک مرورگر وب با دسترسی به اینترنت.

  • یک پروژه Google Cloud با یک حساب صورتحساب مرتبط. به فعال کردن صورتحساب برای یک پروژه مراجعه کنید.

محیط خود را تنظیم کنید

پروژه ابری خود را در کنسول گوگل کلود باز کنید

اگر هنوز باز نشده است، پروژه ابری که قصد دارید برای این نمونه استفاده کنید را باز کنید:

  1. در کنسول گوگل کلود، به صفحه انتخاب پروژه بروید.

    یک پروژه ابری انتخاب کنید

  2. پروژه گوگل کلود مورد نظر خود را انتخاب کنید. یا روی ایجاد پروژه کلیک کنید و دستورالعمل‌های روی صفحه را دنبال کنید. اگر یک پروژه گوگل کلود ایجاد می‌کنید، ممکن است لازم باشد پرداخت هزینه را برای آن پروژه فعال کنید .

فعال کردن API زبان طبیعی گوگل کلود

این راهکار به API زبان طبیعی گوگل کلود متصل می‌شود. قبل از استفاده از APIهای گوگل، باید آنها را در یک پروژه گوگل کلود فعال کنید. می‌توانید یک یا چند API را در یک پروژه گوگل کلود فعال کنید.

  • در پروژه ابری خود، رابط برنامه‌نویسی کاربردی زبان طبیعی گوگل کلود (Google Cloud Natural Language API) را فعال کنید.

    API را روشن کنید

این راهکار به یک پروژه ابری با صفحه رضایت پیکربندی‌شده نیاز دارد. پیکربندی صفحه رضایت OAuth مشخص می‌کند که گوگل چه چیزی را به کاربران نمایش می‌دهد و برنامه شما را ثبت می‌کند تا بتوانید بعداً آن را منتشر کنید.

  1. در کنسول گوگل کلود، به Menu > برویدGoogle Auth platform > برندسازی .

    به بخش برندسازی بروید

  2. اگر قبلاً تنظیمات را انجام داده‌اید Google Auth platformمی‌توانید تنظیمات صفحه رضایت OAuth زیر را در Branding ، Audience و Data Access پیکربندی کنید. اگر پیامی با این مضمون مشاهده کردید Google Auth platform هنوز پیکربندی نشده است ، روی شروع کار کلیک کنید:
    1. در قسمت اطلاعات برنامه ، در قسمت نام برنامه ، نامی برای برنامه وارد کنید.
    2. در ایمیل پشتیبانی کاربر ، یک آدرس ایمیل پشتیبانی انتخاب کنید که کاربران در صورت داشتن هرگونه سوال در مورد رضایت خود بتوانند با شما تماس بگیرند.
    3. روی بعدی کلیک کنید.
    4. در قسمت مخاطبان ، داخلی (Internal) را انتخاب کنید.
    5. روی بعدی کلیک کنید.
    6. در قسمت اطلاعات تماس ، یک آدرس ایمیل وارد کنید که از طریق آن بتوانید از هرگونه تغییر در پروژه خود مطلع شوید.
    7. روی بعدی کلیک کنید.
    8. در قسمت Finish ، سیاست داده‌های کاربر سرویس‌های API گوگل را مرور کنید و در صورت موافقت، گزینه «من با سیاست‌های داده‌های کاربر سرویس‌های API گوگل موافقم» را انتخاب کنید.
    9. روی ادامه کلیک کنید.
    10. روی ایجاد کلیک کنید.
  3. فعلاً می‌توانید از اضافه کردن محدوده‌ها صرف نظر کنید. در آینده، وقتی برنامه‌ای برای استفاده در خارج از سازمان Google Workspace خود ایجاد می‌کنید، باید نوع کاربر (User type) را به خارجی (External) تغییر دهید. سپس محدوده‌های مجوز مورد نیاز برنامه خود را اضافه کنید. برای کسب اطلاعات بیشتر، به راهنمای کامل پیکربندی رضایت OAuth مراجعه کنید.

دریافت کلید API برای API زبان طبیعی گوگل کلود

  1. به کنسول گوگل کلود بروید. مطمئن شوید که پروژه‌ی دارای قابلیت پرداخت شما باز است.
  2. در کنسول گوگل کلود، به Menu > APIs & Services > Credentials بروید.

    به اعتبارنامه‌ها بروید

  3. روی ایجاد اعتبارنامه > کلید API کلیک کنید.

  4. کلید API خود را برای استفاده در مرحله بعد یادداشت کنید.

اسکریپت را تنظیم کنید

پروژه Apps Script را ایجاد کنید

  1. برای تهیه یک کپی از نمونه صفحه گسترده تحلیل احساسات برای بازخورد ، روی دکمه زیر کلیک کنید. پروژه Apps Script برای این راهکار به صفحه گسترده پیوست شده است.
    یک کپی تهیه کنید
  2. روی افزونه‌ها > اسکریپت برنامه‌ها کلیک کنید.
  3. متغیر زیر را در فایل اسکریپت با کلید API خود به‌روزرسانی کنید:
    const myApiKey = 'YOUR_API_KEY'; // Replace with your API key.
  4. روی ذخیره کلیک کنید آیکون ذخیره .

اضافه کردن داده‌های متنی

  1. به صفحه گسترده برگردید.
  2. داده‌های متنی را به ستون‌های id و comments اضافه کنید. می‌توانید از نمونه‌های نقد و بررسی املاک تعطیلات از Kaggle استفاده کنید یا از داده‌های خودتان استفاده کنید. در صورت نیاز می‌توانید ستون‌های بیشتری اضافه کنید، اما برای اجرای موفقیت‌آمیز، اسکریپت باید در ستون‌های id و comments دارای داده باشد.

اسکریپت را اجرا کنید

  1. در بالای صفحه گسترده، روی ابزارهای احساسات > علامت‌گذاری موجودیت‌ها و احساسات کلیک کنید. ممکن است لازم باشد صفحه را برای نمایش این منوی سفارشی رفرش کنید.
  2. وقتی از شما خواسته شد، اسکریپت را تأیید کنید. اگر صفحه رضایت OAuth هشدار « این برنامه تأیید نشده است» را نشان می‌دهد، با انتخاب Advanced > Go to {Project Name} (unsafe) ادامه دهید.

  3. دوباره روی ابزارهای احساسات > علامت‌گذاری موجودیت‌ها و احساسات کلیک کنید.

  4. وقتی اسکریپت تمام شد، برای دیدن نتایج به صفحه Pivot Table بروید.

کد را مرور کنید

برای بررسی کد Apps Script برای این راهکار، روی مشاهده کد منبع در زیر کلیک کنید:

مشاهده کد منبع

کد.gs

راهکارها/اتوماسیون‌ها/تحلیل-احساسات-بازخورد/کد.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);
}

مشارکت‌کنندگان

این نمونه توسط گوگل و با کمک متخصصان توسعه‌دهنده گوگل نگهداری می‌شود.

مراحل بعدی