从数据集中获取嵌入
本笔记本提供了一个如何从大型数据集中获取嵌入的示例。
1. 加载数据集
本示例中使用的数据集是亚马逊的Fine-Food Reviews。该数据集包含截至2012年10月亚马逊用户留下的共计568,454条美食评论。为了说明目的,我们将使用该数据集的一个子集,包含1,000条最近的评论。评论是英文的,倾向于正面或负面。每条评论都有一个产品ID、用户ID、评分、评论标题(Summary)和评论正文(Text)。
我们将评论的摘要和评论文本合并成一个组合文本。模型将对这个组合文本进行编码,并输出一个单一的向量嵌入。
要运行此笔记本,您需要安装:pandas、openai、transformers、plotly、matplotlib、scikit-learn、torch(transformer依赖项)、torchvision和scipy。
import pandas as pd
import tiktoken
from utils.embeddings_utils import get_embedding
embedding_model = "text-embedding-3-small"
embedding_encoding = "cl100k_base"
max_tokens = 8000 # text-embedding-3-small 的最大值为 8191
# 加载和检查数据集
input_datapath = "data/fine_food_reviews_1k.csv" # 为节省空间,我们提供一个预先过滤的数据集
df = pd.read_csv(input_datapath, index_col=0)
df = df[["Time", "ProductId", "UserId", "Score", "Summary", "Text"]]
df = df.dropna()
df["combined"] = (
"Title: " + df.Summary.str.strip() + "; Content: " + df.Text.str.strip()
)
df.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... |
# 重新采样1000条最近的评论并删除过长的样本
top_n = 1000
df = df.sort_values("Time").tail(top_n * 2) # 先截取前2000条,假设少于一半会被过滤掉
df.drop("Time", axis=1, inplace=True)
encoding = tiktoken.get_encoding(embedding_encoding)
# 忽略过长的无法嵌入的评论
df["n_tokens"] = df.combined.apply(lambda x: len(encoding.encode(x)))
df = df[df.n_tokens <= max_tokens].tail(top_n)
len(df)
1000
2. 获取嵌入并保存以备将来重用
# 确保您已按照README中的说明在环境中设置了API密钥:https://github.com/openai/openai-python#usage
# 这可能需要几分钟时间
df["embedding"] = df.combined.apply(lambda x: get_embedding(x, model=embedding_model))
df.to_csv("data/fine_food_reviews_with_embeddings_1k.csv")
a = get_embedding("hi", model=embedding_model)