1. Genel Bakış
Bu laboratuvarda, Python kullanarak verilerden analiz elde etmek için BigQuery Studio'daki bir Python not defterinden BigQuery DataFrames'i kullanacaksınız. Yapılandırılmamış metin verilerini analiz etmek ve görselleştirmek için Google'ın üretken yapay zeka özelliğinden yararlanma
Herkese açık bir müşteri şikayetleri veritabanını kategorize edip özetlemek için Python not defteri oluşturacaksınız. Bu, yapılandırılmamış tüm metin verilerinde çalışacak şekilde uyarlanabilir.
Hedefler
Bu laboratuvarda, aşağıdaki görevleri nasıl gerçekleştireceğinizi öğreneceksiniz:
- BigQuery Studio'da Python not defterlerini etkinleştirme ve kullanma
- BigQuery DataFrames paketini kullanarak BigQuery'ye bağlanma
- BigQuery ML'i ve Vertex AI'daki bir metin yerleştirme uç noktasına bağlantıyı kullanarak yapılandırılmamış metin verilerinden yerleştirmeler oluşturma
- BigQuery ML kullanarak yerleştirmeleri kümeleme
- BigQuery ML aracılığıyla bir LLM ile kümeleri özetleme
2. Şartlar
Başlamadan önce
Bu codelab'deki talimatları uygulamak için BigQuery Studio'nun etkinleştirildiği bir Google Cloud projesine ve bağlı bir faturalandırma hesabına ihtiyacınız vardır.
- Google Cloud Console'daki proje seçici sayfasında bir Google Cloud projesi seçin veya oluşturun.
- Google Cloud projeniz için faturalandırmanın etkinleştirildiğinden emin olun. Bir projede faturalandırmanın etkin olup olmadığını kontrol etmeyi öğrenin.
- BigQuery Studio'yu öğe yönetimi için etkinleştirme talimatlarını uygulayın.
BigQuery Studio'yu hazırlama
Boş bir not defteri oluşturup bir çalışma zamanına bağlayın.
- Google Cloud Console'da BigQuery Studio'ya gidin.
- + düğmesinin yanındaki ▼ simgesini tıklayın.
- Python not defteri'ni seçin.
- Şablon seçiciyi kapatın.
- Yeni bir kod hücresi oluşturmak için + Kod'u seçin.
- Kod hücresinden BigQuery DataFrames paketinin en son sürümünü yükleyin.Aşağıdaki komutu yazın.
Kod hücresini çalıştırmak için 🞂 düğmesini tıklayın veya üst karakter + Enter tuşlarına basın.%pip install --upgrade bigframes --quiet
3. Herkese açık bir veri kümesini okuma
Yeni bir kod hücresinde aşağıdakileri çalıştırarak BigQuery DataFrames paketini başlatın:
import bigframes.pandas as bpd
bpd.options.bigquery.ordering_mode = "partial"
Not: Bu eğitimde, pandas benzeri filtreleme ile kullanıldığında daha verimli sorgulara olanak tanıyan deneysel "kısmi sıralama modu" kullanılmaktadır. Sıkı bir sıralama veya dizin gerektiren bazı pandas özellikleri çalışmayabilir.
Tüketici Şikayeti Veritabanı
Tüketici Şikayeti Veritabanı, Google Cloud'un herkese açık veri kümesi programı aracılığıyla BigQuery'de sağlanır. Bu, tüketici finansal ürünleri ve hizmetleriyle ilgili şikayetlerin bir derlemesidir ve veriler ABD Tüketici Finansal Koruma Bürosu tarafından toplanır.
BigQuery'de, Tüketici Şikayetleri Veritabanı'nı analiz etmek için bigquery-public-data.cfbp_complaints.complaint_database tablosunu sorgulayın. Bir sorgu dizesinden veya tablo kimliğinden DataFrame oluşturmak için bigframes.pandas.read_gbq() yöntemini kullanın.
"feedback" adlı bir DataFrame oluşturmak için yeni bir kod hücresinde aşağıdakileri çalıştırın:
feedback = bpd.read_gbq(
"bigquery-public-data.cfpb_complaints.complaint_database"
)
DataFrame hakkında temel bilgileri keşfetme
Verilerin küçük bir örneğini indirmek için DataFrame.peek() yöntemini kullanın.
Bu hücreyi çalıştırın:
feedback.peek()
Beklenen çıkış:
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
Not: head() sıralama gerektirir ve bir veri örneğini görselleştirmek istiyorsanız genellikle peek()'den daha az verimlidir.
Tıpkı pandas'ta olduğu gibi, kullanılabilir tüm sütunları ve bunlara karşılık gelen veri türlerini görmek için DataFrame.dtypes özelliğini kullanın. Bunlar, pandas ile uyumlu bir şekilde gösterilir.
Bu hücreyi çalıştırın:
feedback.dtypes
Beklenen çıkış:
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() yöntemi, DataFrame'deki bazı temel istatistikleri sorgular. Bu DataFrame sayısal sütun içermediğinden, boş olmayan değer sayısının ve farklı değerlerin sayısının özetini gösterir.
Bu hücreyi çalıştırın:
# 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()
Beklenen çıkış:
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. Verileri keşfetme
Gerçek şikayetlere bakmaya başlamadan önce verileri görselleştirmek için DataFrame'de pandas benzeri yöntemleri kullanın.
DataFrame'i görselleştirme
DataFrame.plot.hist() gibi çeşitli yerleşik görselleştirme yöntemleri vardır. Bu DataFrame çoğunlukla dize ve boolean verileri içerdiğinden, çeşitli sütunlar hakkında daha fazla bilgi edinmek için önce bazı toplama işlemleri yapabiliriz.
Her eyaletten kaç şikayet alındığını sayın.
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() yöntemini kullanarak bunu bir pandas DataFrame'e dönüştürün.
complaints_pd = complaints_by_state.head(10).to_pandas()
İndirilen bu DataFrame'de pandas görselleştirme yöntemlerini kullanın.
complaints_pd.plot.bar(x="state", y="total_complaints")

