دریافت کردن اطلاعات آماری از داده‌های ساختاریافته و بدون ساختار بااستفاده از بسته BigQuery DataFrames با قابلیت هوشواره‌ای

۱. نمای کلی

در این آزمایشگاه، از BigQuery DataFrames در دفتر یادداشت Python در BigQuery Studio استفاده خواهید کرد تا بااستفاده از Python از داده‌ها اطلاعات آماری کسب کنید. از هوش مصنوعی زایای Google برای تجزیه‌وتحلیل و دیداری‌سازی داده‌های نوشتاری ساختارنیافته استفاده کنید.

دفترچه Python ایجاد خواهید کرد تا پایگاه داده عمومی شکایات مشتریان را دسته‌بندی و خلاصه کنید. این مدل می‌تواند برای کار با هرگونه داده نوشتاری غیرساختاریافته‌ای تطبیق داده شود.

اهداف

در این آزمایشگاه، با نحوه انجام تکالیف زیر آشنا می‌شوید:

  • فعال کردن و استفاده از دفترچه‌های Python در BigQuery Studio
  • بااستفاده از بسته BigQuery DataFrames به BigQuery متصل شوید
  • ایجاد جاسازی از داده‌های نوشتاری ساختارنیافته بااستفاده از BigQuery ML و اتصال به نقطه پایانی جاسازی نوشتاری در Vertex AI
  • خوشه‌بندی جاسازی‌ها بااستفاده از BigQuery ML
  • خلاصه کردن خوشه‌ها با مدل زبانی بزرگ ازطریق BigQuery ML

۲. الزامات

  • مرورگر، مانند Chrome یا Firefox
  • پروژه Google Cloud با صورت‌حساب فعال

قبل‌از شروع

برای دنبال کردن دستورالعمل‌های این codelab، به «پروژه Google Cloud» با BigQuery Studio فعال و حساب صورت‌حساب متصل نیاز دارید.

  1. در کنسول Google Cloud، در صفحه انتخابگر پروژه، یک پروژه Google Cloud را انتخاب یا ایجاد کنید
  2. مطمئن شوید که صورت‌حساب برای پروژه Google Cloud شما فعال باشد. با نحوه بررسی فعال بودن صورت‌حساب در پروژه آشنا شوید
  3. دستورالعمل‌ها را برای فعال کردن BigQuery Studio برای مدیریت دارایی دنبال کنید.

آماده کردن BigQuery Studio

دفترچه خالی ایجاد کنید و آن را به زمان اجرا متصل کنید.

  1. به BigQuery Studio در «کنسول Google Cloud» بروید.
  2. روی ▼ در کنار دکمه + کلیک کنید.
  3. دفترچه Python را انتخاب کنید.
  4. گزینشگر الگو را ببندید.
  5. برای ایجاد سلول کد جدید، + کد را انتخاب کنید.
  6. جدیدترین نسخه بسته BigQuery DataFrames را از سلول کد نصب کنید.فرمان زیر را تایپ کنید.
    %pip install --upgrade bigframes --quiet
    
    برای اجرای سلول کد، روی دکمه 🞂 کلیک کنید یا کلید تبدیل + کلید Enter را فشار دهید.

۳. خواندن مجموعه داده عمومی

بسته BigQuery DataFrames را با اجرای کد زیر در یک سلول کد جدید مقداردهی اولیه کنید:

import bigframes.pandas as bpd

bpd.options.bigquery.ordering_mode = "partial"

توجه: در این آموزش گام‌به‌گام، از «حالت ترتیب جزئی» آزمایشی استفاده می‌کنیم که هنگام استفاده با فیلترهای شبیه pandas، امکان پُرسمان‌های کارآمدتری را فراهم می‌کند. برخی‌از ویژگی‌های pandas که نیاز به ترتیب یا نمایه‌گذاری دقیق دارند ممکن است کار نکنند.

پایگاه داده شکایت مصرف‌کننده

پایگاه داده شکایت مصرف‌کننده ازطریق برنامه مجموعه داده عمومی Google Cloud در BigQuery ارائه می‌شود. این مجموعه شکایت‌هایی درباره محصولات و خدمات مالی مصرف‌کننده است و داده‌ها توسط «اداره حفاظت مالی مصرف‌کننده ایالات متحده» جمع‌آوری می‌شود.

