۱. نمای کلی
در این آزمایشگاه، از BigQuery DataFrames در دفتر یادداشت Python در BigQuery Studio استفاده خواهید کرد تا بااستفاده از Python از دادهها اطلاعات آماری کسب کنید. از هوش مصنوعی زایای Google برای تجزیهوتحلیل و دیداریسازی دادههای نوشتاری ساختارنیافته استفاده کنید.
دفترچه Python ایجاد خواهید کرد تا پایگاه داده عمومی شکایات مشتریان را دستهبندی و خلاصه کنید. این مدل میتواند برای کار با هرگونه داده نوشتاری غیرساختاریافتهای تطبیق داده شود.
اهداف
در این آزمایشگاه، با نحوه انجام تکالیف زیر آشنا میشوید:
- فعال کردن و استفاده از دفترچههای Python در BigQuery Studio
- بااستفاده از بسته BigQuery DataFrames به BigQuery متصل شوید
- ایجاد جاسازی از دادههای نوشتاری ساختارنیافته بااستفاده از BigQuery ML و اتصال به نقطه پایانی جاسازی نوشتاری در Vertex AI
- خوشهبندی جاسازیها بااستفاده از BigQuery ML
- خلاصه کردن خوشهها با مدل زبانی بزرگ ازطریق BigQuery ML
۲. الزامات
قبلاز شروع
برای دنبال کردن دستورالعملهای این codelab، به «پروژه Google Cloud» با BigQuery Studio فعال و حساب صورتحساب متصل نیاز دارید.
- در کنسول Google Cloud، در صفحه انتخابگر پروژه، یک پروژه Google Cloud را انتخاب یا ایجاد کنید
- مطمئن شوید که صورتحساب برای پروژه Google Cloud شما فعال باشد. با نحوه بررسی فعال بودن صورتحساب در پروژه آشنا شوید
- دستورالعملها را برای فعال کردن BigQuery Studio برای مدیریت دارایی دنبال کنید.
آماده کردن BigQuery Studio
دفترچه خالی ایجاد کنید و آن را به زمان اجرا متصل کنید.
- به BigQuery Studio در «کنسول Google Cloud» بروید.
- روی ▼ در کنار دکمه + کلیک کنید.
- دفترچه Python را انتخاب کنید.
- گزینشگر الگو را ببندید.
- برای ایجاد سلول کد جدید، + کد را انتخاب کنید.
- جدیدترین نسخه بسته BigQuery DataFrames را از سلول کد نصب کنید.فرمان زیر را تایپ کنید.
برای اجرای سلول کد، روی دکمه 🞂 کلیک کنید یا کلید تبدیل + کلید Enter را فشار دهید.%pip install --upgrade bigframes --quiet
۳. خواندن مجموعه داده عمومی
بسته 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 را کاوش کردهاید. بینظیر بود!
مراحل بعدی
- تولید کد Python در دفترچه را امتحان کنید. دفترچههای Python در BigQuery Studio از Colab Enterprise استفاده میکنند. نکته: درخواست کمک برای تولید دادههای آزمایشی را بسیار مفید میدانم.
- دفترچههای نمونه برای BigQuery DataFrames را در GitHub کاوش کنید.
- برنامهای برای اجرای دفترچه در BigQuery Studio ایجاد کنید.
- «تابع از دور با BigQuery DataFrames» را برای ادغام کردن بستههای Python طرف سوم با BigQuery مستقر کنید.