AI-সক্ষম BigQuery DataFrames প্যাকেজ ব্যবহার করে স্ট্রাকচার্ড এবং আনস্ট্রাকচার্ড ডেটা থেকে ইনসাইট পান, AI-সক্ষম BigQuery ডেটাফ্রেম প্যাকেজ ব্যবহার করে স্ট্রাকচার্ড এবং আনস্ট্রাকচার্ড ডেটা থেকে ইনসাইট পান

১. সংক্ষিপ্ত বিবরণ

এই ল্যাবে, আপনি পাইথন ব্যবহার করে ডেটা থেকে অন্তর্দৃষ্টি লাভের জন্য BigQuery Studio-তে একটি পাইথন নোটবুক থেকে BigQuery DataFrames ব্যবহার করবেন। অসংগঠিত টেক্সট ডেটা বিশ্লেষণ ও ভিজ্যুয়ালাইজ করতে গুগলের জেনারেটিভ এআই ব্যবহার করুন।

আপনি একটি পাবলিক গ্রাহক অভিযোগ ডেটাবেসকে শ্রেণিবদ্ধ ও সংক্ষিপ্ত করার জন্য একটি পাইথন নোটবুক তৈরি করবেন। এটি যেকোনো অসংগঠিত টেক্সট ডেটার উপর কাজ করার জন্য অভিযোজিত করা যেতে পারে।

উদ্দেশ্য

এই ল্যাবে, আপনি নিম্নলিখিত কাজগুলো কীভাবে সম্পাদন করতে হয় তা শিখবেন:

  • BigQuery Studio-তে পাইথন নোটবুক সক্রিয় করুন এবং ব্যবহার করুন।
  • BigQuery DataFrames প্যাকেজ ব্যবহার করে BigQuery-এর সাথে সংযোগ করুন
  • BigQuery ML ব্যবহার করে অসংগঠিত টেক্সট ডেটা থেকে এমবেডিং তৈরি করুন এবং Vertex AI-এর একটি টেক্সট এমবেডিং এন্ডপয়েন্টের সাথে সংযোগ স্থাপন করুন।
  • BigQuery ML ব্যবহার করে ক্লাস্টার এমবেডিং
  • BigQuery ML ব্যবহার করে LLM-এর সাহায্যে ক্লাস্টারগুলির সারসংক্ষেপ করুন

২. প্রয়োজনীয়তা

শুরু করার আগে

এই কোডল্যাবের নির্দেশাবলী অনুসরণ করার জন্য, আপনার BigQuery Studio সক্রিয় করা একটি Google Cloud Project এবং একটি সংযুক্ত বিলিং অ্যাকাউন্ট প্রয়োজন হবে।

  1. গুগল ক্লাউড কনসোলের প্রজেক্ট সিলেক্টর পেজে, একটি গুগল ক্লাউড প্রজেক্ট নির্বাচন করুন বা তৈরি করুন।
  2. আপনার গুগল ক্লাউড প্রোজেক্টের জন্য বিলিং চালু আছে কিনা তা নিশ্চিত করুন। কোনো প্রোজেক্টে বিলিং চালু আছে কিনা তা কীভাবে পরীক্ষা করবেন তা জানুন।
  3. অ্যাসেট ম্যানেজমেন্টের জন্য BigQuery Studio সক্রিয় করতে নির্দেশাবলী অনুসরণ করুন।

BigQuery Studio প্রস্তুত করুন

একটি খালি নোটবুক তৈরি করুন এবং এটিকে রানটাইমের সাথে সংযুক্ত করুন।

  1. গুগল ক্লাউড কনসোলে BigQuery Studio- তে যান।
  2. + বাটনের পাশে থাকা চিহ্নটিতে ক্লিক করুন।
  3. পাইথন নোটবুক নির্বাচন করুন।
  4. টেমপ্লেট নির্বাচকটি বন্ধ করুন।
  5. নতুন কোড সেল তৈরি করতে + কোড নির্বাচন করুন।
  6. কোড সেল থেকে BigQuery DataFrames প্যাকেজের সর্বশেষ সংস্করণটি ইনস্টল করতে নিম্নলিখিত কমান্ডটি টাইপ করুন।
    %pip install --upgrade bigframes --quiet
    
    কোড সেলটি রান করতে 🞂 বোতামে ক্লিক করুন অথবা Shift + Enter চাপুন।