در BigQuery، جدول bigquery-public-data.cfbp_complaints.complaint_database را پُرسمان کنید تا «پایگاه داده شکایت مصرف‌کننده» را تجزیه‌وتحلیل کنید. از روش bigframes.pandas.read_gbq() برای ایجاد DataFrame از رشته پُرسمان یا شناسه جدول استفاده کنید.

برای ایجاد 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() کارایی کمتری دارد.

همانند 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

۴. کاوش داده‌ها

قبل‌از اینکه به شکایت‌های واقعی بپردازید، از روش‌های شبیه به پاندا در DataFrame برای دیداری‌سازی داده‌ها استفاده کنید.

دیداری‌سازی کردن 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()

از روش‌های دیداری‌سازی pandas در این DataFrame بارگیری‌شده استفاده کنید.

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

نمودار پراکندگی که جمعیت را با شکایات مقایسه می‌کند

به‌نظر می‌رسد که در مقایسه جمعیت با تعداد شکایات، چند ایالت به‌عنوان داده پرت ظاهر می‌شوند. این کار به‌عنوان تمرینی برای خواننده باقی می‌ماند تا با برچسب‌های نقطه، این موارد را شناسایی کند. به‌همین ترتیب، فرضیه‌هایی درباره اینکه چرا این وضعیت ممکن است وجود داشته باشد (مثلاً جمعیت‌شناسی متفاوت، تعداد متفاوت شرکت‌های خدمات مالی، و غیره) ارائه دهید و آن‌ها را آزمایش کنید.

۵. محاسبه جاسازی‌ها

اغلب، اطلاعات مهم در داده‌های ساختارنیافته، مانند متن، صدا، یا تصاویر، پنهان است. در این مثال، بخش زیادی از اطلاعات مفید در پایگاه داده شکایت‌ها در محتوای نوشتاری شکایت قرار دارد.

هوش مصنوعی و تکنیک‌های سنتی، مانند تحلیل احساسات، «کیسه کلمات»، و 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

در تاریخ ۲۰۲۲-۱۲-۰۱ حدود ۱٬۰۰۰ شکایت ارسال شده است درحالی‌که کل پایگاه داده تقریباً ۳٫۵ میلیون ردیف دارد (با 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

روش drop_duplicates از pandas نیاز به ترتیب کامل ردیف‌ها دارد زیرا سعی می‌کند ردیف منطبق اول یا آخر را انتخاب کند و شاخص مرتبط با آن را حفظ کند.

درعوض، با فراخوانی روش 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

‫۶. خوشه‌بندی بااستفاده از جاسازی‌های نوشتاری

اکنون، جاسازی‌ها را بااستفاده از k-میانگین خوشه‌بندی کنید. برای این نسخه نمایشی، از تعداد دلخواهی از گروه‌ها (یا همان مرکزها) استفاده کنید. راه‌حل کیفیت تولید باید تعداد مرکزوارها را بااستفاده از تکنیکی مثل روش شبح تنظیم کند.

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

‫۷. خلاصه کردن خوشه‌ها

چند نظر مرتبط با هر مرکز هندسی را ارائه دهید و از 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))

‫۸. مرتب‌سازی

اگر برای این آموزش پروژه Google Cloud جدیدی ایجاد کرده‌اید، می‌توانید آن را حذف کنید تا از کسر هزینه‌های اضافی برای جدول‌ها یا منابع ایجادشده دیگر جلوگیری کنید.

‫۹. تبریک!

بااستفاده از BigQuery DataFrames، داده‌های ساختاریافته و بدون ساختار را تجزیه‌وتحلیل کرده‌اید. درطول این مسیر، «مجموعه‌داده‌های عمومی» Google Cloud، دفتر یادداشت‌های Python در BigQuery Studio،‏ BigQuery ML،‏ Vertex AI، و ویژگی‌های زبان طبیعی به Python در BigQuery Studio را کاوش کرده‌اید. بی‌نظیر بود!

مراحل بعدی