एआई की मदद से काम करने वाले BigQuery DataFrames पैकेज का इस्तेमाल करके, स्ट्रक्चर्ड और अनस्ट्रक्चर्ड डेटा से अहम जानकारी पाएं

1. खास जानकारी

इस लैब में, BigQuery Studio में मौजूद Python नोटबुक से BigQuery DataFrames का इस्तेमाल किया जाएगा. इससे Python का इस्तेमाल करके डेटा से अहम जानकारी हासिल की जा सकेगी. बिना स्ट्रक्चर वाले टेक्स्ट डेटा का विश्लेषण करने और उसे विज़ुअलाइज़ करने के लिए, Google के जनरेटिव एआई का इस्तेमाल करें.

आपको Python नोटबुक बनानी होगी. इससे, सार्वजनिक तौर पर उपलब्ध ग्राहक की शिकायतों के डेटाबेस को कैटगरी में बांटा जा सकेगा और उसकी खास जानकारी दी जा सकेगी. इसे किसी भी अनस्ट्रक्चर्ड टेक्स्ट डेटा पर काम करने के लिए अडैप्ट किया जा सकता है.

मकसद

इस लैब में, आपको ये टास्क करने का तरीका बताया जाएगा:

  • BigQuery Studio में Python नोटबुक चालू करना और उनका इस्तेमाल करना
  • BigQuery DataFrames पैकेज का इस्तेमाल करके BigQuery से कनेक्ट करना
  • BigQuery ML और Vertex AI में टेक्स्ट एम्बेडिंग एंडपॉइंट से कनेक्शन का इस्तेमाल करके, अनस्ट्रक्चर्ड टेक्स्ट डेटा से एम्बेडिंग बनाना
  • BigQuery ML का इस्तेमाल करके क्लस्टर एम्बेडिंग
  • BigQuery ML की मदद से, एलएलएम के ज़रिए क्लस्टर की खास जानकारी पाना

2. ज़रूरी शर्तें

  • कोई ब्राउज़र, जैसे कि Chrome या Firefox
  • बिलिंग की सुविधा वाला Google Cloud प्रोजेक्ट

शुरू करने से पहले

इस कोडलैब में दिए गए निर्देशों का पालन करने के लिए, आपके पास BigQuery Studio की सुविधा चालू किया गया Google Cloud प्रोजेक्ट और उससे जुड़ा बिलिंग खाता होना चाहिए.

  1. Google Cloud Console में, प्रोजेक्ट चुनने वाले पेज पर जाकर, Google Cloud प्रोजेक्ट चुनें या बनाएं
  2. पक्का करें कि आपके Google Cloud प्रोजेक्ट के लिए बिलिंग चालू हो. किसी प्रोजेक्ट के लिए बिलिंग चालू है या नहीं, यह देखने का तरीका जानें
  3. ऐसेट मैनेजमेंट के लिए BigQuery Studio चालू करने से जुड़े निर्देशों का पालन करें.

BigQuery Studio को तैयार करना

एक खाली नोटबुक बनाएं और उसे रनटाइम से कनेक्ट करें.

  1. Google Cloud Console में BigQuery Studio पर जाएं.
  2. + बटन के बगल में मौजूद पर क्लिक करें.
  3. Python नोटबुक चुनें.
  4. टेंप्लेट चुनने वाला टूल बंद करें.
  5. नई कोड सेल बनाने के लिए, + कोड को चुनें.
  6. कोड सेल से, BigQuery DataFrames पैकेज का नया वर्शन इंस्टॉल करें.यह कमांड टाइप करें.
    %pip install --upgrade bigframes --quiet
    
    कोड सेल को चलाने के लिए, 🞂 बटन पर क्लिक करें या Shift + Enter दबाएं.

3. किसी सार्वजनिक डेटासेट को पढ़ना

नई कोड सेल में यह कोड चलाकर, BigQuery DataFrames पैकेज शुरू करें:

import bigframes.pandas as bpd

bpd.options.bigquery.ordering_mode = "partial"

