Python 数据智能实战 (5):语义购物篮分析 – 从“常一起买”到“为何一起买”的深度洞察

写在前面

—— 超越频繁项集,挖掘商品语义关联与互补性,驱动更智能的推荐与组合策略

今天,我们将把目光转向另一个电商运营的核心场景:购物篮分析 (Market Basket Analysis),并探索如何利用 LLM 为其注入 “语义理解” 的能力,从而挖掘出远超传统方法的深度洞察。

传统的购物篮分析,最经典的算法莫过于 Apriori。它通过计算 支持度 (Support)置信度 (Confidence)提升度 (Lift) 等指标,能够有效地发现那些 经常被用户同时购买的商品组合(频繁项集和关联规则)。例如,我们可能会发现:

{牛奶, 面包} -> {黄油} (买了牛奶和面包的人,有较高概率会买黄油)
{纸尿裤} -> {啤酒} (经典的“啤酒与尿布”案例)

这些发现对于优化商品陈列、设计捆绑促销、进行基础的交叉推荐等无疑是有价值的。

但是,这种基于“共现频率”的分析方法,也存在明显的局限性:

无法理解“为什么”: 它告诉我们 A 和 B 经常 一起买,但无法解释 为什么。是因为它们 功能互补(如相机和存储卡)?风格搭配(如某款连衣裙和某款项链)?替代品关系(用户可能对比后选择了其中一个,但下次可能买另一个)?还是仅仅因为 促销捆绑?缺乏对商品 内在关系 的理解。
难以发现“新品”或“长尾”关联: Apriori 算法依赖于足够高的 支持度(出现频率),对于那些 销量不高但潜力巨大 的新品,或者 购买频次较低但搭配性很强 的长尾商品,传统方法很难挖掘出有意义的关联规则。
忽略商品“本质”: 它将 “iPhone 15 Pro 充电线” 和 “Apple USB-C to Lightning 数据线” 视为两个完全不同的商品,除非我们手动进行大量的 商品归一化或打标签 工作,否则无法识别它们在功能上的高度相似性。
推荐缺乏“新意”和“理由”: 基于高频共现的推荐往往容易陷入“马太效应”,总是推荐那些热门组合,难以给用户带来惊喜。同时,推荐理由也常常是“购买了 A 的人也购买了 B”,缺乏更具说服力的解释。

如何突破这些瓶颈,让购物篮分析更“智能”,推荐更“懂你”?

答案依然指向我们正在探索的强大工具——大语言模型 (LLM),特别是其 理解文本语义生成嵌入向量 (Embeddings) 的能力!

本篇博客,我们将实战演练:

快速回顾传统关联规则挖掘 (Apriori) 的基本概念与局限。
引入基于 LLM Embeddings 的语义相似度计算,发现“看起来不像但本质相似”的商品。
探索挖掘商品间“互补性”关系的新思路 (结合 Embeddings 与 LLM 推理)。
讨论如何将语义关联应用于更智能的商品推荐策略。
提供 Python 代码示例的核心思路与关键实现。

通过本篇学习,你将掌握利用 LLM 升级购物篮分析的方法,从简单的共现统计迈向更深层次的语义关联挖掘,为你的推荐系统和营销策略注入新的智能!

一、温故知新:传统关联规则挖掘 (Apriori) 与其局限

在深入 LLM 之前,我们先简单回顾下 Apriori 算法的核心概念(如果你不熟悉,可以查阅相关资料或我们之前的机器学习初步介绍):

项集 (Itemset): 一组一起出现的商品集合,例如 {牛奶, 面包}
支持度 (Support): 一个项集在所有交易中出现的频率(比例)。Support({牛奶, 面包}) = 同时包含牛奶和面包的订单数 / 总订单数。支持度用于筛选掉不常见的项集。
置信度 (Confidence): 规则 X -> Y 的置信度表示购买了项集 X 的用户中,有多大比例也购买了项集 Y。Confidence({牛奶, 面包} -> {黄油}) = Support({牛奶, 面包, 黄油}) / Support({牛奶, 面包})。置信度衡量规则的可靠性。
提升度 (Lift): 规则 X -> Y 的提升度表示购买项集 X 对购买项集 Y 的概率提升了多少倍 (相比于不考虑 X 单独购买 Y 的概率)。Lift(X -> Y) = Confidence(X -> Y) / Support(Y)