৩. একটি পাবলিক ডেটাসেট পড়ুন

একটি নতুন কোড সেলে নিম্নলিখিতটি চালিয়ে BigQuery DataFrames প্যাকেজটি ইনিশিয়ালাইজ করুন:

import bigframes.pandas as bpd

bpd.options.bigquery.ordering_mode = "partial"

দ্রষ্টব্য: এই টিউটোরিয়ালে আমরা পরীক্ষামূলক 'পার্শিয়াল অর্ডারিং মোড' ব্যবহার করছি, যা পান্ডাস-সদৃশ ফিল্টারিংয়ের সাথে ব্যবহার করলে আরও কার্যকর কোয়েরি করতে সাহায্য করে। পান্ডাসের কিছু ফিচার, যেগুলোর জন্য কঠোর অর্ডারিং বা ইনডেক্স প্রয়োজন, সেগুলো কাজ নাও করতে পারে।

ভোক্তা অভিযোগ ডাটাবেস

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

BigQuery-তে, কনজিউমার কমপ্লেইন্ট ডেটাবেস বিশ্লেষণ করার জন্য bigquery-public-data.cfbp_complaints.complaint_database টেবিলটি কোয়েরি করুন। কোয়েরি স্ট্রিং বা টেবিল আইডি থেকে ডেটাফ্রেম তৈরি করতে bigframes.pandas.read_gbq() মেথডটি ব্যবহার করুন।

'feedback' নামের একটি ডেটাফ্রেম তৈরি করতে একটি নতুন কোড সেলে নিম্নলিখিত কোডটি চালান:

feedback = bpd.read_gbq(
    "bigquery-public-data.cfpb_complaints.complaint_database"
)

একটি ডেটাফ্রেম সম্পর্কে প্রাথমিক তথ্য জানুন

ডেটার একটি ছোট নমুনা ডাউনলোড করতে DataFrame.peek() মেথডটি ব্যবহার করুন।

এই সেলটি চালান:

feedback.peek()

প্রত্যাশিত আউটপুট:

  date_received                  product ... timely_response  consumer_disputed complaint_id  
0    2014-03-05  Bank account or service ...            True              False       743665   
1    2014-01-21  Bank account or service ...            True              False       678608   
2    2020-12-31          Debt collection ...            True               <NA>      4041190   
3    2014-02-12          Debt collection ...            True              False       714350   
4    2015-02-23          Debt collection ...            True              False      1251358   

দ্রষ্টব্য: head() ফাংশনে ডেটা সাজানোর প্রয়োজন হয় এবং ডেটার একটি নমুনা ভিজ্যুয়ালাইজ করতে চাইলে এটি সাধারণত peek() চেয়ে কম কার্যকর।

পান্ডাসের মতোই, সমস্ত উপলব্ধ কলাম এবং তাদের সংশ্লিষ্ট ডেটা টাইপ দেখতে DataFrame.dtypes প্রপার্টিটি ব্যবহার করুন। এগুলো পান্ডাস-সামঞ্জস্যপূর্ণ উপায়ে প্রদর্শিত হয়।

এই সেলটি চালান:

feedback.dtypes

প্রত্যাশিত আউটপুট:

date_received                   date32[day][pyarrow]
product                              string[pyarrow]
subproduct                           string[pyarrow]
issue                                string[pyarrow]
subissue                             string[pyarrow]
consumer_complaint_narrative         string[pyarrow]
company_public_response              string[pyarrow]
company_name                         string[pyarrow]
state                                string[pyarrow]
zip_code                             string[pyarrow]
tags                                 string[pyarrow]
consumer_consent_provided            string[pyarrow]
submitted_via                        string[pyarrow]
date_sent_to_company            date32[day][pyarrow]
company_response_to_consumer         string[pyarrow]
timely_response                              boolean
consumer_disputed                            boolean
complaint_id                         string[pyarrow]
dtype: object

