英文原文:https://www.datacamp.com/tutorial/introduction-to-text-embeddings-with-the-open-ai-api
浏览我们有关使用 OpenAI API 创建文本嵌入的指南。 发现它们在文本分类、信息检索和语义相似性检测中的应用。
- 文本嵌入可以用来做什么?
- 开始设置
- 通过API调用GPT的Code Pattern
- 关于数据集
- 了解文本相似性
- 案例研究:使用文本嵌入进行聚类分析
- 将其提升到新的水平
文本嵌入是自然语言处理(NLP)领域的重要工具。 它们是文本的数字表示,其中每个单词或短语都表示为实数的密集向量。
这些嵌入的显着优势是它们能够捕获语义以及单词或短语之间的关系,这使得机器能够有效地理解和处理人类语言。
文本嵌入在文本分类、信息检索和语义相似性检测等场景中至关重要。
OpenAI 以其对人工智能领域的卓越贡献而闻名,目前推荐使用 Ada V2 模型来创建文本嵌入。 该模型源自 GPT 系列模型,经过训练可以更好地捕捉文本中存在的上下文含义和关联。
如果您不熟悉 OpenAI 的 API 或 openai Python 包,建议您先阅读通过 Python 中的 OpenAI API 使用 GPT-3.5 和 GPT-4,然后再继续。 本指南将帮助您设置帐户并了解 API 使用的好处。
本教程还涉及clustering(聚类)的使用,这是一种机器学习技术,用于将相似的实例分组在一起。 如果您不熟悉聚类,特别是 k-Means 聚类,您应该考虑阅读 Python 中使用 scikit-learn 进行 k-Means 聚类简介。
文本嵌入可以用来做什么?
文本嵌入可以应用于多种用例,包括但不限于:
- 文本分类。 文本嵌入有助于为情感分析或主题识别任务创建准确的模型。
- 信息检索。 它们可用于检索与特定查询相关的信息,类似于我们在搜索引擎中可以找到的信息。
- 语义相似度检测。 嵌入可以识别和量化文本片段之间的语义相似性。
- 推荐系统。 他们可以根据用户与文本数据的交互了解用户偏好,从而提高推荐质量。
- 文本生成。 嵌入用于生成更加连贯且上下文相关的文本。
- 机器翻译。 文本嵌入可以捕获跨语言的语义,从而提高机器翻译过程的质量。
准备工作
需要多个 Python 包才能处理文本嵌入,如下所述:
- 操作系统:用于与操作系统交互的内置 Python 库。
- openai:与 OpenAI API 交互的 Python 客户端。
- scipy.spatial.distance:提供计算不同数据点之间距离的函数。
- sklearn.cluster.KMeans:用于计算 KMeans 聚类。
- umap.UMAP:一种用于降低高维数据维度的技术。
在使用它们之前,请确保使用以下命令安装 openai、scipy、plotly sklearn 和 umap。 完整代码可在 DataCamp Workspace 上找到。
pip install -U openai, scipy, plotly-express, scikit-learn, umap-learn
成功执行上一条命令后,可以导入所有库,如下所示:
import os
import openai
from scipy.spatial import distance
import plotly.express as px
from sklearn.cluster import KMeans
from umap import UMAP
现在我们可以设置 OpenAI API 密钥,如下所示:
openai.api_key = "<YOUR_API_KEY_HERE>"
注意:您需要设置自己的 API KEY。 源代码中的代码不可用,仅供个人使用。
通过API调用GPT的Code Pattern
以下辅助函数可用于使用 OpenAI API 嵌入一行文本。 在代码中,我们使用现有的 ada version 2 来生成嵌入。
def get_embedding(text_to_embed):
# Embed a line of text
response = openai.Embedding.create(
model= "text-embedding-ada-002",
input=[text_to_embed]
)
# 将 AI 输出嵌入提取为浮点数列表
embedding = response["data"][0]["embedding"]
return embedding
关于数据集
在本节中,我们将考虑 Kaggle 免费提供的亚马逊乐器评论数据。 数据也可以从我的Github帐户下载,如下:
import pandas as pd
data_URL = "https://raw.githubusercontent.com/keitazoumana/Experimentation-Data/main/Musical_instruments_reviews.csv"
review_df = pd.read_csv(data_URL)
review_df.head()
在所有列中,我们只对 reviewText 列感兴趣。
review_df = review_df[['reviewText']]
print("Data shape: {}".format(review_df.shape))
display(review_df.head())
Data shape: (10261, 1)
数据集中有很多评论。 出于成本优化的目的,我们将仅使用 100 个随机选择的行。
现在,我们可以通过使用 lambda 表达式应用前面的函数来生成整个数据集中每一行的嵌入:
review_df = review_df.sample(100)
review_df["embedding"] = review_df["reviewText"].astype(str).apply(get_embedding)
# 让索引从0开始
review_df.reset_index(drop=True)
review_df.head(10)
前 10 行评论和嵌入
了解文本相似度
为了展示语义相似性的概念,让我们考虑两条可能具有相似情感的评论:
“This product is fantastic!”
“It really exceeded my expectations!”
使用 scipy.spatial.distance 中的 pdist(),我们可以计算它们嵌入之间的欧几里德距离。
欧氏距离对应于两个嵌入之间的平方差之和的平方根,如下所示:
欧氏距离的图示(来源)
如果这些评论确实相似,那么距离应该比较小。
接下来,考虑两个不同的评论:
“This product is fantastic!"
“I’m not satisfied with the item.”
这些评论嵌入之间的距离将明显大于相似评论之间的距离。
案例研究:使用文本嵌入进行聚类分析
我们生成的文本嵌入可用于执行聚类分析,以便可以将彼此更相似的相似乐器分组在一起。
有多种聚类算法可用,例如 K-Means、DBSCAN、层次聚类和高斯混合模型。 在此特定用例中,我们将使用 KMeans 聚类。 然而,我们的 Python 层次聚类简介提供了一个很好的框架来理解层次聚类的细节及其在 Python 中的实现。
对文本数据进行聚类
使用 K 均值聚类需要预先定义要使用的聚类数量,我们将使用 n_clusters 参数将该数量设置为 3,如下所示:
kmeans = KMeans(n_clusters=3)
kmeans.fit(review_df["embedding"].tolist())
减少嵌入文本数据的维度
人类通常只能看到三个维度。 本节将使用 UMAP,一种相对快速且可扩展的工具来执行降维。
首先,我们定义 UMAP 类的实例,并将 fit_transform 函数应用于嵌入,这会生成可以绘制的评论嵌入的二维表示。
reducer = UMAP()
embeddings_2d = reducer.fit_transform(review_df["embedding"].tolist())
可视化聚类
最后,创建二维嵌入的散点图。 x 和 y 坐标分别取自 embeddings_2d[: , 0] 和 embeddings_2d[: , 1]
这些聚类在视觉上是不同的:
fig = px.scatter(x=embeddings_2d[:, 0], y=embeddings_2d[:, 1], color=kmeans.labels_)
fig.show()
聚类可视化
总共有三个具有不同颜色的主要集群。 图中每条评论的颜色由 K-Means 模型分配给它的聚类标签/编号决定。 此外,每个点的定位可以直观地表示给定评论与其他点的相似程度。
将其提升到新的水平
要加深对文本嵌入和 OpenAI API 的理解,请考虑 DataCamp 中的以下材料:使用 OpenAI API 和 Python 微调 GPT-3 以及 Python 备忘单中的 OpenAI API。 它可以帮助您通过微调释放 GPT-3 的全部潜力,并说明如何使用 OpenAI API 和 Python 来针对您的特定用例改进此高级神经网络模型。