Lift > 1: X 和 Y 之间存在正相关关系(购买 X 提升了购买 Y 的概率)。
Lift < 1: X 和 Y 之间存在负相关关系。
Lift = 1: X 和 Y 之间可能独立。

Python 实现 (常用库): mlxtend 库提供了 Apriori 和关联规则挖掘的方便实现。

# 伪代码示例 (假设已有 one-hot 编码的交易 DataFrame: df_trans_onehot)
# from mlxtend.frequent_patterns import apriori, association_rules

# # 1. 计算频繁项集 (设置最小支持度阈值)
# frequent_itemsets = apriori(df_trans_onehot, min_support=0.01, use_colnames=True)

# # 2. 生成关联规则 (设置最小置信度或提升度阈值)
# rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.5)
# rules = rules.sort_values(['confidence', 'lift'], ascending=[False, False])
# print("挖掘出的关联规则:
", rules)

局限性重述:

依赖高频共现: 难以发现低频但有价值的关联。
忽略商品语义: 无法理解商品之间的内在联系。
无法处理“未购买”信息: 只关注一起买了什么,不关注买了 A 但没买 B 的情况。
推荐可能缺乏新意和解释性。

二、语义相似度:用 Embeddings 发现“同类”商品

LLM Embeddings 为我们提供了一种全新的视角来看待商品。不再是孤立的 ID 或名称,而是 嵌入在语义空间中的向量。我们可以通过计算这些向量的 余弦相似度 来发现那些 描述相似、功能相近、风格类似 的商品,即使它们的名字完全不同,或者从未在历史订单中一起出现过。

实现步骤:

为商品生成 Embeddings:

数据源: 利用商品的 名称 (ProductName)、描述 (Description)、类别 (Category)、关键属性 (Attributes) 等文本信息。信息越丰富,Embedding 质量通常越高。
方法: 使用上一篇学习的方法,通过 OpenAI API 或 Sentence Transformers 等库,为每个商品生成 Embedding 向量。
存储: 将生成的 Embedding 向量存储回 products DataFrame 或一个专门的查找表中(例如以 ProductID 为 Key)。

# --- 假设已为 products DataFrame 生成 Embedding 列 'Embedding' ---
# (需要自行实现 Embedding 获取代码)
# 假设 products DataFrame 如下:
#   ProductID ProductName     Category  Price          Embedding
# 0      P001      Laptop  Electronics   8000  [0.1, 0.8, ...]
# 1      P002       Mouse  Accessories    150  [0.3, 0.2, ...]
# ...

# 提取所有商品的 Embeddings 到一个 NumPy 数组中,方便计算
all_product_embeddings = np.array(products['Embedding'].tolist())
all_product_ids = products['ProductID'].tolist()
product_id_to_index = {
              pid: i for i, pid in enumerate(all_product_ids)}
index_to_product_id = {
              i: pid for i, pid in enumerate(all_product_ids)}

计算余弦相似度:

使用 sklearn.metrics.pairwise.cosine_similarity 计算任意两个商品 Embedding 之间的余弦相似度。

查找最相似的商品:

给定一个目标商品,计算其 Embedding 与其他所有商品 Embedding 的相似度。
对相似度进行排序,找到最相似的 Top N 个商品。

from sklearn.metrics.pairwise import cosine_similarity

def find_similar_products(target_product_id, top_n=5):
    """根据 Embedding 查找语义最相似的 Top N 商品"""
    if target_product_id not in product_id_to_index:
        print(f"错误:未找到商品 ID {
              target_product_id}")
        return None

    target_index = product_id_to_index[target_product_id]
    target_embedding = all_product_embeddings[target_index].reshape(1, -1)

    # 计算目标商品与所有商品的余弦相似度
    similarities = cosine_similarity(target_embedding, all_product_embeddings)[0] # [0] 获取二维结果的第一行

    # 获取相似度最高的 Top N 商品的索引 (排除自身)
    # argsort() 返回排序后的原始索引,[::-1] 实现降序
    similar_indices = np.argsort(similarities)[::-1]

    # 排除自身,获取 Top N
    top_similar_products = []
    for i in similar_indices:
        if i != target_index: # 跳过自身
            similar_product_id = index_to_product_id[i]
            similarity_score = similarities[i]
            product_info = products[products['ProductID'] == similar_product_id][['ProductName', 'Category']].iloc[0]
            top_similar_products.append({
            
                'ProductID': similar_product_id,
                'ProductName': product_info['ProductName'],
                'Category': product_info['Category'],
                'Similarity': similarity_score
            })
            if len(top_similar_products) >= top_n:
                break

    return pd.DataFrame(top_similar_products)