DataFrame.describe() মেথডটি DataFrame থেকে কিছু প্রাথমিক পরিসংখ্যান জানতে চায়। যেহেতু এই DataFrame-টিতে কোনো সংখ্যাসূচক কলাম নেই, তাই এটি নন-নাল মানের সংখ্যা এবং স্বতন্ত্র মানের সংখ্যার একটি সারসংক্ষেপ দেখায়।

এই সেলটি চালান:

# Exclude some of the larger columns to make the query more efficient.
feedback.drop(columns=[
  "consumer_complaint_narrative",
  "company_public_response",
  "company_response_to_consumer",
]).describe()

প্রত্যাশিত আউটপুট:

         product  subproduct    issue  subissue  company_name    state ... timely_response  consumer_disputed  complaint_id
count    3458906     3223615  3458906   2759004       3458906  3417792 ...         3458906             768399       3458906
nunique       18          76      165       221          6694       63 ...               2                  2       3458906

৪. ডেটা অন্বেষণ করা

প্রকৃত অভিযোগগুলো খতিয়ে দেখার আগে, ডেটাফ্রেমের উপর পান্ডাস-এর মতো মেথড ব্যবহার করে ডেটা ভিজ্যুয়ালাইজ করুন।

ডেটাফ্রেমটি কল্পনা করুন

DataFrame.plot.hist() এর মতো বেশ কিছু বিল্ট-ইন ভিজ্যুয়ালাইজেশন পদ্ধতি রয়েছে। যেহেতু এই ডেটাফ্রেমে বেশিরভাগই স্ট্রিং এবং বুলিয়ান ডেটা রয়েছে, তাই বিভিন্ন কলাম সম্পর্কে আরও জানতে আমরা প্রথমে কিছু অ্যাগ্রিগেশন করতে পারি।

প্রতিটি রাজ্য থেকে কতগুলি অভিযোগ পাওয়া গেছে তা গণনা করুন।

complaints_by_state = (
  feedback.groupby(
    "state", as_index=False,
  ).size()
  .rename(columns={"size": "total_complaints"})
  .sort_values(by="total_complaints", ascending=False)
)

DataFrame.to_pandas() মেথড ব্যবহার করে এটিকে একটি পান্ডাস ডেটাফ্রেমে রূপান্তর করুন।

complaints_pd = complaints_by_state.head(10).to_pandas()

এই ডাউনলোড করা ডেটাফ্রেমটির উপর পান্ডাস ভিজ্যুয়ালাইজেশন পদ্ধতিগুলো ব্যবহার করুন।

complaints_pd.plot.bar(x="state", y="total_complaints")

বার চার্টটি ক্যালিফোর্নিয়াকে সর্বাধিক অভিযোগযুক্ত রাজ্য হিসাবে দেখাচ্ছে।

অন্যান্য ডেটাসেটের সাথে যুক্ত করুন

পূর্বে, আপনি রাজ্যভিত্তিক অভিযোগের সংখ্যা দেখেছিলেন, কিন্তু এতে গুরুত্বপূর্ণ প্রেক্ষাপট হারিয়ে যায়। কিছু রাজ্যের জনসংখ্যা অন্যগুলোর চেয়ে বেশি। ইউএস সেন্সাস ব্যুরোর আমেরিকান কমিউনিটি সার্ভে এবং bigquery-public-data.geo_us_boundaries.states টেবিলের মতো একটি জনসংখ্যা ডেটাসেটের সাথে যুক্ত করুন।

us_states = bpd.read_gbq("bigquery-public-data.geo_us_boundaries.states")
us_survey = bpd.read_gbq("bigquery-public-data.census_bureau_acs.state_2020_5yr")

# Ensure there are leading 0s on GEOIDs for consistency across tables.
us_states = us_states.assign(
    geo_id=us_states["geo_id"].str.pad(2, fillchar="0")
)

us_survey = us_survey.assign(
    geo_id=us_survey["geo_id"].str.pad(2, fillchar="0")
)

আমেরিকান কমিউনিটি সার্ভে জিওআইডি (GEOID) দ্বারা রাজ্যগুলোকে শনাক্ত করে। দুই অক্ষরের রাজ্য কোড অনুযায়ী জনসংখ্যা পেতে রাজ্যগুলোর সারণীর সাথে এটিকে যুক্ত করুন।

