无论是在淘宝购物、在饿了么点外卖,还是在网易云音乐听歌、在抖音刷小视频,甚至是在招聘网站求职,我们总是避不开一个词语:猜你喜欢。
有时候,它叫「每日推荐」;有时候,它成了「综合排序」中的组成部分;有时候,它可能明确称为「广告」;也有时候,它就是你的列表中普通、平凡、毫无标识的一项;还有时候,它是通知栏推送过来的一条小提示。
今日头条和微博会直接把你最关心的新闻推送到你的时间流,让你不再需要从每天的报纸中翻找;淘宝和京东在你搜索商品后直接推荐给你最适合的价位、品牌,大大降低了购物的门槛;下午闲暇时光,豆瓣给你推送了书和电影,再和着网易云推送的几首小歌——科技给我们带来了慵懒的快乐,将选择强迫症们解放出来,真是令人心醉。
这样的推荐是如何做出的?为什么它们能够知道我所喜欢?以听歌为例,我们来尝试着设计一个最基础的推荐系统,为我们的听歌人兰兰推荐几首她可能喜欢的歌。
偏好收集
显式的偏好收集
巧妇难为无米之炊,如果没有对兰兰的基础认识,那么给她推荐歌曲就是盲人摸象、大海捞针。于是我们在歌曲推荐的伊始,就试着向兰兰提出几个问题:
- 你是男生还是女生?
- 你在哪个城市?
- 你比较喜欢听下述哪几种音乐类型?
- 你喜欢下面哪几首歌?
这些问题,有的比较直白,有的相对隐晦,但都是为了分析兰兰可能的喜好。这种直接的问询,可以称为「显式的偏好收集」。
隐式的偏好收集
相对的,当我们根据隐私政策,记录下兰兰在听歌过程中的操作:
- 快速地切换下一首
- 听完了整首歌曲
- 手动点击「喜爱」
- 分享给了微信朋友
这些行为被我们转译成兰兰对这首歌的喜好程度,从而完善了兰兰的听歌兴趣。相应的,我们把这个过程称为「隐式的偏好收集」。
两种方式各有利弊。显式的方式需要兰兰手动填写,兰兰会嫌麻烦,而且打扰了她听歌的心情,但是体现了兰兰自己的想法,更加准确、快速。而隐式的方式会自动收集数据,但是过度跟踪可能让兰兰比较反感,分析也容易产生比较大的噪音。
基于内容的推荐
现在,我们可以尝试给兰兰推荐音乐了。
基于内容的推荐策略十分简洁。我们假定已经对音乐库中的每一首歌充分解析,并给每一首歌打上了标签。那么,当兰兰听了一首歌,并对它表现出极大的兴趣,我们就从音乐库中寻找和这首歌标签相似的其他歌曲,推荐给兰兰。
举个例子,如果兰兰听了一首《两只老虎》,还加入了收藏夹。我们的系统记录下了这样一条:
- 兰兰喜欢听「儿歌」
于是,我们继续为她推送其他包含「儿歌」标签的歌曲,例如《小星星》。
整个过程完全依赖于歌曲之间的相似度,以及兰兰的偏好和歌曲之间的匹配程度。这还远远不够。
协同过滤
基于听歌人的协同过滤
为了给兰兰推荐更多好听的歌,我们又邀请了两个听歌人,小明和小玲。
这一次,小明、小玲、兰兰分别在自己的房里听歌。在听完《星星点灯》、《给自己的歌》之后,小明和兰兰都对这两首歌十分喜欢,而小玲却丝毫不感兴趣。那么,我们的系统记录下了这样一条:
- 小明和兰兰的听歌兴趣相似
我们挖了挖小明以前听过的歌,发现他也很喜欢《南方姑娘》。既然我们的系统认为小明和兰兰的爱好相近,于是我们尝试给兰兰推荐了这首《南方姑娘》。
因为这种方式是对听歌人进行分析,所以我们不妨把它称为「基于听歌人的协同过滤」。
基于歌曲的协同过滤
我们继续邀请其他听歌人进来为我们提供兴趣数据。这次,我们邀请到了小红和小白。
我们依然让他们各自在房里听歌。听了《梦醒时分》和《大海》之后,小红、小白不约而同地对它们表现出了极大的喜爱。这一次,我们的系统是这样记录的:
- 《梦醒时分》和《大海》具有相似的听众
当我们惊喜地发现兰兰也喜欢《梦醒时分》的时候,我们觉得她很可能也喜欢《大海》,于是就为她推送了这首歌。
这种方式的分析对象从听歌人换成了歌曲本身,我们可以称之为「基于歌曲的协同过滤」。
非个性化的推荐
前面介绍的几种方式,都可以使得每个人收到的歌单各不相同,称为「个性化推荐」。最后,我们还需要加入一些非个性化的推荐技术,来让我们的推荐系统更加实用。
我们首先加入「新歌榜」,这是对「新增内容」的一种优先策略。由于新歌刚刚加入曲库,数据还不足以支撑起推荐给大量听歌人,对新歌的优先策略可以给它们提供一定的冷启动过程。
我们还要加入「热歌榜」,这是对「热点内容」的优先策略。一首歌之所以会成为热门歌曲,大概就是符合大部分人的审美。虽然许多人通过个性化推荐的策略并没有匹配到这首歌,但是既然符合大部分人的审美,说不定他们也会喜欢这首热门歌曲,不妨一试。
这些个性化或者非个性化的推荐分别得到了一系列歌单,将它们按一定比例交替出现,亦或在不同的区域中分别展示,就成了我们为听歌人们推荐各自推荐的「猜你喜欢」啦。