Diğer veri kümeleriyle birleştirme
Daha önce eyalet başına düşen şikayetlere bakıyordunuz ancak bu durumda önemli bağlam bilgileri kayboluyordu. Bazı eyaletlerin nüfusu diğerlerinden daha fazladır. ABD Nüfus Bürosu'nun Amerikan Toplum Anketi ve bigquery-public-data.geo_us_boundaries.states tablosu gibi bir nüfus veri kümesiyle birleştirin.
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")
)
American Community Survey, eyaletleri GEOID'ye göre tanımlar. İki harfli eyalet koduna göre nüfusu almak için eyaletler tablosuyla birleştirin.
pops = us_states.set_index("geo_id")[["state"]].join(
us_survey.set_index("geo_id")[["total_pop"]]
)
Şimdi, nüfusu şikayet sayısıyla karşılaştırmak için bu verileri şikayet veritabanıyla birleştirin.
complaints_and_pops = complaints_by_state.set_index("state").join(
pops.set_index("state")
)
Eyalet nüfuslarını şikayet sayısıyla karşılaştırmak için bir dağılım grafiği oluşturun.
(
complaints_and_pops
.to_pandas()
.plot.scatter(x="total_pop", y="total_complaints")
)

Nüfusu şikayet sayısıyla karşılaştırdığımızda birkaç eyaletin aykırı değer olduğu görülüyor. Bunları belirlemek için nokta etiketleriyle çizim yapmak okuyucuya bırakılmıştır. Aynı şekilde, bunun neden olabileceğine dair bazı hipotezler (ör. farklı demografik gruplar, farklı sayıda finansal hizmet şirketi vb.) oluşturun ve bunları test edin.
5. Yerleştirmeleri hesaplama
Önemli bilgiler genellikle metin, ses veya resim gibi yapılandırılmamış verilerde gizlidir. Bu örnekte, şikayet veritabanındaki faydalı bilgilerin çoğu şikayetin metin içeriğinde yer alıyor.
Yapay zeka ve geleneksel teknikler (ör. duygu analizi, "kelime torbası" ve word2vec), yapılandırılmamış verilerden bazı niceliksel bilgileri ayıklayabilir. Daha yakın bir zamanda, LLM'lerle yakından ilişkili olan "vektör yerleştirme" modelleri, metnin anlamsal bilgilerini temsil eden bir kayan nokta sayıları dizisi oluşturabilir.
Veritabanının bir alt kümesini seçin
Vektör yerleştirme modeli çalıştırmak, diğer işlemlere kıyasla daha fazla kaynak kullanır. Maliyetleri ve kota sorunlarını azaltmak için bu eğitimin geri kalanında verilerin bir alt kümesini seçin.
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
2022-12-01 tarihinde yaklaşık 1.000 şikayet gönderildi. Toplam veritabanında ise yaklaşık 3,5 milyon satır var (feedback.shape ile kontrol edin).
Yalnızca 2022-12-01 tarihine ait verileri ve yalnızca consumer_complaint_narrative sütununu seçin.
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'taki drop_duplicates yöntemi, eşleşen ilk veya son satırı seçip onunla ilişkili indeksi korumaya çalıştığı için satırların tamamen sıralanmasını gerektirir.
Bunun yerine, satırları tekilleştirmek için groupby yöntemine yapılan bir çağrıyla toplayın.
feedback = (
feedback.groupby("consumer_complaint_narrative", as_index=False)
.size()
)[["consumer_complaint_narrative"]]
feedback.shape
Yerleştirilmiş öğeler oluşturma
BigQuery DataFrames, TextEmbeddingGenerator sınıfı aracılığıyla yerleştirme vektörleri oluşturur. Bu, BigQuery ML'de Vertex AI tarafından sağlanan metin yerleştirme modellerini çağıran ML.GENERATE_EMBEDDING yöntemine dayanır.
from bigframes.ml.llm import TextEmbeddingGenerator
embedding_model = TextEmbeddingGenerator(
model_name="text-embedding-004"
)
feedback_embeddings = embedding_model.predict(feedback)
Yerleştirilmiş içeriklerin nasıl göründüğüne göz atın. Bu vektörler, metin yerleştirme modeli tarafından anlaşıldığı şekliyle metnin semantik anlamını temsil eder.
feedback_embeddings.peek()
Beklenen çıkış:
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-...
Bu vektörlerin birçok boyutu vardır. Tek bir yerleştirme vektörüne göz atın:
feedback_embeddings["ml_generate_embedding_result"].peek().iloc[0]
Yerleştirme oluşturma işlemi "kısmi başarı" sözleşmesi kapsamında yapılır. Bu nedenle bazı satırlarda hata olabilir ve yerleştirme oluşturulmayabilir. Hata mesajları 'ml_generate_embedding_status' sütununda gösterilir. Boş olması hata olmadığı anlamına gelir.
Yerleştirmeleri yalnızca hata oluşmayan satırları içerecek şekilde filtreleyin.
mask = feedback_embeddings["ml_generate_embedding_status"] == ""
valid_embeddings = feedback_embeddings[mask]
valid_embeddings.shape
6. Metin yerleştirmelerini kullanarak kümeleme
Şimdi k-ortalama kullanarak yerleştirmeleri kümeleyin. Bu demo için rastgele sayıda grup (diğer adıyla merkezoid) kullanın. Üretim kalitesinde bir çözüm, Silhouette yöntemi gibi bir teknik kullanarak centroid sayısını ayarlamalıdır.
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()
Tüm yerleştirme hatalarını kaldırın.
mask = clusters["ml_generate_embedding_status"] == ""
clusters = clusters[mask]
Merkez noktası başına yorum dağılımını inceleyin.
clusters.groupby("CENTROID_ID").size()
7. Kümeleri özetleme
Her bir merkez noktayla ilişkili bazı yorumları girin ve Gemini'dan şikayetleri özetlemesini isteyin. İstem mühendisliği yeni gelişen bir alan olsa da internette https://www.promptingguide.ai/ gibi iyi örnekler bulunmaktadır.
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()
Özetlerden rapor yazmak için Gemini'ı kullanma
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. Temizleme
Bu eğitim için yeni bir Google Cloud projesi oluşturduysanız oluşturulan tablolar veya diğer kaynaklar için ek ücret alınmasını önlemek üzere bu projeyi silebilirsiniz.
9. Tebrikler!
BigQuery DataFrames'i kullanarak yapılandırılmış ve yapılandırılmamış verileri analiz etmiş olmanız gerekir. Bu süreçte Google Cloud'un herkese açık veri kümelerini, BigQuery Studio'daki Python not defterlerini, BigQuery ML'i, Vertex AI'ı ve BigQuery Studio'nun doğal dilden Python'a özelliklerini keşfettiniz. Tebrikler!
Sonraki adımlar
- Not defterinizde Python kodu oluşturmayı deneyin. BigQuery Studio'daki Python not defterleri Colab Enterprise tarafından desteklenir. İpucu: Test verileri oluşturma konusunda yardım istemenin oldukça faydalı olduğunu düşünüyorum.
- GitHub'daki BigQuery DataFrames ile ilgili örnek not defterlerini inceleyin.
- BigQuery Studio'da not defteri çalıştırmak için bir program oluşturun.
- Üçüncü taraf Python paketlerini BigQuery ile entegre etmek için BigQuery DataFrames ile Uzak İşlev dağıtın.