推荐系统中的“嵌入“:篇二
#2025/12/28 #ai
“如何用 NLP 技术‘偷懒’来做一个高效的推荐引擎”。
这一节的核心思想非常精彩:把业务数据伪装成文本,然后直接套用语言模型算法。
我们不需要学习复杂的推荐算法(如矩阵分解),只需要复用上一节学到的 word2vec 即可。
目录
1. 核心思想:万物皆可是“句子”
在 NLP 中,我们假设“经常出现在一起的词,意思相近”。 在业务中,我们可以假设“经常出现在同一个列表里的物品,品味相近”。
这一节展示了如何通过“概念映射”,把推荐问题转换成 NLP 问题:
| NLP 概念 | 推荐系统/业务概念 (映射) |
|---|---|
| 单词 (Word) | 歌曲 (或者商品、视频、文章) |
| 句子 (Sentence) | 歌单 (或者购物车、用户浏览记录、Session) |
| 语料库 (Corpus) | 所有歌单的集合 (List of Lists) |
工程师视角: 你不需要关心单词的语法,你只需要关心 ID 的序列。只要你的数据是 List<List<Item_ID>> 这种格式,你就可以把它喂给 NLP 模型。
2. 实战案例:音乐推荐系统
书中通过一个具体的音乐推荐案例演示了这个过程。
- 数据准备: 我们要处理的不是文本字符串,而是用户创建的歌单 (Playlists)。
- 歌单 A:
[Song_1, Song_2, Song_13] - 歌单 B:
[Song_2, Song_13, Song_82] - 这在代码里就是一个
二维数组(Python List of Lists 或 JS Array of Arrays)。
- 歌单 A:
- 训练过程 (Magic Happens): 直
- 接把这个二维数组扔给
gensim的Word2Vec模型。 - 模型虽然名字叫 “Word“2Vec,但它根本不在乎输入的是单词还是歌曲 ID。 它会根据共现关系(Song_2 和 Song_13 经常挨在一起)来学习。
- 接把这个二维数组扔给
- 结果: 训练完成后,每首歌(ID)都会变成一个
向量 (Embedding)。- 就像 “King” 和 “Queen” 的向量很近一样。
- 经常在同一个歌单里出现的 “Michael Jackson” 和 “Prince” 的歌曲,它们的向量距离也会非常近。
3. 代码实现:简单得令人发指
对于 Python 工程师来说,实现一个基于 Embedding 的推荐系统核心代码可能只需要几行:
from gensim.models import Word2Vec
# 1. 准备数据:把业务数据整理成“句子”列表
# 这里每个子列表是一个歌单,里面的元素是歌曲ID
playlists = [
['song_1', 'song_5', 'song_10'],
['song_1', 'song_2', 'song_5'],
# ... 成千上万个歌单
]
# 2. 训练模型:直接把歌单当文本喂进去
# window=20 表示:一首歌前后20首歌都算“上下文”
model = Word2Vec(playlists, vector_size=32, window=20, min_count=1)
# 3. 业务应用:获取推荐
# 用户正在听 'song_1',系统推荐最相似的歌
recommendations = model.wv.most_similar('song_1')
# 输出可能就是 ['song_5', ...],因为它们经常一起出现
4. 这种方法的优势
对于工程师来说,这种方法有两个巨大的好处:
- 不需要元数据: 你根本不需要知道这首歌是“摇滚”还是“流行”,也不需要知道 BPM 是多少。只要用户把它们放在一起,模型就能学会它们的隐含关系(User-driven)。
- 极高的性能: 这种基于 Embedding 的检索(向量近邻搜索)速度非常快,非常适合在线实时推荐。
总结
- 不要被“语言模型”这个名字限制住。
- 只要你的业务数据具有 “序列” (Sequence) 属性(用户点击流、购买历史、歌单),你就可以把它看作一种 “语言”。
- 把物品 ID 当作单词,把行为序列当作句子,直接用 word2vec 训练,你就能得到一个效果惊人的推荐系统。