ध्यान दें: इस ट्यूटोरियल में, हम एक्सपेरिमेंट के तौर पर उपलब्ध "पार्शियल ऑर्डरिंग मोड" का इस्तेमाल करते हैं. इससे pandas जैसे फ़िल्टरिंग टूल के साथ इस्तेमाल करने पर, क्वेरी ज़्यादा असरदार तरीके से काम करती हैं. पांडा की कुछ ऐसी सुविधाएं काम नहीं कर सकती हैं जिनके लिए, क्रम या इंडेक्स का सही होना ज़रूरी है.

उपभोक्ता शिकायत डेटाबेस

उपभोक्ताओं की शिकायतें सबमिट करने के लिए उपलब्ध डेटाबेस को BigQuery पर उपलब्ध कराया जाता है. इसके लिए, Google Cloud के सार्वजनिक डेटासेट प्रोग्राम का इस्तेमाल किया जाता है. यह उपभोक्ताओं के लिए उपलब्ध फ़ाइनेंशियल प्रॉडक्ट और सेवाओं के बारे में की गई शिकायतों का कलेक्शन है. इस डेटा को United States Consumer Financial Protection Bureau इकट्ठा करता है.

उपभोक्ता शिकायत डेटाबेस का विश्लेषण करने के लिए, BigQuery में bigquery-public-data.cfbp_complaints.complaint_database टेबल को क्वेरी करें. क्वेरी स्ट्रिंग या टेबल आईडी से DataFrame बनाने के लिए, bigframes.pandas.read_gbq() तरीके का इस्तेमाल करें.

"feedback" नाम का DataFrame बनाने के लिए, नई कोड सेल में यह कोड चलाएं:

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

किसी DataFrame के बारे में बुनियादी जानकारी पाना

डेटा का छोटा सैंपल डाउनलोड करने के लिए, 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(), head() से कम असरदार होता है.

pandas की तरह ही, DataFrame.dtypes प्रॉपर्टी का इस्तेमाल करके, सभी उपलब्ध कॉलम और उनके डेटा टाइप देखें. इन्हें pandas के साथ काम करने वाले तरीके से दिखाया जाता है.

इस सेल को चलाएं:

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

4. डेटा एक्सप्लोर करना

असल शिकायतों को देखने से पहले, DataFrame पर pandas जैसे तरीकों का इस्तेमाल करके डेटा को विज़ुअलाइज़ करें.

DataFrame को विज़ुअलाइज़ करना

विज़ुअलाइज़ेशन के कई तरीके पहले से मौजूद हैं. जैसे, DataFrame.plot.hist(). इस DataFrame में ज़्यादातर स्ट्रिंग और बूलियन डेटा होता है. इसलिए, अलग-अलग कॉलम के बारे में ज़्यादा जानने के लिए, हम पहले कुछ एग्रीगेशन कर सकते हैं.

गिनें कि हर राज्य से कितनी शिकायतें मिली हैं.

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() तरीके का इस्तेमाल करके, इसे pandas DataFrame में बदलें.

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

डाउनलोड किए गए इस DataFrame पर, pandas के विज़ुअलाइज़ेशन के तरीकों का इस्तेमाल करें.

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

बार चार्ट में, कैलिफ़ोर्निया को सबसे ज़्यादा शिकायतें पाने वाले राज्य के तौर पर दिखाया गया है

अन्य डेटासेट के साथ जोड़ना

इससे पहले, आपने राज्य के हिसाब से शिकायतें देखी थीं. हालांकि, इससे अहम जानकारी नहीं मिलती. कुछ राज्यों की आबादी, दूसरे राज्यों की तुलना में ज़्यादा होती है. इसे जनसंख्या के डेटासेट के साथ जोड़ें. जैसे, US Census Bureau का American Community Survey और 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")
)

जनसंख्या और शिकायतों की तुलना करने वाला स्कैटर प्लॉट

जनसंख्या की तुलना में शिकायतों की संख्या के हिसाब से, कुछ राज्य आउटलायर के तौर पर दिख रहे हैं. इनकी पहचान करने के लिए, पॉइंट लेबल के साथ प्लॉट करने का काम पढ़ने वाले व्यक्ति के लिए छोड़ दिया गया है. इसी तरह, कुछ अनुमान लगाएं कि ऐसा क्यों हो रहा है. जैसे, अलग-अलग डेमोग्राफ़िक, वित्तीय सेवाएं देने वाली कंपनियों की अलग-अलग संख्या वगैरह. इसके बाद, इन अनुमानों को टेस्ट करें.

