写在前面
—— 解锁文本深层语义,将用户评论、商品描述转化为模型可用的“智慧特征”
在上一篇博客中,我们成功搭建了 Python 与大语言模型 (LLM) 交互的桥梁,并初步掌握了通过 Prompt Engineering 让 LLM 理解和执行我们指令的艺术。我们甚至小试牛刀,利用 LLM 对电商评论进行了初步的情感分类。
这仅仅是冰山一角!LLM 的真正威力远不止于此。要将 LLM 的“智慧”更深度地融入我们的数据挖掘流程,尤其是赋能传统的机器学习模型,我们需要解决一个核心问题:如何让主要处理数值和类别数据的机器学习模型,“理解”非结构化的文本信息?
电商痛点再聚焦:文本数据的“次元壁”
想象一下这些场景:
用户评论分析: 我们想基于用户评论来预测他们是否会复购。评论中“质量好”、“物流快”和“客服耐心”显然是积极信号,而“描述不符”、“有瑕疵”、“服务差”则是消极信号。但如何将这些 文字描述 转化为可供逻辑回归或随机森林模型使用的 数值特征?简单的词频统计会丢失太多语义信息(例如,“不推荐”和“非常推荐”可能都包含“推荐”二字)。
商品相似度计算: 我们希望为用户推荐与其购买过或浏览过的商品相似的其他商品。如何判断两件商品(例如两款不同描述的“羊毛衫”)在 功能、风格、材质、适用场景 等方面是相似的?仅仅比较商品标题或标签显然不够。
用户兴趣建模: 我们想根据用户浏览过的商品描述、搜索的关键词来理解其潜在兴趣。如何将这些 零散的文本片段 凝聚成能够代表用户兴趣方向的 量化表达?
这些问题的核心都在于如何跨越 文本数据 与 数值模型 之间的“次元壁”。而 LLM 提供了一把强大的钥匙——文本嵌入 (Text Embeddings)。
本篇博客,我们将深入探讨:
什么是文本嵌入 (Embeddings)? 用通俗的语言和类比揭开它的神秘面纱。
为什么 LLM 生成的 Embeddings 更强大? 对比传统文本表示方法的优势。
如何获取 Embeddings? 实操演示通过 OpenAI API 和 Hugging Face 开源模型获取文本向量。
如何在 Pandas 中存储和使用 Embeddings?
电商实战:Embeddings 的应用场景与初步代码示例 (语义搜索、相似商品发现、评论聚类思路)。
掌握 Embeddings,你就掌握了将 LLM 的语义理解能力注入数据分析流程的关键技术,为特征工程带来了革命性的提升!
🌌 一、文本嵌入 (Embeddings)?
想象一下,我们想让计算机理解词语或句子的含义。传统方法可能会给每个词一个编号(像字典一样),但这无法表达词语之间的关系(例如,“国王”和“王后”的关系,“走”和“跑”的相似性)。
文本嵌入 (Embeddings) 则提供了一种更聪明的方式:它将 文本(单词、句子、段落甚至整篇文档)映射到一个高维的、连续的数值向量空间中。在这个空间里:
语义相似的文本,其对应的向量在空间中的距离也更近。 例如,“很棒的手机”和“性能出色的设备”对应的向量会比较接近,而它们与“糟糕的体验”对应的向量则会相距较远。
向量之间的关系可能反映文本之间的语义关系。 例如,著名的例子是 vector('国王') - vector('男人') + vector('女人') 在向量空间中非常接近 vector('王后')。
简单类比:
地图上的坐标: 就像每个城市在地图上都有经纬度坐标一样,每个词或句子在“语义空间”中也有一个向量坐标。北京和上海的坐标相对较近(都是中国大城市),而北京和纽约的坐标则较远。
颜色空间中的 RGB 值: 每种颜色可以用红®、绿(G)、蓝(B)三个数值表示,相似的颜色(如深红和浅红)其 RGB 值也相近。Embeddings 类似,但维度通常高得多(几百甚至上千维)。
Embeddings 的核心价值在于: 它将 离散的、非结构化的文本 转换为了 连续的、包含语义信息的数值向量,从而使得计算机能够:
量化语义相似度: 通过计算向量之间的距离(如余弦相似度、欧氏距离)来判断文本的相似程度。
作为机器学习模型的输入: 这些数值向量可以直接作为特征输入给各种机器学习模型(分类、回归、聚类等)。
🚀 二、为何选择 LLM Embeddings?VS 传统方法
在 LLM 出现之前,也有很多经典的文本嵌入方法,例如:
One-Hot Encoding: 每个词表示为一个超长向量,只有一个位置是 1,其他都是 0。维度灾难,无法表示语义相似性。
TF-IDF (Term Frequency-Inverse Document Frequency): 基于词频和逆文档频率计算词的权重,能体现词的重要性,但仍基于词袋模型,忽略语序和深层语义。
Word2Vec, GloVe: 基于神经网络的浅层词嵌入模型,能够捕捉词与词之间的关系(如类比),但对上下文的理解能力有限,且通常只处理单词级别。
相比之下,基于现代 Transformer 架构的 LLM(如 BERT, GPT, Llama 等)生成的 Embeddings 具有显著优势:
深度上下文理解 (Deep Contextual Understanding): LLM 在生成 Embedding 时会考虑词语所在的 完整上下文。同一个词在不同语境下会有不同的向量表示,能够更好地捕捉词语的多义性和细微差别。例如,“apple”在“I ate an apple”和“I bought an Apple laptop”中的 Embedding 会不同。
强大的语义捕捉能力 (Strong Semantic Capture): LLM 通过在海量数据上的预训练,学习到了丰富的语言知识和世界知识,其生成的 Embedding 能够更准确地捕捉文本的 深层语义、主题、情感甚至风格。
适用于不同粒度的文本 (Flexible Granularity): LLM 不仅可以生成单词的 Embedding,也可以直接生成 句子、段落甚至整个文档 的高质量 Embedding,方便应用于各种任务。
预训练模型的便捷性 (Pre-trained Model Availability): 我们可以直接使用大型科技公司或开源社区 预训练好的 LLM Embedding 模型 (通过 API 或库),无需自己从头训练,极大地降低了使用门槛。
因此,在当前的电商数据挖掘场景下,利用 LLM 获取高质量的文本嵌入向量,已经成为一种高效且强大的特征工程手段。
三、获取 Embeddings:API 与开源库实操
获取 Embeddings 主要有两种途径:调用云服务 API 或使用本地开源模型库。
1. 使用 OpenAI API 获取 Embeddings
OpenAI 提供了专门用于生成 Embeddings 的模型,例如 text-embedding-ada-002 (截至撰写时较常用且性价比高,请关注 OpenAI 最新推荐模型)。
import os
from openai import OpenAI
import pandas as pd
import numpy as np # 确保导入 numpy
# --- 安全地获取 API Key ---
# (同上一篇博客,推荐使用环境变量或文件读取)
api_key = "sk-YOUR_API_KEY_HERE" # !!! 务必替换 !!!
if not api_key or not api_key.startswith("sk-"):
print("错误:请设置有效 OpenAI API Key。")
else:
client = OpenAI(api_key=api_key)
embedding_model = "text-embedding-ada-002" # 指定嵌入模型
texts_to_embed = [
"这款手机拍照效果真好!",
"The camera quality of this phone is amazing!", # 英文示例
"电池续航有点短,其他都不错。",
"物流很快,包装也很好。"
]
try:
response = client.embeddings.create(
input=texts_to_embed,
model=embedding_model
)
# 提取嵌入向量
embeddings = [item.embedding for item in response.data]
print(f"
成功获取 {
len(embeddings)} 条文本的 Embeddings。")
print(f"第一个 Embedding 的维度: {
len(embeddings[0])}") # ada-002 的维度是 1536
print("第一个 Embedding (部分):", embeddings[0][:5], "...") # 打印前 5 维
# 可以将 Embeddings 添加到 DataFrame 中
df_embeddings_openai = pd.DataFrame({
'Text': texts_to_embed, 'Embedding': embeddings})
print("
包含 OpenAI Embeddings 的 DataFrame 预览:
", df_embeddings_openai.head())
except Exception as e:
print(f"
调用 OpenAI Embeddings API 时发生错误: {
e}")
代码解释:
embedding_model = "text-embedding-ada-002": 指定要使用的 OpenAI Embedding 模型。
client.embeddings.create(input=texts_to_embed, model=embedding_model): 调用 Embeddings API,input 参数接收一个 文本列表。
embeddings = [item.embedding for item in response.data]: API 返回结果中,每个文本对应的 Embedding 存储在 response.data[i].embedding 中,我们将其提取出来。
每个 Embedding 是一个 高维浮点数列表 (或 NumPy 数组),例如 text-embedding-ada-002 生成的是 1536 维的向量。
2. 使用 Hugging Face Transformers / Sentence-Transformers 获取 Embeddings (开源模型)
Hugging Face 生态提供了大量优秀的开源 Embedding 模型和方便易用的库。sentence-transformers 是一个基于 Transformers 的库,特别适合获取句子和段落级别的 Embedding。
首先,需要安装库:
pip install sentence-transformers
然后,使用代码获取 Embeddings:
from sentence_transformers import SentenceTransformer
import pandas as pd
import numpy as np # 确保导入 numpy
# 1. 加载预训练的 Sentence Transformer 模型
# 'all-MiniLM-L6-v2' 是一个常用且高效的英文模型,支持多种语言的模型也有,例如 'paraphrase-multilingual-MiniLM-L12-v2'
# 首次运行时会自动下载模型文件,可能需要一些时间
try:
# 优先尝试多语言模型,如果需要处理中文
# model_name = 'paraphrase-multilingual-MiniLM-L12-v2'
# 如果主要处理英文或只需要基础示例,可以用 MiniLM
model_name = 'all-MiniLM-L6-v2'
model = SentenceTransformer(model_name)
print(f"
成功加载 Sentence Transformer 模型: {
model_name}")
texts_to_embed = [
"这款手机拍照效果真好!", # 中文示例 (如果用多语言模型效果更好)
"The camera quality of this phone is amazing!",
"电池续航有点短,其他都不错。",
"物流很快,包装也很好。"
]
# 2. 计算 Embeddings
embeddings = model.encode(texts_to_embed) # 直接调用 encode 方法
print(f"
成功获取 {
len(embeddings)} 条文本的 Embeddings。")
print(f"第一个 Embedding 的维度: {
embeddings.shape[1]}") # MiniLM-L6-v2 维度是 384
print("第一个 Embedding (部分):", embeddings[0][:5], "...")
print("Embeddings 的类型:", type(embeddings)) # 返回的是 NumPy 数组
# 可以将 Embeddings 添加到 DataFrame 中
# 注意:这里 embeddings 是一个 NumPy 数组,每行是一个 embedding
df_embeddings_hf = pd.DataFrame({
'Text': texts_to_embed, 'Embedding': list(embeddings)}) # 转为列表存储到 DataFrame
print("
包含 Hugging Face Embeddings 的 DataFrame 预览:
", df_embeddings_hf.head())
except Exception as e:
print(f"
加载或使用 Sentence Transformer 模型时出错: {
e}")
print("请确保已安装 'sentence-transformers' 库,并检查网络连接以下载模型。")
代码解释:
from sentence_transformers import SentenceTransformer: 导入库。
model = SentenceTransformer('model_name'): 加载指定的预训练模型。'all-MiniLM-L6-v2' 是一个轻量级但效果不错的英文模型。如果需要处理多语言(包括中文),可以尝试 'paraphrase-multilingual-MiniLM-L12-v2' 等模型。
embeddings = model.encode(texts_to_embed): 调用模型的 encode() 方法,传入文本列表,直接返回 Embeddings (通常是 NumPy 数组)。
将 NumPy 数组转换为列表 list(embeddings) 再存入 DataFrame 是常见做法,因为 DataFrame 列直接存储 NumPy 数组有时会遇到兼容性问题,存储列表更通用。
选择 API 还是开源库?
快速开始/性能优先/不差钱: 选择 OpenAI API (text-embedding-ada-002 或更新模型)。
数据隐私/成本控制/需要微调: 选择 Hugging Face + 开源模型 (如 sentence-transformers)。
四、在 Pandas 中存储和使用 Embeddings
获取到的 Embeddings 本质上是数值向量(列表或 NumPy 数组)。我们可以将其作为新的一列添加到现有的 Pandas DataFrame 中。
# 假设 df_merged 是我们之前包含订单、产品、客户信息的 DataFrame
# 并且我们已经为其中的商品描述 'ProductName' 列获取了 Embeddings (假设存储在 product_embeddings 列表中)
# 确保 product_embeddings 列表长度与 df_merged['ProductName'].unique() 一致
# 这里仅作示意,实际需要根据 ProductID 匹配
# 假设 product_embeddings_dict = {'Laptop': [vec1], 'Mouse': [vec2], ...}
# df_merged['ProductEmbedding'] = df_merged['ProductID'].map(lambda pid: product_embeddings_dict.get(df_merged.loc[df_merged['ProductID']==pid, 'ProductName'].iloc[0]))
# 简化示例:假设我们直接有对应行的文本和 Embedding
df_demo = pd.DataFrame({
'Review': ["很棒!", "太差了", "还不错"],
# 假设 embeddings_list 是获取到的对应 Embedding 列表
'Embedding': [[0.1, 0.2, -0.1], [-0.5, 0.1, 0.8], [0.3, 0.4, 0.1]]
})
print("
包含 Embedding 列的 DataFrame:
", df_demo)
print("
Embedding 列的数据类型:", type(df_demo['Embedding'].iloc[0])) # 查看单个元素类型
输出:
包含 Embedding 列的 DataFrame:
Review Embedding
0 很棒! [0.1, 0.2, -0.1]
1 太差了 [-0.5, 0.1, 0.8]
2 还不错 [0.3, 0.4, 0.1]
Embedding 列的数据类型: <class 'list'>
有了包含 Embedding 列的 DataFrame,我们就可以进行后续的分析了。
五、电商实战:Embeddings 的初步应用
Embeddings 最直接的应用就是 量化语义相似度。我们可以使用 余弦相似度 (Cosine Similarity) 来衡量两个向量在方向上的接近程度(越接近 1 表示越相似,越接近 -1 表示越相反,接近 0 表示无关)。
1. 计算文本相似度
from sklearn.metrics.pairwise import cosine_similarity
# 假设我们有上面 df_embeddings_openai 的 Embeddings
openai_embeddings = np.array(df_embeddings_openai['Embedding'].tolist()) # 将列表转换为 NumPy 数组
# 计算第一条评论和第三条评论的相似度
# "这款手机拍照效果真好!" vs "电池续航有点短,其他都不错。"
similarity_0_2 = cosine_similarity(
openai_embeddings[0].reshape(1, -1), # reshape 成 (1, n_dims)
openai_embeddings[2].reshape(1, -1)
)
print(f"
评论 0 和评论 2 的余弦相似度: {
similarity_0_2[0][0]:.4f}")
# 计算第一条评论和第二条评论的相似度
# "这款手机拍照效果真好!" vs "The camera quality of this phone is amazing!" (语义相似)
similarity_0_1 = cosine_similarity(
openai_embeddings[0].reshape(1, -1),
openai_embeddings[1].reshape(1, -1)
)
print(f"评论 0 和评论 1 的余弦相似度: {
similarity_0_1[0][0]:.4f}") # 结果应该比较高
输出 (可能因模型和运行略有不同):
评论 0 和评论 2 的余弦相似度: 0.7889
评论 0 和评论 1 的余弦相似度: 0.9472
可以看到,语义相似的评论(即使语言不同)其 Embedding 的余弦相似度更高。
2. 应用场景示例
语义商品搜索:
获取用户搜索查询的 Embedding (query_embedding)。
获取所有商品描述的 Embeddings (product_embeddings)。
计算 query_embedding 与所有 product_embeddings 的余弦相似度。
按相似度降序排列,返回最相似的商品。
# query_embedding = model.encode("适合户外徒步的轻便鞋子")
# product_embeddings = model.encode(df_products['Description'].tolist())
# similarities = cosine_similarity(query_embedding.reshape(1, -1), product_embeddings)
# top_indices = np.argsort(similarities[0])[::-1] # 获取相似度最高的索引
# recommended_products = df_products.iloc[top_indices]
相似商品推荐:
获取用户购买/浏览过的商品 A 的 Embedding (embedding_A)。
获取其他所有商品的 Embeddings (other_embeddings)。
计算 embedding_A 与 other_embeddings 的余弦相似度。
推荐相似度高的商品。
# embedding_A = df_products.loc[df_products['ProductID'] == 'P001', 'Embedding'].iloc[0]
# similarities = cosine_similarity(np.array(embedding_A).reshape(1,-1), product_embeddings)
# ... 类似搜索的逻辑 ...
用户评论聚类:
获取所有用户评论的 Embeddings (review_embeddings)。
使用 K-Means 或其他聚类算法对 review_embeddings 进行聚类。
分析每个簇的评论内容,可以发现用户关注的不同主题或问题点。
# from sklearn.cluster import KMeans
# kmeans = KMeans(n_clusters=5, random_state=42, n_init='auto')
# cluster_labels = kmeans.fit_predict(review_embeddings)
# df_reviews['Cluster'] = cluster_labels
# # 分析每个 Cluster 的高频词或用 LLM 总结主题
作为机器学习特征:
获取需要预测的目标(如流失、购买)对应的文本数据的 Embeddings。
将 Embeddings 向量 直接或降维后 作为特征,与其他数值/类别特征合并。
输入到 Scikit-learn 模型进行训练和预测。
# X_text_features = np.array(df['ReviewEmbedding'].tolist())
# X_combined = np.hstack((X_traditional_features, X_text_features))
# model.fit(X_combined, y)
这些只是初步的应用示例,Embeddings 的潜力远不止于此。
六、LLM 提效加油站
在本篇学习了 LLM Embeddings 之后,你可以尝试让 LLM 帮助你:
解释 Embeddings 概念: “请用一个非技术的比喻解释一下什么是文本嵌入 (Text Embeddings)?它和关键词提取有什么不同?”
对比不同 Embedding 模型: “OpenAI 的 text-embedding-ada-002 和 Sentence-Transformers 的 all-MiniLM-L6-v2 在获取文本向量方面有什么主要区别?各自的优缺点是什么?”
生成获取 Embedding 的代码片段: “请给我一段 Python 代码,使用 sentence-transformers 库加载 ‘paraphrase-multilingual-MiniLM-L12-v2’ 模型,并计算列表 my_texts 中所有文本的嵌入向量。”
解释相似度计算: “什么是余弦相似度 (Cosine Similarity)?为什么它常用于比较文本嵌入向量的相似性?请给一个简单的计算例子。”
提供应用思路: “除了语义搜索和推荐,文本嵌入在电商领域还有哪些具体的应用场景?请举例说明。”
调试 Embedding 相关代码: “我运行 model.encode(texts) 时报错 CUDA out of memory,可能是什么原因?有什么解决方法?” (提示:可能是模型太大或文本太长,需要分批处理或使用更小模型/CPU)
小结一下
在本篇博客中,我们深入探讨了 LLM Embeddings 这一强大的特征工程技术:
理解了 Embeddings 的核心概念:将文本映射到语义向量空间。
认识到 LLM Embeddings 的优势:深度上下文理解和强大的语义捕捉能力。
掌握了获取 Embeddings 的两种主要途径:调用 OpenAI API 和使用 Hugging Face 开源模型库。
学会了在 Pandas 中存储和初步使用 Embeddings。
探索了 Embeddings 在电商语义搜索、相似推荐、评论聚类、模型特征增强等场景的应用潜力。
文本嵌入 (Embeddings) 是打通非结构化文本数据与结构化机器学习模型之间壁垒的关键桥梁。 掌握它,意味着你可以将 LLM 对语言的深刻理解能力,转化为可计算、可利用的特征,极大地扩展你的数据挖掘工具箱,为解决更复杂的电商问题提供了全新的思路和武器。
在下一篇博客中,我们将聚焦于无监督学习的第一个实战应用:智能用户分群。我们将学习如何将本篇获取的用户评论 Embeddings 或其他 LLM 提取的特征,与传统的用户行为数据相结合,利用 K-Means 等聚类算法,实现比以往更精准、更具洞察力的用户分群! 敬请期待! 😉

















暂无评论内容