Google Cloud Natural Language API ব্যবহার করে প্রতিক্রিয়ার অনুভূতি বিশ্লেষণ করুন

কোডিং স্তর : মধ্যবর্তী
সময়কাল : ২০ মিনিট
প্রকল্পের ধরণ : কাস্টম মেনু সহ অটোমেশন

উদ্দেশ্য

  • সমাধানটি কী কাজ করে তা বুঝুন।
  • সলিউশনের মধ্যে অ্যাপস স্ক্রিপ্ট সার্ভিসগুলো কী কাজ করে তা বুঝুন।
  • আপনার পরিবেশ প্রস্তুত করুন।
  • স্ক্রিপ্টটি সেট আপ করুন।
  • স্ক্রিপ্টটি চালান।

এই সমাধান সম্পর্কে

আপনি উন্মুক্ত মতামতের মতো টেক্সট ডেটা বৃহৎ পরিসরে বিশ্লেষণ করতে পারেন। গুগল শিটস-এর ভেতর থেকে এনটিটি ও সেন্টিমেন্ট অ্যানালাইসিস করার জন্য, এই সলিউশনটি গুগল ক্লাউড ন্যাচারাল ল্যাঙ্গুয়েজ এপিআই-এর সাথে সংযোগ স্থাপন করতে ইউআরএলফেচ সার্ভিস (UrlFetch Service) ব্যবহার করে।

সেন্টিমেন্ট অ্যানালাইসিস কীভাবে কাজ করে তার একটি চিত্র।

কিভাবে এটা কাজ করে

স্ক্রিপ্টটি স্প্রেডশিট থেকে টেক্সট সংগ্রহ করে এবং স্ট্রিংটিতে উপস্থিত সত্তা ও অনুভূতি বিশ্লেষণ করার জন্য গুগল ক্লাউড ন্যাচারাল ল্যাঙ্গুয়েজ এপিআই-এর সাথে সংযোগ স্থাপন করে। একটি পিভট টেবিল টেক্সট ডেটার সমস্ত সারি জুড়ে উল্লিখিত প্রতিটি সত্তার গড় অনুভূতি স্কোরের সারসংক্ষেপ তুলে ধরে।

অ্যাপস স্ক্রিপ্ট পরিষেবা

এই সমাধানটি নিম্নলিখিত পরিষেবাগুলি ব্যবহার করে:

  • স্প্রেডশিট পরিষেবা : টেক্সট ডেটা গুগল ক্লাউড ন্যাচারাল ল্যাঙ্গুয়েজ এপিআই-তে পাঠায় এবং এর সেন্টিমেন্ট বিশ্লেষণ হয়ে গেলে প্রতিটি সারিকে "সম্পূর্ণ" হিসেবে চিহ্নিত করে।
  • UrlFetch পরিষেবা : টেক্সটের উপর এনটিটি এবং সেন্টিমেন্ট বিশ্লেষণ করার জন্য গুগল ক্লাউড ন্যাচারাল ল্যাঙ্গুয়েজ এপিআই-এর সাথে সংযোগ স্থাপন করে।

পূর্বশর্ত

এই নমুনাটি ব্যবহার করার জন্য আপনার নিম্নলিখিত পূর্বশর্তগুলো প্রয়োজন:

  • একটি গুগল অ্যাকাউন্ট (গুগল ওয়ার্কস্পেস অ্যাকাউন্টের জন্য প্রশাসকের অনুমোদনের প্রয়োজন হতে পারে)।
  • ইন্টারনেট সংযোগসহ একটি ওয়েব ব্রাউজার।

  • একটি সংশ্লিষ্ট বিলিং অ্যাকাউন্টসহ গুগল ক্লাউড প্রজেক্ট। একটি প্রজেক্টের জন্য বিলিং সক্ষম করতে দেখুন।

আপনার পরিবেশ তৈরি করুন

এই সমাধানটি ব্যবহার করতে, নিম্নলিখিত সেটআপ ধাপগুলো সম্পন্ন করুন।

গুগল ক্লাউড কনসোলে আপনার ক্লাউড প্রজেক্টটি খুলুন।

