A content-based movie recommender system using MovieLens tags (用标签构建一个简单的电影推荐系统)
现在有很多电影。如果没有某种推荐系统,您会担心,随着时间的流逝,用户可能会被他们不关心的电影所淹没。因此,您决定构建电影推荐系统。由于您的服务是新服务,因此您没有足够的数据来了解哪些用户正在观看哪些电影。这被称为冷启动问题,它使您无法仅根据用户的历史收视率来推荐电影。幸运的是,即使没有足够的收视数据,我们仍然可以使用电影元数据构建一个不错的推荐系统。这就是MovieLens的用处。MovieLens为每个电影提供带有关键字标签的公共数据集。这些标签非常有用。
这个转化单功能多个分类值的办法十分有用,整个数据集整理完之后为:
Source: https://datascience.stackexchange.com/questions/14847/multiple-categorical-values-for-a-single-feature-how-to-convert-them-to-binary-u
在本文的其余部分中,我将回答三个业务问题,这些问题对于使用MovieLens的标签构建基于内容的简单推荐系统至关重要:
- 每部电影需要几个标签?
- 我们如何使用标签来衡量电影之间的相似性?
- 我们如何使用标签为用户生成电影推荐?
第一个问题:每部电影需要几个标签?
MovieLens标签基因组数据集中大约有10万部唯一电影和一千个唯一标签。每部电影对每个标签都有一个相关性得分,因此大约有1000万个电影标签对,取值区间从0到1。但是并非每个标签都与电影相关,因此我们只需要保留最相关的标签。首先,我们可以根据相关性得分对每部电影的标签进行排序。以玩具总动员为例:
接下来,我们在下面的图表中确认,电影排名较高的标签通常具有较高的中位数相关性突出。电影的第1级标签的中位相关性几乎几乎为1。我们可以看到, 随着大约第50级,中位相关性逐渐降低。
要查找电影的最相关标签,我们可以根据相关性得分保留电影的前N个标签。在这里,我们需要仔细选择N。如果N很小,则我们具有非常相关的标签。如果N大,则我们有很多标签,但其中许多标签可能无关紧要。下图显示了当我们从排名第1升至第100时,中位数相关性得分的变化百分比。当相关性得分开始变得更加稳定时,我们会在第50个等级附近看到一个拐点。因此,我们可以选择N = 50作为每个电影要保留的合理数量的标签。请注意,这是一种非常简单的“弯头方法”样式的方法,以后可以对其进行优化。
现在,我们可以获得每部电影的前50个标签的列表,这些标签将在下一部分中使用。例如,玩具总动员的50个标签。
另外可以根据电影的名称来查询标签
第二个问题:我们如何使用标签来衡量电影之间的相似性?
在为用户生成电影推荐之前,我们需要一种基于电影的前50个标签来衡量电影之间相似度的方法。在基于内容的推荐器系统中,将向用户推荐与他们已经看过的电影相似的电影。
在这里,我将演示两种测量相似度的方法:
- 两组电影标签的Jaccard系数
- 基于标签的电影矢量(也称为内容嵌入)的余弦相似度
Jaccard 系数:
使用Jaccard Index的第一种方法是将两个集合A和B之间的相似度作为交集的大小除以并集的大小。在衡量电影之间的相似性时,我们可以为两组电影标签计算此索引。
例如,假设我们下面有三部电影,以及前三部标签:
- 电影A标签=(动作,空间,友谊)
- 电影B标签=(冒险,太空,友谊)
- 电影C标签=(浪漫,喜剧,成年)
直观地看,电影A与电影B相似,这是因为电影A和电影B共享两个标签(空格,友谊),而电影A和电影C没有共享标签。以下是根据Jaccard Index进行的类似于心灵捕手的前十部电影。 对于善意狩猎的观众来说,这些看起来像是合理的建议。 请注意,我在列表中包括了心灵捕手,以表明在将电影与其自身进行比较时,Jaccard Index = 1。
根据Jaccard 系数,与《星际穿越》相似的前十部电影以下。 对于《星际穿越》的观众来说,这些看起来也很合理。
为了进一步说明“ Jaccard Index”的有效性,请参见下文基于类似于《星际穿越》电影的标签频率的词云。 在这里,我们可以看到哪些标签在相似度计算中更为突出(例如科幻小说,伟大的结局,错位的未来,哲学的,大脑的)。
余弦相似度(Cosine Similarity)
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的相似度高于电影B,这是因为电影A和电影B在每个维度上的数字都更接近(例如,在第一维度上的数字是1.1与1.3)。为了找到电影的良好矢量表示,我使用本文中的Doc2Vec(PV-DBOW)技术拍摄电影(文档),并根据其标签(文档中的单词)学习到潜在K维矢量空间的映射。
Doc2Vec论文中PV-DBOW技术的可视化; 对于每个段落ID(电影),我们正在训练一个模型来预测该段落中单词(电影标签)的出现
一旦我们可以将每个电影表示为矢量,就可以计算矢量之间的余弦相似度,以找到相似的电影。 我不会在这里详细介绍余弦相似度,但是从较高的角度讲,它可以告诉我们彼此之间相似的电影矢量之间的相似度,我们可以使用它们来生成推荐。 下面,我使用UMAP可视化二维的电影矢量,这是一种流行的非线性降维技术。 我们可以看到在此向量空间中距离更近的电影更加相似(例如玩具总动员和怪物工厂)。
第三个问题:我们如何使用标签为用户生成电影推荐?
现在,我们可以测量带有标签的电影之间的相似性,我们可以开始向用户生成电影推荐。请记住,在基于内容的推荐器系统中,将向用户推荐与他们已经看过的电影相似的电影。如果用户仅看过一部电影(例如心灵捕手),我们可以像以前一样简单地使用Jaccard索引(或余弦相似度)来生成要推荐的类似电影的列表。
实际上,用户将观看一组电影,我们需要根据这些电影的组合属性生成推荐。 一种简单的方法是将用户矢量计算为他们看过的电影矢量的平均值。 这些用户向量可以代表用户的电影偏好设置。
例如,如果用户只看了下面的电影A和B:
电影A =(1、2、3)
电影B =(7,2,1)
用户向量=电影A和电影B的平均值=(4、2、2)
以下是我观看和欣赏的电影,包括星际穿越、心灵捕手、千钧一发、几乎成名、肖申克的救赎、明日边缘、甜心先生、阿甘正传和回到未来。我们如何使用这些电影中的标签生成电影推荐呢?我的用户向量将是上述九部电影的电影向量的平均值。 我可以利用用户向量来查找尚未观看的最相似的电影(基于余弦相似度)。 考虑到我们仅在这里使用电影标签,以下是我的电影推荐,这些推荐出奇的好!
以下是我们基于内容的推荐系统的摘要。 请注意,如果我们将系统部署为API,则可以在批处理过程中预先计算用户向量和相似性分数,以加快建议的提供。
输入:用户向量(从标记中学到的电影向量的平均值)
输出:基于用户和电影向量的余弦相似度,与用户相似的电影列表
Source: Johnson Kuan, 2019. How to Build a Simple Movie Recommender System with Tags. Available from: https://towardsdatascience.com/how-to-build-a-simple-movie-recommender-system-with-tags-b9ab5cb3b616 [25 June 2020]
个人Github :
非商业应用,仅用于学术分享,侵权删