نمایش دو بعدی embeddings
#
ما از t-SNE
برای کاهش ابعاد embeddings
از ۱۵۳۶ به ۲ استفاده خواهیم کرد. پس از کاهش ابعاد به دو بعد، میتوانیم آنها را در یک نمودار پراکندگی ۲ بعدی نمایش دهیم.
جمع آوری داده ها #
مجموعه دادهای که در این مثال استفاده شده است، نظرات کاربران در مورد غذاهای مختلف در آمازون میباشد. این مجموعه داده شامل 568,454 نظر در مورد غذاهای مختلف است که تا اکتبر 2012 توسط کاربران آمازون ثبت شدهاند. ما از یک زیرمجموعه از این دادهها که شامل 1,000 نظر جدیدتر میباشد برای مقاصد آموزشی استفاده خواهیم کرد. این نظرات به زبان انگلیسی نوشته شدهاند و به طور کلی یا مثبت هستند یا منفی. هر نظر شامل ProductId
، UserId
، امتیاز (Score
)، عنوان نظر (Summary
) و متن نظر (Text
) میباشد.
ما عنوان نظر و متن نظر را به یک متن ترکیبی واحد تبدیل خواهیم کرد. مدل این متن ترکیبی را encode
کرده و یک وکتور تکی تولید خواهد کرد.
برای اجرای این نوتبوک، نیاز به نصب پکیجهای زیر دارید: pandas
، openai
، transformers
، plotly
، matplotlib
، scikit-learn
، torch
(وابسته به transformers
)، torchvision
، و 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)
نمایش:
Time | ProductId | UserId | Score | Summary | Text | combined | |
---|---|---|---|---|---|---|---|
0 | 1351123200 | B003XPF9BO | A3R7JR3FMEBXQB | 5 | where 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... |
1 | 1351123200 | B003JK537S | A3JBPC3WFUT5ZP | 1 | Arrived in pieces | Not 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")