pops = us_states.set_index("geo_id")[["state"]].join(
  us_survey.set_index("geo_id")[["total_pop"]]
)

এখন, জনসংখ্যার সঙ্গে অভিযোগের সংখ্যা তুলনা করতে এটিকে অভিযোগের ডেটাবেসের সাথে যুক্ত করুন।

complaints_and_pops = complaints_by_state.set_index("state").join(
    pops.set_index("state")
)

রাজ্যের জনসংখ্যার সাথে অভিযোগের সংখ্যার তুলনা করার জন্য একটি স্ক্যাটার প্লট তৈরি করুন।

(
  complaints_and_pops
  .to_pandas()
  .plot.scatter(x="total_pop", y="total_complaints")
)

জনসংখ্যার সাথে অভিযোগের তুলনা করে একটি স্ক্যাটার প্লট

জনসংখ্যার সাথে অভিযোগের সংখ্যার তুলনা করলে কয়েকটি রাজ্যকে ব্যতিক্রমী বলে মনে হচ্ছে। বিন্দু লেবেলসহ একটি লেখচিত্র অঙ্কন করে এগুলোকে চিহ্নিত করার কাজটি পাঠকের জন্য রেখে দেওয়া হলো। একইভাবে, এমনটা কেন হতে পারে তার জন্য কিছু অনুমান তৈরি করুন (যেমন: ভিন্ন জনমিতি, ভিন্ন সংখ্যক আর্থিক পরিষেবা সংস্থা, ইত্যাদি) এবং সেগুলো পরীক্ষা করে দেখুন।

৫. এমবেডিং গণনা করুন

প্রায়শই, গুরুত্বপূর্ণ তথ্য টেক্সট, অডিও বা ছবির মতো অসংগঠিত ডেটার মধ্যে লুকিয়ে থাকে। এই উদাহরণে, অভিযোগ ডেটাবেসের বেশিরভাগ দরকারি তথ্য অভিযোগটির টেক্সট কন্টেন্টের মধ্যেই রয়েছে।

এআই এবং প্রচলিত কৌশল, যেমন সেন্টিমেন্ট অ্যানালাইসিস, ‘ব্যাগ অফ ওয়ার্ডস’, এবং ওয়ার্ডটুভেক, অসংগঠিত ডেটা থেকে কিছু পরিমাণগত তথ্য বের করতে পারে। অতি সম্প্রতি, ‘ভেক্টর এমবেডিং’ মডেল, যা এলএলএম-এর সাথে ঘনিষ্ঠভাবে সম্পর্কিত, টেক্সটের শব্দার্থগত তথ্য উপস্থাপনকারী ফ্লোটিং পয়েন্ট সংখ্যার একটি ক্রম তৈরি করতে পারে।

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

একটি ভেক্টর এমবেডিং মডেল চালাতে অন্যান্য অপারেশনের চেয়ে বেশি রিসোর্স ব্যবহৃত হয়। খরচ এবং কোটা সংক্রান্ত সমস্যা কমাতে, এই টিউটোরিয়ালের বাকি অংশের জন্য ডেটার একটি উপসেট নির্বাচন করুন।

import bigframes.pandas as bpd

bpd.options.bigquery.ordering_mode = "partial"

feedback = bpd.read_gbq(
    "bigquery-public-data.cfpb_complaints.complaint_database"
)

# Note: if not using ordering_mode = "partial", you must specify these in read_gbq
# for these to affect query efficiency.
# feedback = bpd.read_gbq(
#    "bigquery-public-data.cfpb_complaints.complaint_database",
#     columns=["consumer_complaint_narrative"],
#     filters= [
#         ("consumer_complaint_narrative", "!=", ""),
#         ("date_received", "==", "2022-12-01")])

feedback.shape

২০২২-১২-০১ তারিখে প্রায় ১,০০০ অভিযোগ জমা পড়েছে, যেখানে মোট ডাটাবেসে প্রায় ৩৫ লক্ষ সারি রয়েছে ( feedback.shape থেকে যাচাই করুন)।