5. एम्बेडिंग का हिसाब लगाना

अक्सर, ज़रूरी जानकारी बिना किसी स्ट्रक्चर वाले डेटा में छिपी होती है. जैसे, टेक्स्ट, ऑडियो या इमेज. इस उदाहरण में, शिकायत के डेटाबेस में मौजूद ज़्यादातर काम की जानकारी, शिकायत के टेक्स्ट कॉन्टेंट में शामिल है.

एआई और पारंपरिक तकनीकों, जैसे कि सेंटीमेंट एनालिसिस, "बैग ऑफ़ वर्ड्स", और word2vec की मदद से, बिना किसी स्ट्रक्चर वाले डेटा से कुछ मात्रात्मक जानकारी निकाली जा सकती है. हाल ही में, "वेक्टर एम्बेडिंग" मॉडल का इस्तेमाल किया जा रहा है. ये मॉडल, एलएलएम से काफ़ी मिलते-जुलते हैं. ये मॉडल, फ़्लोटिंग पॉइंट नंबर का एक ऐसा क्रम बना सकते हैं जो टेक्स्ट की सिमैंटिक जानकारी को दिखाता है.

डेटाबेस का कोई सबसेट चुनें

वेक्टर एम्बेडिंग मॉडल को चलाने में, अन्य कार्रवाइयों की तुलना में ज़्यादा संसाधनों का इस्तेमाल होता है. लागत और कोटे से जुड़ी समस्याओं को कम करने के लिए, इस ट्यूटोरियल के बाकी हिस्सों के लिए डेटा का सबसेट चुनें.

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

कुल डेटाबेस में करीब 35 लाख लाइनें हैं.इनकी तुलना में, 1 दिसंबर, 2022 को करीब 1,000 शिकायतें सबमिट की गई हैं (feedback.shape से पुष्टि करें).

सिर्फ़ 2022-12-01 का डेटा और सिर्फ़ 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 क्लास की मदद से एम्बेडिंग वेक्टर जनरेट करता है. यह ML.GENERATE_EMBEDDING तरीके पर आधारित है. BigQuery ML में, यह 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

6. टेक्स्ट एम्बेडिंग का इस्तेमाल करके क्लस्टर बनाना

अब k-means का इस्तेमाल करके, एम्बेडिंग को क्लस्टर करें. इस डेमो के लिए, ग्रुप (उर्फ़ सेंट्रॉइड) की कोई भी संख्या इस्तेमाल करें. प्रोडक्शन क्वालिटी वाले समाधान में, सिलुएट मेथड जैसी तकनीक का इस्तेमाल करके, सेंट्रॉइड की संख्या को ट्यून किया जाना चाहिए.

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()

7. क्लस्टर की खास जानकारी तैयार करना

हर सेंट्रॉइड से जुड़े कुछ सुझाव/राय दें या शिकायतें करें और Gemini से इन सुझावों/रायों या शिकायतों की खास जानकारी देने के लिए कहें. प्रॉम्प्ट इंजीनियरिंग एक नया विषय है. हालांकि, इंटरनेट पर इसके अच्छे उदाहरण मौजूद हैं. जैसे, 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()

खास जानकारी से रिपोर्ट लिखने के लिए, Gemini का इस्तेमाल करें.

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

8. व्यवस्थित करें

अगर आपने इस ट्यूटोरियल के लिए नया Google Cloud प्रोजेक्ट बनाया है, तो बनाए गए टेबल या अन्य संसाधनों के लिए अतिरिक्त शुल्क से बचने के लिए, उसे मिटाएं.

9. बधाई हो!

आपने BigQuery DataFrames का इस्तेमाल करके, स्ट्रक्चर्ड और अनस्ट्रक्चर्ड डेटा का विश्लेषण किया हो. इस दौरान, आपने Google Cloud के सार्वजनिक डेटासेट, BigQuery Studio में Python नोटबुक, BigQuery ML, Vertex AI, और BigQuery Studio की नैचुरल लैंग्वेज से Python में बदलने की सुविधाओं के बारे में जाना. बहुत बढ़िया!

अगले चरण