যদি আগে থেকে খোলা না থাকে, তাহলে এই স্যাম্পলটির জন্য আপনি যে ক্লাউড প্রজেক্টটি ব্যবহার করতে চান সেটি খুলুন:

  1. গুগল ক্লাউড কনসোলে, 'Select a project' পেজে যান।

    একটি ক্লাউড প্রকল্প নির্বাচন করুন

  2. আপনি যে গুগল ক্লাউড প্রজেক্টটি ব্যবহার করতে চান, সেটি নির্বাচন করুন। অথবা, 'Create project'-এ ক্লিক করুন এবং স্ক্রিনে দেওয়া নির্দেশাবলী অনুসরণ করুন। আপনি যদি একটি গুগল ক্লাউড প্রজেক্ট তৈরি করেন, তাহলে প্রজেক্টটির জন্য বিলিং চালু করার প্রয়োজন হতে পারে।

গুগল ক্লাউড ন্যাচারাল ল্যাঙ্গুয়েজ এপিআই সক্রিয় করুন

এই সলিউশনটি গুগল ক্লাউড ন্যাচারাল ল্যাঙ্গুয়েজ এপিআই-এর সাথে সংযুক্ত হয়। গুগল এপিআই ব্যবহার করার আগে, আপনাকে একটি গুগল ক্লাউড প্রজেক্টে সেগুলি চালু করতে হবে। আপনি একটি একক গুগল ক্লাউড প্রজেক্টে এক বা একাধিক এপিআই চালু করতে পারেন।

  • আপনার ক্লাউড প্রজেক্টে গুগল ক্লাউড ন্যাচারাল ল্যাঙ্গুয়েজ এপিআই (Google Cloud Natural Language API) চালু করুন।

    এপিআই চালু করুন

এই সমাধানের জন্য একটি কনফিগার করা কনসেন্ট স্ক্রিনসহ একটি ক্লাউড প্রজেক্ট প্রয়োজন। OAuth কনসেন্ট স্ক্রিন কনফিগার করার মাধ্যমে নির্ধারিত হয় যে গুগল ব্যবহারকারীদের কী দেখাবে এবং আপনার অ্যাপটি রেজিস্টার হয়ে যায়, যাতে আপনি পরবর্তীতে এটি পাবলিশ করতে পারেন।

  1. গুগল ক্লাউড কনসোলে, মেনু যান >Google Auth platform ব্র্যান্ডিং

    ব্র্যান্ডিং-এ যান

  2. যদি আপনি ইতিমধ্যে কনফিগার করে থাকেন Google Auth platformআপনি ব্র্যান্ডিং , অডিয়েন্স এবং ডেটা অ্যাক্সেস- এ নিম্নলিখিত OAuth কনসেন্ট স্ক্রিন সেটিংস কনফিগার করতে পারেন। যদি আপনি এমন একটি বার্তা দেখেন যাতে বলা আছে Google Auth platform এখনো কনফিগার করা হয়নি , 'শুরু করুন'-এ ক্লিক করুন:
    1. 'অ্যাপ ইনফরমেশন'- এর অধীনে 'অ্যাপ নেম' -এ অ্যাপটির জন্য একটি নাম লিখুন।
    2. ব্যবহারকারী সহায়তা ইমেল- এ, এমন একটি সহায়তা ইমেল ঠিকানা বেছে নিন যেখানে ব্যবহারকারীরা তাদের সম্মতি সম্পর্কে কোনো প্রশ্ন থাকলে আপনার সাথে যোগাযোগ করতে পারে।
    3. পরবর্তী ধাপে যান।
    4. Audience-এর অধীনে Internal নির্বাচন করুন।
    5. পরবর্তী ধাপে যান।
    6. যোগাযোগের তথ্যের অধীনে, একটি ইমেল ঠিকানা লিখুন যেখানে আপনার প্রকল্পের যেকোনো পরিবর্তন সম্পর্কে আপনাকে জানানো যাবে।
    7. পরবর্তী ধাপে যান।
    8. Finish-এর অধীনে, Google API Services ব্যবহারকারীর ডেটা নীতি পর্যালোচনা করুন এবং যদি আপনি সম্মত হন, তাহলে I agree to the Google API Services: User Data Policy নির্বাচন করুন।
    9. চালিয়ে যান ক্লিক করুন।
    10. তৈরি করুন- এ ক্লিক করুন।
  3. আপাতত, আপনি স্কোপ যোগ করা এড়িয়ে যেতে পারেন। ভবিষ্যতে, যখন আপনি আপনার Google Workspace অর্গানাইজেশনের বাইরে ব্যবহারের জন্য কোনো অ্যাপ তৈরি করবেন, তখন আপনাকে অবশ্যই ইউজার টাইপ (User type) পরিবর্তন করে এক্সটার্নাল (External ) করতে হবে। এরপর আপনার অ্যাপের জন্য প্রয়োজনীয় অথরাইজেশন স্কোপগুলো যোগ করুন। আরও জানতে, সম্পূর্ণ ‘Configure OAuth consent’ গাইডটি দেখুন।

