推荐系统中的“嵌入“:篇一
#2025/12/28 #ai
“词”可以变成向量,“句子”也可以变成向量。
如果把这个思路搬到“推荐系统”里,做个网易云音乐那样的歌曲推荐功能。
这就是 “万物皆可 Embedding” 的核心奥义。
目录
💡 核心脑洞:把“歌单”当成“句子”
| NLP 里的概念 | 音乐推荐里的概念 | 程序员视角的数据结构 |
|---|---|---|
| 句子 (Sentence) | 歌单 (Playlist) | ["song_id_1", "song_id_2", "song_id_3"] |
| 单词 (Word) | 歌曲 (Song) | "song_id_1" |
| 语义 (Meaning) | 曲风/品味 (Genre) | 向量 [0.1, 0.9, ...] |
核心逻辑:
- 在 NLP 里,如果 “King” 和 “Queen” 经常出现在同一个句子里,它们就是相关的。
- 在推荐系统里,如果 “七里香” 和 “晴天” 经常出现在
同一个用户的歌单里,那它们就是相关的(即使没有任何人给它们打标签说这是周杰伦的歌)。
🛠️ 实战三步走
我们使用 Python 里的 gensim 库(就是跑 word2vec 的那个库),代码几乎一模一样。
第一步:准备数据
不需要复杂的特征工程(比如分析BPM、歌词、乐器),只需要用户的行为记录。
# 你的原始数据可能长这样(JSON 格式)
playlists_data = [
# 歌单 1:一位摇滚迷
["Linkin Park_Numb", "Bon Jovi_It's My Life", "Green Day_Holiday"],
# 歌单 2:一位周杰伦迷
["JAY_七里香", "JAY_晴天", "JAY_稻香"],
# ... 成千上万个歌单
]
第二步:训练模型 (Word2Vec)
把歌单喂给 Word2Vec。这里有个小技巧:窗口大小 (Window) 要设大一点。
- NLP 里:
- 窗口通常是 5(看前后 2 个词)。
- 歌单里:
- 窗口设为 20 或更大。因为歌单里第 1 首歌和第 10 首歌可能都是用户喜欢的同一类风格,跨度比句子大。
from gensim.models import Word2Vec
# 训练!
# sentences: 输入数据(其实是歌单列表)
# vector_size: 每个歌变成多少维的向量(比如 32 维)
# window: 上下文窗口(这里设 20,表示看前后 20 首歌)
model = Word2Vec(
sentences=playlists_data,
vector_size=32,
window=20,
min_count=1,
workers=4
)
# 训练完这一步,每首歌都有了一个向量:[0.21, -0.55, ...]
第三步:开始推荐 (Search)
现在模型已经理解了每首歌的“位置”。推荐就是查最近邻。
# 假设 song_id_2172 是 Metallica 的 "Fade To Black"
target_song = "2172"
# 问模型:谁跟它最像?
recommendations = model.wv.most_similar(target_song, topn=5)
# 输出结果:
# [('2976', 0.99), # 可能是 Guns N' Roses
# ('3167', 0.98), # 可能是 AC/DC
# ...]
结果:你扔进去一首重金属,它吐出来一堆重金属。哪怕它根本不知道这首歌叫什么,也没听过音频,它只是通过“大家经常把这几首歌放一起听”这个规律学到的。
🚀 为什么这比传统 SQL 查询强?
假设你用 SQL 写推荐:
-- 传统的基于标签的推荐
SELECT * FROM songs WHERE genre = 'Rock' AND artist = 'Metallica';
缺点:你需要人工维护 genre 标签。如果新出了一首很难定义的歌怎么办?
Embedding 的优势:
- 它是
无监督学习。只要用户把新歌加进歌单,模型下次重训时,就会自动发现:“哦,这首新歌经常和 Lady Gaga 放在一起,那它大概率是 Pop 舞曲。”
🧠 举一反三:电商与浏览历史
这个逻辑不仅仅用于歌单,它在互联网大厂里被疯狂复用,比如 Item2Vec:
- 电商:
- 句子 = 用户的一次购物 Session (购物车)
- 单词 = 商品
- 训练结果:
买了“尿布”的人通常也会买“啤酒”。
- 视频网站:
- 句子 = 用户的观看历史序列
- 单词 = 视频 ID
- 训练结果:
- 看了《三体》第一集的人,大概率会看第二集。
📝 一句话总结
- 把用户的行为序列(歌单、购物车、浏览记录)看作“
句子” - 把物品(歌、商品)看作“
单词”, - 扔进 Word2Vec 跑一下,你就能得到一个不需要打标签的智能推荐系统。