শুধুমাত্র ২০২২-১২-০১ তারিখের ডেটা এবং কেবল consumer_complaint_narrative কলামটি নির্বাচন করুন।

import datetime

feedback = feedback[
    # Filter rows by passing in a boolean Series.
    (feedback["date_received"] == datetime.date(2022, 12, 1))
    & ~(feedback["date_received"].isnull())
    & ~(feedback["consumer_complaint_narrative"].isnull())
    & (feedback["consumer_complaint_narrative"] != "")
    & (feedback["state"] == "CA")

    # Uncomment the following if using free credits for a workshop.
    # Billing accounts with free credits have limited Vertex AI quota.
    # & (feedback["product"] == "Mortgage")
][
    # Filter columns by passing in a list of strings.
    ["consumer_complaint_narrative"]
]

feedback.shape

pandas-এর drop_duplicates মেথডটির জন্য সারিগুলোর একটি সম্পূর্ণ ক্রম প্রয়োজন, কারণ এটি প্রথম বা শেষ মিলে যাওয়া সারিটি নির্বাচন করার এবং এর সাথে যুক্ত ইনডেক্সটি সংরক্ষণ করার চেষ্টা করে।

এর পরিবর্তে, সারিগুলো থেকে ডুপ্লিকেট বাদ দিতে groupby মেথড ব্যবহার করে অ্যাগ্রিগেট করুন।

feedback = (
  feedback.groupby("consumer_complaint_narrative", as_index=False)
  .size()
)[["consumer_complaint_narrative"]]

feedback.shape

এমবেডিং তৈরি করুন

BigQuery DataFrames, TextEmbeddingGenerator ক্লাসের মাধ্যমে এমবেডিং ভেক্টর তৈরি করে। এটি BigQuery ML-এর ML.GENERATE_EMBEDDING মেথডের উপর ভিত্তি করে কাজ করে, যা Vertex AI দ্বারা সরবরাহকৃত টেক্সট এমবেডিং মডেলগুলোকে কল করে।

from bigframes.ml.llm import TextEmbeddingGenerator

embedding_model = TextEmbeddingGenerator(
    model_name="text-embedding-004"
)
feedback_embeddings = embedding_model.predict(feedback)

এমবেডিংগুলো দেখতে কেমন তা একবার দেখে নিন। এই ভেক্টরগুলো টেক্সট এমবেডিং মডেলের দৃষ্টিকোণ থেকে টেক্সটের অর্থগত তাৎপর্যকে উপস্থাপন করে।

feedback_embeddings.peek()

প্রত্যাশিত আউটপুট:

                        ml_generate_embedding_result  \
