推荐系统中的“嵌入“:篇一

#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, ...]  

现在模型已经理解了每首歌的“位置”。推荐就是查最近邻。

# 假设 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 跑一下,你就能得到一个不需要打标签的智能推荐系统。