第六章:项目实战之推荐/广告系统
第一部分:推荐系统基础与召回算法
第五节:召回算法之i2i: word2vec、item2vec、swing算法原理精讲与实战
一、i2i 召回算法概述:从“相似物品”开始理解召回
在推荐系统的召回阶段,我们的目标是——快速、粗粒度地从海量候选库中召回用户可能感兴趣的一批物品。
其中最经典的一类召回方式就是 i2i(item-to-item)召回:
核心思想:如果用户对某个物品感兴趣,那么推荐与它“相似的物品”。
举例:
用户买了 iPhone 手机 → 推荐手机壳、耳机、手机贴膜、iPad
用户看了《三体》 → 推荐《流浪地球》《球状闪电》《星际穿越》
i2i 的关键问题就是——如何衡量“物品与物品的相似度”。
本节我们将系统讲解召回中常见的 三类 i2i 相似度算法:
| 类别 | 算法 | 适合场景 | 优点 |
|---|---|---|---|
| 统计共现类 | Swing | 电商强行为序列数据 | 稳定、解释性强 |
| 语义嵌入类 | Word2Vec / Item2Vec | 用户行为有序列特征的数据 | 效果好,可扩展深度模型 |
| 协同类 | i2i CF(上一节讲过) | 基础召回场景 | 简单直接 |
今天我们重点讲:Word2Vec / Item2Vec + Swing
二、Item2Vec / Word2Vec:把“物品当单词,把行为当句子”
核心思想
Word2Vec 原本用于 NLP,通过“上下文预测中心词”学习词向量。
在推荐系统中,我们将行为序列类比为“句子”:
| NLP Word2Vec | 推荐系统 Item2Vec |
|---|---|
| 句子 | 用户行为序列 |
| 单词 | 物品 item |
| 词向量 | item embedding |
| 共现上下文 | 同一次 session 中 co-click/co-buy |
示例:
用户行为序列(session):
[苹果手机, 手机壳, 充电线, 耳机]
[鼠标, 键盘, 显示器]
就变成了 Word2Vec 的训练输入,学到 embedding 后:
-
cos(苹果手机, 手机壳) → 高
-
cos(鼠标, 西瓜) → 低
Item2Vec 的数学本质:
最大化物品在同一上下文出现的概率
实战代码(可直接跑)
from gensim.models import Word2Vec
# 用户行为序列
sessions = [
['iphone', 'case', 'charger', 'airpods'],
['mouse', 'keyboard', 'monitor'],
['iphone', 'airpods'],
]
# 训练Item2Vec模型
model = Word2Vec(sentences=sessions, vector_size=64, window=3, min_count=1, sg=1)
# 查询与 iphone 最相似的 item
model.wv.most_similar('iphone', topn=5)
输出示例:
[('airpods', 0.93), ('case', 0.89), ('charger', 0.85)]
优点:效果好,embedding可复用到粗排/精排
缺点:只适合序列数据
三、Swing 算法:适用于电商的强力 i2i 召回算法
Swing 是阿里沉淀出的经典 i2i 召回算法,本质属于基于物品共现 + 用户行为的加权相似度算法。
核心思想
如果 两个物品被同一批用户共同消费,就可以认为它们相似;
但要加权处理频繁用户和噪声行为,避免常见物品权重异常放大。
Swing 的核心相似度计算公式:
解释:
| 符号 | 含义 |
|---|---|
| i, j | 两个物品 |
| u, v | user pair |
| I(u) | 用户u消费过的物品集合 |
| α | 平滑系数防止过拟合 |
实战代码(简化版)
from collections import defaultdict
user_items = {
'u1': ['iphone', 'airpods'],
'u2': ['iphone', 'case'],
'u3': ['airpods', 'charger'],
}
swing = defaultdict(lambda: defaultdict(float))
alpha = 1.0
users = list(user_items.keys())
for i in range(len(users)):
for j in range(i+1, len(users)):
u, v = users[i], users[j]
common_items = set(user_items[u]) & set(user_items[v])
if common_items:
for item_u in user_items[u]:
for item_v in user_items[v]:
swing[item_u][item_v] += 1.0 / (len(common_items) + alpha)
优点:很适合电商/Feed 流真实业务
缺点:计算量大,需要 Spark/Flink
四、三种 i2i 的对比总结(面试与选型重点)
| 算法 | 最适用场景 | 优点 | 缺点 |
|---|---|---|---|
| Item2Vec | 有序点击/播放/浏览数据 | 捕捉语义,相似度更准 | 需要序列 |
| Swing | 电商 co-buy/co-view | 对抗热门物品,效果稳定 | 计算重 |
| i2i CF | 任意行为日志 | 简单高效 | 容易受热门干扰 |
业务选型经验
-
推荐 feed流 → Item2Vec
-
电商场景 → Swing
-
工业级多召回融合 → 三者一起 + 多路召回融合
五、本节小结
| 你应该已经掌握了: |
|---|
| i2i召回的意义与适用场景 |
| Item2Vec/Word2Vec 的核心思想与实现 |
| Swing算法公式、直觉与实战 |
| 三者如何在工业推荐系统中选型与融合 |

被折叠的 条评论
为什么被折叠?