0  [ 7.36380890e-02  2.11779331e-03  2.54309829e-...   
1  [-1.10935252e-02 -5.53950183e-02  2.01338865e-...   
2  [-7.85628427e-03 -5.39347418e-02  4.51385677e-...   
3  [ 0.02013054 -0.0224789  -0.00164843  0.011354...   
4  [-1.51684484e-03 -5.02693094e-03  1.72322839e-...   

এই ভেক্টরগুলোর অনেক মাত্রা আছে। একটি একক এমবেডিং ভেক্টরের দিকে তাকান:

feedback_embeddings["ml_generate_embedding_result"].peek().iloc[0]

এমবেডিং তৈরি একটি "আংশিক সাফল্য" চুক্তির অধীনে পরিচালিত হয়। এর মানে হলো, কিছু সারিতে ত্রুটি থাকতে পারে এবং সেগুলোর জন্য কোনো এমবেডিং তৈরি নাও হতে পারে। ত্রুটির বার্তাগুলো 'ml_generate_embedding_status' কলামের মাধ্যমে প্রকাশ করা হয়। এটি খালি থাকলে কোনো ত্রুটি নেই বোঝায়।

শুধুমাত্র সেই সারিগুলো অন্তর্ভুক্ত করার জন্য এমবেডিংগুলো ফিল্টার করুন যেখানে কোনো ত্রুটি ঘটেনি।

mask = feedback_embeddings["ml_generate_embedding_status"] == ""
valid_embeddings = feedback_embeddings[mask]
valid_embeddings.shape

৬. টেক্সট এমবেডিং ব্যবহার করে ক্লাস্টার তৈরি করা

এখন, কে-মিনস ব্যবহার করে এমবেডিংগুলোকে ক্লাস্টার করুন। এই ডেমোর জন্য, ইচ্ছামতো সংখ্যক গ্রুপ (যাকে সেন্ট্রয়েডও বলা হয়) ব্যবহার করুন। একটি প্রোডাকশন কোয়ালিটি সলিউশনে সিলুয়েট মেথডের মতো কোনো কৌশল ব্যবহার করে সেন্ট্রয়েডের সংখ্যা টিউন করা উচিত।

from bigframes.ml.cluster import KMeans

num_clusters = 5
cluster_model = KMeans(n_clusters=num_clusters)
cluster_model.fit(valid_embeddings["ml_generate_embedding_result"])
clusters = cluster_model.predict(valid_embeddings)
clusters.peek()

যেকোনো এমবেডিং ত্রুটি দূর করুন।

mask = clusters["ml_generate_embedding_status"] == ""
clusters = clusters[mask]

প্রতিটি কেন্দ্রবিন্দু অনুযায়ী মন্তব্যের বিন্যাসটি একবার দেখে নিন।

clusters.groupby("CENTROID_ID").size()

৭. ক্লাস্টারগুলোর সারসংক্ষেপ করুন

প্রতিটি সেন্ট্রয়েডের সাথে যুক্ত কিছু মন্তব্য দিন এবং জেমিনিকে অভিযোগগুলো সারসংক্ষেপ করতে বলুন। প্রম্পট ইঞ্জিনিয়ারিং একটি উদীয়মান ক্ষেত্র, কিন্তু ইন্টারনেটে এর ভালো উদাহরণ রয়েছে, যেমন https://www.promptingguide.ai/।

from bigframes.ml.llm import GeminiTextGenerator

preamble = "What is the main concern in this list of user complaints:"
suffix = "Write the main issue using a formal tone."

# Now let's sample the raw comments and get the LLM to summarize them.
prompts = []
for centroid_id in range(1, num_clusters + 1):
  cluster = clusters[clusters["CENTROID_ID"] == centroid_id]
  comments = "\n".join(["- {0}".format(x) for x in cluster.content.peek(40)])
  prompts.append("{}:\n{}\n{}".format(preamble, comments, suffix))

prompt_df = bpd.DataFrame(prompts)
gemini = GeminiTextGenerator(model_name="gemini-1.5-flash-001")
issues = gemini.predict(X=prompt_df, temperature=0.0)
issues.peek()

সারাংশগুলো থেকে একটি প্রতিবেদন লিখতে জেমিনি ব্যবহার করুন।

from IPython.display import display, Markdown

prompt = "Turn this list of issues into a short, concise report:"
for value in issues["ml_generate_text_llm_result"]:
  prompt += "- {}".format(value)
prompt += "Using a formal tone, write a markdown text format report."

summary_df = bpd.DataFrame(([prompt]))
summary = gemini.predict(X=summary_df, temperature=0.0)

report = (summary["ml_generate_text_llm_result"].values[0])
display(Markdown(report))

৮. পরিষ্কার করুন

আপনি যদি এই টিউটোরিয়ালের জন্য একটি নতুন গুগল ক্লাউড প্রজেক্ট তৈরি করে থাকেন, তবে তৈরি করা টেবিল বা অন্যান্য রিসোর্সের জন্য অতিরিক্ত চার্জ এড়াতে আপনি সেটি ডিলিট করে দিতে পারেন।

৯. অভিনন্দন!

আপনি BigQuery DataFrames ব্যবহার করে স্ট্রাকচার্ড এবং আনস্ট্রাকচার্ড ডেটা বিশ্লেষণ করেছেন। এই প্রক্রিয়ায় আপনি Google Cloud-এর পাবলিক ডেটাসেট, BigQuery Studio-এর পাইথন নোটবুক, BigQuery ML, Vertex AI এবং BigQuery Studio-এর ন্যাচারাল ল্যাঙ্গুয়েজ থেকে পাইথন ফিচারগুলো সম্পর্কে জেনেছেন। চমৎকার কাজ!

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