# 示例:查找与 'Laptop' (P001) 最相似的商品
similar_to_laptop = find_similar_products('P001', top_n=3)
if similar_to_laptop is not None:
    print("
与 Laptop (P001) 最相似的 Top 3 商品:
", similar_to_laptop)

# 示例:查找与 'Mouse' (P002) 最相似的商品
similar_to_mouse = find_similar_products('P002', top_n=3)
if similar_to_mouse is not None:
    print("
与 Mouse (P002) 最相似的 Top 3 商品:
", similar_to_mouse)

预期结果(取决于 Embedding 质量):

与 Laptop 相似的可能是其他型号的笔记本电脑、平板电脑、甚至高性能台式机(如果描述侧重性能)。
与 Mouse 相似的可能是其他鼠标、键盘、摄像头等电脑配件。

应用场景:

“看了又看” / “相似商品” 推荐: 在商品详情页展示语义相似的商品。
商品聚合与去重: 发现描述不同但本质相同的商品。
优化搜索结果: 当用户搜索某个商品时,可以展示语义相似的替代品或相关品。

三、探索互补性:挖掘“搭配”关系

仅仅找到相似的商品是不够的,用户常常需要购买 功能上互补 的商品。例如,买了相机的人需要存储卡,买了手机的人可能需要手机壳和充电器,买了连衣裙的人可能需要搭配的鞋子和包。

利用 LLM Embeddings 挖掘互补性比挖掘相似性更具挑战性,因为互补商品的 Embedding 在语义空间中 不一定接近。以下是一些探索思路:

思路一:结合交易数据与语义过滤 (间接方法)

使用传统关联规则挖掘 (Apriori): 先找出与目标商品 A 高频共现 的商品集合 B。
获取商品 Embeddings: 获取 A 和集合 B 中所有商品的 Embeddings。
利用 LLM 进行语义关系判断 (Prompting): 设计 Prompt,让 LLM 判断集合 B 中的每个商品 b 与商品 A 之间是否存在 互补关系

Prompt 示例: “商品 A 是 ‘[商品 A 的描述]’。商品 B 是 ‘[商品 B 的描述]’。请判断商品 B 是否是商品 A 的常见互补品(例如,功能上配合使用、风格上搭配等)?请回答 ‘是’ 或 ‘否’,并简要说明理由。”

筛选结果: 保留那些既高频共现,又被 LLM 判断为具有互补关系的商品。

这种方法结合了历史购买行为和语义理解,相对可靠,但需要调用 LLM 进行多次判断,成本可能较高。

思路二:基于用户行为序列的 Embeddings (更高级)

构建用户行为序列: 获取用户的点击、加购、购买等行为序列。
训练序列 Embedding 模型: 使用类似 Word2Vec 的思想 (如 Prod2Vec) 或更复杂的序列模型 (如 RNN, Transformer) 学习商品在用户行为序列中的 Embedding。在这种 Embedding 空间中,经常 连续出现在相似上下文 中出现的商品(可能代表互补关系)其向量表示可能会更接近或具有特定关系。
计算相似度/关联度: 在这个新的 Embedding 空间中计算商品间的关系。

这种方法技术门槛较高,需要专门的模型训练。

思路三:利用 LLM 的知识和推理能力 (直接方法,实验性)

设计巧妙的 Prompt: 直接向 LLM 提问,利用其内置的世界知识和一定的推理能力来推荐互补品。

Prompt 示例 1: “我正在浏览一款 ‘[商品名称/描述]’。请推荐 3-5 款功能上或使用场景上与之互补的商品。”
Prompt 示例 2: “以下是一位用户的近期购买记录:[‘商品A’, ‘商品B’]。根据这些商品,请推测该用户的潜在需求,并推荐 3 款可能与之搭配或满足其后续需求的商品。”

结果解析与验证: LLM 的回答可能很有启发性,但需要结合实际销售数据和业务逻辑进行验证和筛选,因为 LLM 可能产生“幻觉”或推荐不存在/不合理的商品。

这种方法最直接,但结果的可靠性最需要验证,更适合用于产生候选集或启发思路。

目前,结合交易数据与 LLM 语义判断 (思路一) 或利用特定训练的 Embeddings (思路二) 是相对更成熟的挖掘互补性的方法。直接依赖 LLM 推理 (思路三) 仍处于探索阶段。

四、融合语义关联进行智能推荐

将 LLM 带来的语义理解能力融入推荐系统,可以带来显著的提升:

冷启动优化: 对于新用户或新商品,缺乏行为数据,传统推荐方法效果不佳。但我们可以利用 LLM 分析新商品的 描述文本,找到与其语义相似的 已有热门商品,将热门商品的推荐策略 迁移 到新商品上;或者分析新用户的 初始注册信息或搜索词,理解其大致兴趣,进行基于内容的语义推荐。
提升推荐多样性与新颖性: 除了推荐“常一起买”的商品,还可以推荐 语义相似 (同类替代品) 或 语义互补 (搭配使用) 的商品,增加推荐的多样性,给用户带来惊喜。
生成可解释的推荐理由: 利用 LLM 的文本生成能力,为推荐结果生成 自然语言的推荐理由,而不仅仅是“购买此商品的人还购买了…”。例如:“为你推荐这款镜头,因为它与你刚购买的相机 [相机型号] 兼容,并且非常适合拍摄人像。” 这能显著提高用户的信任度和点击率。
情境感知推荐: (更高级) 结合用户当前的 浏览上下文、搜索意图、甚至对话内容 (如果是在 chatbot 中),利用 LLM 理解用户的 即时需求,动态调整推荐策略。

五、LLM 提效

在学习本篇语义购物篮分析的过程中,LLM 可以有多个用处:

理解关联规则指标: “请用通俗的语言解释一下关联规则挖掘中的支持度、置信度和提升度分别是什么意思?它们各自有什么优缺点?”
对比分析方法: “基于 Apriori 的购物篮分析和基于商品 Embeddings 的相似度分析,在发现商品关联方面有什么主要区别和适用场景?”
代码生成辅助: “请给我一段 Python 代码,计算两个 NumPy 向量 vec1vec2 之间的余弦相似度。” 或 “如何使用 scikit-learn 的 cosine_similarity 计算一个目标向量 target_vec 与一个向量矩阵 embedding_matrix 中所有向量的相似度?”
Prompt 设计探讨: “我想让 LLM 判断商品 A 和商品 B 是否是互补品,应该如何设计 Prompt?需要提供哪些信息?”
推荐系统知识: “什么是协同过滤推荐算法?它和基于内容的推荐有什么不同?LLM Embeddings 可以用于哪种推荐方法?”
头脑风暴: “我正在分析一个美妆电商的数据,除了相似商品和互补商品,利用商品 Embeddings 还能做哪些有趣的分析或应用?”

小结一下

在本篇博客中,我们探讨了如何利用大语言模型 (LLM) 为传统的购物篮分析注入新的活力:

认识到传统关联规则挖掘的局限性:主要在于缺乏对商品语义和内在关系的理解。
掌握了利用 LLM Embeddings 计算商品语义相似度的方法:发现了发现“同类”商品的新途径。
探索了挖掘商品互补性的几种思路:结合交易数据、行为序列或 LLM 推理。
了解了语义关联如何赋能更智能的推荐系统:优化冷启动、提升多样性、生成推荐理由等。

通过融合 LLM 的语义理解能力,我们可以将购物篮分析从简单的“共现统计”提升到更深层次的“关系挖掘”,从而制定更精准、更智能的商品推荐、交叉销售和组合营销策略。

这仅仅是 LLM 赋能无监督学习的又一个精彩实例。 用户分群关注“人”,购物篮分析关注“货”,而将这两者结合起来,我们就能更好地理解“什么样的人,在什么场景下,会购买什么样的货”,从而实现更精细化的运营。

下一篇,我们将继续聚焦于电商中价值密度最高的非结构化数据——用户评论!我们将实战演练如何利用 LLM 对海量评论进行深度挖掘,自动发现用户关注的核心主题和情感趋势

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容