نمایش دو بعدی embeddings

نمایش دو بعدی embeddings

visualization, embeddings
preview

نمایش دو بعدی embeddings #

ما از t-SNE برای کاهش ابعاد embeddings از ۱۵۳۶ به ۲ استفاده خواهیم کرد. پس از کاهش ابعاد به دو بعد، می‌توانیم آن‌ها را در یک نمودار پراکندگی ۲ بعدی نمایش دهیم.

جمع آوری داده ها #

مجموعه داده‌ای که در این مثال استفاده شده است، نظرات کاربران در مورد غذاهای مختلف در آمازون می‌باشد. این مجموعه داده شامل 568,454 نظر در مورد غذاهای مختلف است که تا اکتبر 2012 توسط کاربران آمازون ثبت شده‌اند. ما از یک زیرمجموعه از این داده‌ها که شامل 1,000 نظر جدیدتر می‌باشد برای مقاصد آموزشی استفاده خواهیم کرد. این نظرات به زبان انگلیسی نوشته شده‌اند و به طور کلی یا مثبت هستند یا منفی. هر نظر شامل ProductId، UserId، امتیاز (Score)، عنوان نظر (Summary) و متن نظر (Text) می‌باشد.

ما عنوان نظر و متن نظر را به یک متن ترکیبی واحد تبدیل خواهیم کرد. مدل این متن ترکیبی را encode کرده و یک وکتور تکی تولید خواهد کرد.

برای اجرای این نوت‌بوک، نیاز به نصب پکیج‌های زیر دارید: pandas، openai، transformers، plotly، matplotlib، scikit-learn، torch (وابسته به transformerstorchvision، و scipy.

 1import pandas as pd
 2import tiktoken
 3
 4# load & inspect dataset
 5input_datapath = "data/fine_food_reviews_1k.csv"  # to save space, we provide a pre-filtered dataset
 6df = pd.read_csv(input_datapath, index_col=0)
 7df = df[["Time", "ProductId", "UserId", "Score", "Summary", "Text"]]
 8df = df.dropna()
 9df["combined"] = (
10    "Title: " + df.Summary.str.strip() + "; Content: " + df.Text.str.strip()
11)
12df.head(2)

نمایش:

TimeProductIdUserIdScoreSummaryTextcombined
01351123200B003XPF9BOA3R7JR3FMEBXQB5where does one start...and stop... with a tre...Wanted to save some to bring to my Chicago fam...Title: where does one start...and stop... wit...
11351123200B003JK537SA3JBPC3WFUT5ZP1Arrived in piecesNot pleased at all. When I opened the box, mos...Title: Arrived in pieces; Content: Not pleased...
 1
 2embedding_model = "text-embedding-3-small"
 3max_tokens = 8000  # the maximum for text-embedding-3-small is 8191
 4embedding_encoding = "cl100k_base"
 5
 6# subsample to 1k most recent reviews and remove samples that are too long
 7top_n = 1000
 8df = df.sort_values("Time").tail(top_n * 2)  # first cut to first 2k entries, assuming less than half will be filtered out
 9df.drop("Time", axis=1, inplace=True)
10
11encoding = tiktoken.get_encoding(embedding_encoding)
12
13# omit reviews that are too long to embed
14df["n_tokens"] = df.combined.apply(lambda x: len(encoding.encode(x)))
15df = df[df.n_tokens <= max_tokens].tail(top_n)

حال از Gilas API برای تولید امبدینگ ها استفاده می‌کنیم.

برای اجرای کدهای زیر ابتدا باید یک کلید API را از طریق پنل کاربری گیلاس تولید کنید. برای این کار ابتدا یک حساب کاربری جدید بسازید یا اگر صاحب حساب کاربری هستید وارد پنل کاربری خود شوید. سپس، به صفحه کلید API بروید و با کلیک روی دکمه “ساخت کلید API” یک کلید جدید برای دسترسی به Gilas API بسازید.
 1
 2from openai import OpenAI # for calling the OpenAI API
 3import os
 4
 5client = OpenAI(
 6    api_key=os.environ.get(("GILAS_API_KEY", "<کلید API خود را اینجا بسازید https://dashboard.gilas.io/apiKey>")), 
 7    base_url="https://api.gilas.io/v1/" # Gilas APIs
 8)
 9
10def get_embedding(query)
11    query_embedding_response = client.embeddings.create(
12        model=embedding_model,
13        input=query,
14    )
15    return query_embedding_response.data[0].embedding
16
17
18# This may take a few minutes
19df["embedding"] = df.combined.apply(lambda x: get_embedding(x))
20df.to_csv("data/fine_food_reviews_with_embeddings_1k.csv")

کاهش ابعاد #

ما ابعاد را با استفاده از t-SNE به ۲ بعد کاهش می‌دهیم.

 1import pandas as pd
 2from sklearn.manifold import TSNE
 3import numpy as np
 4from ast import literal_eval
 5
 6# Load the embeddings
 7datafile_path = "data/fine_food_reviews_with_embeddings_1k.csv"
 8df = pd.read_csv(datafile_path)
 9
10# Convert to a list of lists of floats
11matrix = np.array(df.embedding.apply(literal_eval).to_list())
12
13# Create a t-SNE model and transform the data
14tsne = TSNE(n_components=2, perplexity=15, random_state=42, init='random', learning_rate=200)
15vis_dims = tsne.fit_transform(matrix)
16vis_dims.shape

رسم embeddings #

ما هر نظر را با رنگ ستاره آن، از قرمز تا سبز، رنگ‌آمیزی می‌کنیم.

می‌توانیم مشاهده کنیم که حتی در ابعاد کاهش یافته ۲ بعدی، جداسازی داده‌ها به خوبی انجام شده است.

 1import matplotlib.pyplot as plt
 2import matplotlib
 3import numpy as np
 4
 5colors = ["red", "darkorange", "gold", "turquoise", "darkgreen"]
 6x = [x for x,y in vis_dims]
 7y = [y for x,y in vis_dims]
 8color_indices = df.Score.values - 1
 9
10colormap = matplotlib.colors.ListedColormap(colors)
11plt.scatter(x, y, c=color_indices, cmap=colormap, alpha=0.3)
12for score in [0,1,2,3,4]:
13    avg_x = np.array(x)[df.Score-1==score].mean()
14    avg_y = np.array(y)[df.Score-1==score].mean()
15    color = colors[score]
16    plt.scatter(avg_x, avg_y, marker='x', color=color, s=100)
17
18plt.title("Amazon ratings visualized in language using t-SNE")