文本嵌入是自然语言处理(NLP)领域的一项关键工具。它将文本表示为数值形式,其中每个词或短语都用实数的稠密向量表示。
这类嵌入的显著优势在于,它们能够捕捉词语或短语之间的语义含义与关系,从而使机器能够更高效地理解和处理人类语言。
文本嵌入 在文本分类、信息检索和语义相似度检测等场景至关重要。
OpenAI 以其在人工智能领域的卓越贡献而闻名,目前推荐使用 Ada V2 模型来创建文本嵌入。该模型源自 GPT 系列,经过训练,能够更好地捕捉文本中的上下文含义和关联。
如果您尚不熟悉 OpenAI 的 API 或 openai Python 包,建议在继续之前阅读在 Python 中通过 OpenAI API 使用 GPT-3.5 和 GPT-4 。该指南将帮助您设置账户并了解使用 API 的好处。
本教程还会使用聚类这一机器学习技术,用于将相似的样本归为一组。如果您对聚类,尤其是 k-Means 聚类不熟悉,建议阅读使用 scikit-learn 在 Python 中入门 k-Means 聚类 。
文本嵌入可以用于哪些场景?
文本嵌入可应用于多种用例,包括但不限于:
文本分类。 文本嵌入有助于构建情感分析或主题识别等任务的高精度模型。
信息检索。 可用于检索与特定查询相关的信息,类似于搜索引擎的功能。
语义相似度检测。 嵌入可以识别并量化文本片段之间的语义相似性。
推荐系统。 通过基于用户与文本数据的交互来理解其偏好,从而提升推荐质量。
文本生成。 嵌入用于生成更连贯且上下文相关的文本。
机器翻译。 文本嵌入能够跨语言捕捉语义含义,从而提升机器翻译的质量。
环境准备
处理文本嵌入需要几个 Python 包,如下所示:
os: 与操作系统交互的 Python 内置库。
openai: 与 OpenAI API 交互的 Python 客户端。
scipy.spatial.distance: 提供计算不同数据点间距离的函数。
sklean.cluster.KMeans :用于计算 KMeans 聚类。
umap.UMAP :一种用于降低高维数据维度的技术。
在使用它们之前,请通过以下命令安装 openai、scipy、plotly sklearn 和 umap。完整代码可在此 DataLab 工作簿 中获取。
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 的代码模式
以下辅助函数可用于通过 OpenAI API 对一行文本进行嵌入。在代码中,我们使用现有的 ada 版本 2 来生成嵌入。
def get_embedding ( text_to_embed) :
response = openai. Embedding. create(
model= "text-embedding-ada-002" ,
input = [ text_to_embed]
)
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)
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-means 聚类需要预先定义聚类数量,我们将通过 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 以及The OpenAI API in Python 速查表 。这些资料将帮助您通过微调释放 GPT-3 的全部潜力,并展示如何使用 OpenAI API 和 Python 针对您的特定用例改进这一先进的神经网络模型。
文本嵌入是自然语言处理(NLP)领域的一项关键工具。它将文本表示为数值形式,其中每个词或短语都用实数的稠密向量表示。
这类嵌入的显著优势在于,它们能够捕捉词语或短语之间的语义含义与关系,从而使机器能够更高效地理解和处理人类语言。
文本嵌入在文本分类、信息检索和语义相似度检测等场景至关重要。
OpenAI 以其在人工智能领域的卓越贡献而闻名,目前推荐使用 Ada V2 模型来创建文本嵌入。该模型源自 GPT 系列,经过训练,能够更好地捕捉文本中的上下文含义和关联。
如果您尚不熟悉 OpenAI 的 API 或 openai Python 包,建议在继续之前阅读在 Python 中通过 OpenAI API 使用 GPT-3.5 和 GPT-4。该指南将帮助您设置账户并了解使用 API 的好处。
本教程还会使用聚类这一机器学习技术,用于将相似的样本归为一组。如果您对聚类,尤其是 k-Means 聚类不熟悉,建议阅读使用 scikit-learn 在 Python 中入门 k-Means 聚类。
文本嵌入可以用于哪些场景?
文本嵌入可应用于多种用例,包括但不限于:
环境准备
处理文本嵌入需要几个 Python 包,如下所示:
在使用它们之前,请通过以下命令安装
openai、scipy、plotly sklearn和umap。完整代码可在此 DataLab 工作簿中获取。成功执行上述命令后,可按如下方式导入所有库:
现在我们可以按如下方式设置 OpenAI API 密钥:
注意:您需要自行设置 API KEY。源代码中的密钥不可用,仅供个人使用。
通过 API 调用 GPT 的代码模式
以下辅助函数可用于通过 OpenAI API 对一行文本进行嵌入。在代码中,我们使用现有的 ada 版本 2 来生成嵌入。
关于数据集
本节将使用 Kaggle 上免费提供的亚马逊乐器评论数据。您也可以从我的 Github 账户按如下方式下载:
在所有列中,我们只关心 reviewText 列。
数据集中包含许多评论。出于成本优化的目的,我们仅使用随机选取的 100 行。
现在,我们可以通过使用 lambda 表达式调用前面的函数,为整个数据集中每一行生成嵌入:
前 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-means 聚类需要预先定义聚类数量,我们将通过 n_clusters 参数将该数值设为 3,如下所示:
降低嵌入文本数据的维度
人类通常最多只能可视化三维空间。本节将使用 UMAP,这是一种相对快速且可扩展的降维工具。
首先,我们定义一个 UMAP 类的实例,并将 fit_transform 函数应用于嵌入,从而生成可绘制的二维表示。
可视化聚类
最后,创建二维嵌入的散点图。x 和 y 坐标分别取自
embeddings_2d[: , 0]和embeddings_2d[: , 1]聚类将会在视觉上彼此区分:
聚类可视化
总体上有三大簇,颜色各不相同。图中每条评论的颜色由 K-Means 模型为其分配的聚类标签/编号决定。此外,每个点的位置直观地展示了某条评论与其他评论之间的相似程度。
进一步提升
为加深您对文本嵌入和 OpenAI API 的理解,可参考 DataCamp 的以下资料:使用 OpenAI API 和 Python 微调 GPT-3以及The OpenAI API in Python 速查表。这些资料将帮助您通过微调释放 GPT-3 的全部潜力,并展示如何使用 OpenAI API 和 Python 针对您的特定用例改进这一先进的神经网络模型。