গুগল ক্লাউড ন্যাচারাল ল্যাঙ্গুয়েজ এপিআই-এর জন্য একটি এপিআই কী পান।

  1. গুগল ক্লাউড কনসোলে যান। নিশ্চিত করুন যে আপনার বিলিং-সক্ষম প্রজেক্টটি খোলা আছে।
  2. গুগল ক্লাউড কনসোলে, > এপিআই ও পরিষেবা > ক্রেডেনশিয়ালস- এ যান।

    পরিচয়পত্রে যান

  3. ক্রেডেনশিয়াল তৈরি করুন > এপিআই কী-তে ক্লিক করুন।

  4. পরবর্তী ধাপে ব্যবহারের জন্য আপনার এপিআই কী-টি লিখে রাখুন।

স্ক্রিপ্টটি সেট আপ করুন

স্ক্রিপ্টটি সেট আপ করতে নিম্নলিখিত ধাপগুলো সম্পন্ন করুন।

অ্যাপস স্ক্রিপ্ট প্রজেক্টটি তৈরি করুন

  1. ফিডব্যাকের জন্য সেন্টিমেন্ট অ্যানালাইসিস নমুনা স্প্রেডশিটটির একটি কপি তৈরি করতে নিচের বাটনটিতে ক্লিক করুন। এই সলিউশনের অ্যাপস স্ক্রিপ্ট প্রজেক্টটি স্প্রেডশিটটির সাথে সংযুক্ত আছে।

    একটি কপি তৈরি করুন

  2. এক্সটেনশন > অ্যাপস স্ক্রিপ্ট ক্লিক করুন।

  3. স্ক্রিপ্ট ফাইলে নিম্নলিখিত ভেরিয়েবলটি আপনার API কী দিয়ে আপডেট করুন:

    const myApiKey = 'YOUR_API_KEY'; // Replace with your API key.

  4. সংরক্ষণ করুন ক্লিক করুন এডিটরে প্রজেক্ট সংরক্ষণ বোতাম .

টেক্সট ডেটা যোগ করুন

  1. স্প্রেডশিটে ফিরে যান।
  2. id এবং comments কলামে টেক্সট ডেটা যোগ করুন। আপনি Kaggle থেকে নমুনা ভ্যাকেশন প্রপার্টি রিভিউ অথবা আপনার নিজের ডেটা ব্যবহার করতে পারেন। প্রয়োজনে আপনি আরও কলাম যোগ করতে পারেন, কিন্তু সফলভাবে চালানোর জন্য স্ক্রিপ্টটিতে id এবং comments কলামে অবশ্যই ডেটা থাকতে হবে।

স্ক্রিপ্টটি চালান

  1. স্প্রেডশীটের শীর্ষে, Sentiment Tools > Mark entities and sentiment-এ ক্লিক করুন। এই কাস্টম মেনুটি প্রদর্শিত হওয়ার জন্য আপনাকে পৃষ্ঠাটি রিফ্রেশ করতে হতে পারে।
  2. অনুরোধ করা হলে, স্ক্রিপ্টটিকে অনুমোদন দিন। <<../_snippets/oauth.md>>
  3. সেন্টিমেন্ট টুলস-এ ক্লিক করুন > সত্তা এবং সেন্টিমেন্ট পুনরায় চিহ্নিত করুন
  4. স্ক্রিপ্টটি শেষ হলে, ফলাফল দেখতে পিভট টেবিল শীটে যান।

কোডটি পর্যালোচনা করুন

এই সলিউশনের অ্যাপস স্ক্রিপ্ট কোড পর্যালোচনা করতে, 'ভিউ সোর্স কোড'- এ ক্লিক করুন:

উৎস কোড দেখুন

কোড.জিএস

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

অবদানকারীরা

এই নমুনাটি গুগল ডেভেলপার বিশেষজ্ঞদের সহায়তায় গুগল দ্বারা রক্ষণাবেক্ষণ করা হয়।

পরবর্তী পদক্ষেপ