如何只使用标签来构建一个简单的电影推荐系统
作者:Johnson Kuan
编译:ronghuaiyang
导读
使用基于内容的方法来找到最相似的电影。
介绍
假设你正在推出下一个非常大的订阅视频点播(SVOD)流媒体服务,并且你已经获得了过去 100 年里发行的所有主要电影的流媒体权。祝贺你,这是不可思议的壮举!
现在你有了很多电影。如果没有推荐系统,你就会担心随着时间的推移,用户可能会被他们不关心的电影所淹没。这可能会导致客户流失,这是你最不想看到的!
所以你决定建立一个电影推荐系统。由于你的服务是新的,所以你还没有足够的数据来了解哪些用户正在观看哪些电影。这就是所谓的冷启动问题,它不能让你仅根据用户的历史收视记录来推荐电影。
幸运的是,即使没有足够的观看数据,我们仍然可以建立一个像样的电影元数据推荐系统。这就是 MovieLens 的作用所在。MovieLens 提供了一个公共数据集,其中包含每个电影的关键字标签。这些标签信息量很大。例如,看看 Good Will Hunting 的最重要的社群标签。
在这篇文章的其余部分,我将回答三个业务问题,这三个问题对于构建一个简单的基于内容的推荐系统非常关键,其中的标签来自 MovieLens:
- 每部电影需要多少个标签?
- 我们如何使用标签来衡量电影之间的相似性?
- 我们如何使用标签为用户生成电影推荐?
这个分析的代码可以在这里找到: https://github.com/JohnsonKuan/movie-rec-tags,以及数据和 Conda 环境 YAML 文件,以便你轻松地复现结果。
1) 每部电影我们需要多少个标签?
MovieLens 标签数据集中大约有 10K 个不一样的电影和 1K 个不一样的标签。每部电影的每个标签都有一个相关分数,所以大约有 1000 万个电影标签对。相关性得分范围为 0 到 1。
并不是每个标签都与电影相关,所以我们只需要保留最相关的标签。首先,我们可以根据相关评分对每部电影的标签进行排序。例如,下面是 Remember the Titans 的 top10 标签。请注意,相关性评分远远高于 0.9,这表明它们是非常相关的标签。
基于相关性得分的前 10 个标签(降序排列)
接下来,我们在下面的图中确认,电影的高排名标签往往具有较高的中值相关性得分。电影的排第一个的标签的中值相关度几乎是 1。我们可以看到,当我们下降到第 50 位时,中值相关性得分逐渐下降。
为了找到与电影最相关的标签,我们可以根据相关性评分保留电影的前 N 个标签。在这里,我们需要仔细挑选。如果 N 很小,我们有非常相关的但是很少的标签。如果 N 很大,我们有很多标签,但是其中很多可能是无关的。
下面的图显示了从第 1 个标签到第 100 个标签的中值的变化百分比。当相关性得分开始变得更稳定时,我们看到在第 50 位附近有一个拐点。因此,我们可以选择 N =50 作为每个电影保留的合理数量的标签。注意,这是一个相当简单的“拐点方法”风格的方法,可以在以后进行优化。
现在我们可以得到每个电影的前 50 个标签的列表,我们将在下一节中使用它们。例如,Toy Story 的前 50 个标签如下。
2) 我们如何使用标签来度量电影之间的相似度?
在为用户生成电影推荐之前,我们需要一种基于电影的前 50 个标签的相似性度量方法。在基于内容的推荐系统中,用户将被推荐与他们已经看过的电影相似的电影。
在这里,我会演示两种度量相似性的方法:
-
两个电影标签集合的 Jaccard Index
-
基于标签的电影向量(即内容嵌入)的余弦相似度。
Jaccard Index
使用 Jaccard Index 的第一种方法度量两个集合 A 和 B 之间的相似性,即交集的大小除以并集的大小。在度量电影之间的相似性时,我们可以计算这两组电影标签的索引。
![img](How to Build a Simple Movie Recommender System with Tags.assets/1_bBlhtLhCK95zNFGrGcUCTg.png)
例如,我们有三个电影下面和他们的前 3 个标签:
-
电影 A 的标签 =(动作,空间,友情)
-
电影 B 的标签 =(冒险,太空,友谊)
-
电影 C 的标签 =(浪漫,喜剧,成长)
直观上,我们可以看出电影 A 与 B 更相似,而不是 C。这是因为电影 A 和 B 共享两个标签(空间,友情),而电影 A 和 C 不共享任何标签。
下面是基于 Jaccard Index 的与 Good Will Hunting 相似的 10 部电影。对于 Good Will Hunting 的观众来说,这些建议似乎是合理的。注意,我在列表中包括了 Good Will Hunting,以显示在比较电影本身时 Jaccard Index=1。
基于 Jaccard Index 的标签集的类似 Good Will Hunting 的电影
以下是 10 部与 Interstellar 相似的电影。对于 Interstellar 的观众来说,这些建议似乎也很合理。
基于 Jaccard Index 的标签集的类似 Interstellar 的电影
为了进一步说明 Jaccard Index 的有效性,请看下面基于和 Interstellar 相似的电影的标签频率的词云。在这里,我们可以看到哪些标签在相似性计算中更加突出(例如科幻小说,伟大的结局,反乌托邦的未来,哲学,大脑)。
基于和 Interstellar 相似的电影的标签频率的词云
电影向量(也就是内容嵌入)的余弦相似度
第一个使用 Jaccard Index 的方法帮助我们建立了一种关于与标签相似的含义的直觉。基于余弦相似度的第二种方法稍微复杂一点。它要求我们把电影表示成一个向量。这里,向量就是一组数字。
例如,我们可以用三个实数来表示三个相同的电影:
-
电影 A = (1.1, 2.3, 5.1)
-
电影 B = (1.3, 2.1, 4.9)
-
电影 C = (5.1, 6.2, 1.1)
直观上,我们可以再次看到电影 A 与 B 更相似,而不是 C。这是因为电影 A 和 B 在每个维度上有更接近的数字(例如第一个维度是 1.1 vs 1.3)。
为了找到一个好的向量表示的电影,我使用了 Doc2Vec (PV-DBOW) 技术,我们拿到一个电影(文档),并基于标签(文档中的词)学习一个到潜在 K 维空间的映射。我不会在这里深入讨论细节,但这是我们如何基于标签将电影表示为向量的方法。
Doc2Vec 论文中对 PV-DBOW 技术的可视化,对于每个段落 ID (movie),我们训练一个模型来预测该段落中某个单词(movie tag)的共现性
一旦我们可以把每一部电影表示成一个向量,我们就可以计算向量之间的余弦相似度来找到相似的电影。我不会在这里详细介绍余弦相似度,但是在一个较高的层次上,它告诉我们电影向量彼此之间有多么相似,我们可以使用它来生成推荐。
下面我用 UMAP 在二维空间上可视化电影向量,这是一种流行�
- 原文作者:知识铺
- 原文链接:https://index.zshipu.com/geek/post/%E4%BA%92%E8%81%94%E7%BD%91/%E5%A6%82%E4%BD%95%E5%8F%AA%E4%BD%BF%E7%94%A8%E6%A0%87%E7%AD%BE%E6%9D%A5%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84%E7%94%B5%E5%BD%B1%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com