作者:Johnson Kuan   编译:ronghuaiyang

导读

使用基于内容的方法来找到最相似的电影。

No MIT chalkboard required

介绍

假设你正在推出下一个非常大的订阅视频点播(SVOD)流媒体服务,并且你已经获得了过去100年里发行的所有主要电影的流媒体权。祝贺你,这是不可思议的壮举!

现在你有了很多电影。如果没有推荐系统,你就会担心随着时间的推移,用户可能会被他们不关心的电影所淹没。这可能会导致客户流失,这是你最不想看到的!

所以你决定建立一个电影推荐系统。由于你的服务是新的,所以你还没有足够的数据来了解哪些用户正在观看哪些电影。这就是所谓的冷启动问题,它不能让你仅根据用户的历史收视记录来推荐电影。

幸运的是,即使没有足够的观看数据,我们仍然可以建立一个像样的电影元数据推荐系统。这就是MovieLens的作用所在。MovieLens提供了一个公共数据集,其中包含每个电影的关键字标签。这些标签信息量很大。例如,看看Good Will Hunting的最重要的社群标签。

在这篇文章的其余部分,我将回答三个业务问题,这三个问题对于构建一个简单的基于内容的推荐系统非常关键,其中的标签来自MovieLens:

  1. 每部电影需要多少个标签?

  2. 我们如何使用标签来衡量电影之间的相似性?

  3. 我们如何使用标签为用户生成电影推荐?


这个分析的代码可以在这里找到:

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个标签的相似性度量方法。在基于内容的推荐系统中,用户将被推荐与他们已经看过的电影相似的电影。

在这里,我会演示两种度量相似性的方法:

  1. 两个电影标签集合的Jaccard Index

  2. 基于标签的电影向量(即内容嵌入)的余弦相似度。


Jaccard Index

使用Jaccard Index的第一种方法度量两个集合AB之间的相似性,即交集的大小除以并集的大小。在度量电影之间的相似性时,我们可以计算这两组电影标签的索引。

![img](How to Build a Simple Movie Recommender System with Tags.assets/1_bBlhtLhCK95zNFGrGcUCTg.png)

例如,我们有三个电影下面和他们的前3个标签:

  • 电影A的标签 =(动作,空间,友情)

  • 电影B的标签=(冒险,太空,友谊)

  • 电影C的标签=(浪漫,喜剧,成长)

直观上,我们可以看出电影AB更相似,而不是C。这是因为电影AB共享两个标签(空间,友情),而电影AC不共享任何标签。

下面是基于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)

直观上,我们可以再次看到电影AB更相似,而不是C。这是因为电影AB在每个维度上有更接近的数字(例如第一个维度是1.1 vs 1.3)。

为了找到一个好的向量表示的电影,我使用了Doc2Vec (PV-DBOW)技术,我们拿到一个电影(文档),并基于标签(文档中的词)学习一个到潜在K维空间的映射。我不会在这里深入讨论细节,但这是我们如何基于标签将电影表示为向量的方法。

Doc2Vec论文中对PV-DBOW技术的可视化,对于每个段落ID (movie),我们训练一个模型来预测该段落中某个单词(movie tag)的共现性

一旦我们可以把每一部电影表示成一个向量,我们就可以计算向量之间的余弦相似度来找到相似的电影。我不会在这里详细介绍余弦相似度,但是在一个较高的层次上,它告诉我们电影向量彼此之间有多么相似,我们可以使用它来生成推荐。

下面我用UMAP在二维空间上可视化电影向量,这是一种流行的非线性降维技术。我们可以看到,在这个向量空间中距离较近的电影更加相似(例如Toy Story和Monsters等等)。

从电影标签语料库中学习电影向量

3) 我们如何使用标签为用户生成电影推荐?

现在我们可以使用标签来度量电影之间的相似性,我们可以开始为用户生成电影推荐。

请记住,在基于内容的推荐系统中,用户将被推荐与他们已经看过的电影相似的电影。如果用户只看过一部电影(如Good Will Hunting),我们可以像以前一样简单地使用Jaccard Index(或余弦相似度)来生成要推荐的类似电影的列表。

更实际的情况是,用户已经观看了一组电影,我们需要根据这些电影的组合属性来生成推荐。

一个简单的方法是计算一个用户向量,作为他们看过的电影向量的平均值。这些用户向量可以表示用户的电影偏好属性。

例如,如果用户只看过电影AB

  • 电影A = (1,2,3)

  • 电影B = (7,2,1)

  • 用户向量=电影AB的平均 = (4,2,2)

以下是我喜欢看的电影。我们如何使用这些电影的标签生成电影推荐?

Interstellar, Good Will Hunting, Gattaca, Almost Famous, The Shawshank Redemption, Edge of Tomorrow, Jerry Maguire, Forrest Gump, Back to the Future

我的用户向量是上述9部电影的电影向量的平均值。我可以使用我的用户向量,找到我还没有看过的最相似的电影(基于余弦相似性)。下面是我的电影推荐,这是令人惊讶的好,考虑到我们在这里只是使用了电影标签!

The Theory of Everything
Cast Away
Dead Poets Society
Charly
Rain Man
Groundhog Day
Pay It Forward
A Beautiful Mind
E.T. the Extra-Terrestrial
Mr. Holland's Opus
On Golden Pond
It's a Wonderful Life
Children of a Lesser God
The Curious Case of Benjamin Button
Star Trek II: The Wrath of Khan
Cinema Paradiso
Mr. Smith Goes to Washington
The Terminal
Her
The World's Fastest Indian
The Truman Show
Star Trek: First Contact
The Family Man

下面总结一下我们基于内容的推荐系统。请注意,如果我们将系统部署为API,我们可以在批处理过程中预先计算用户向量和相似分数,以加快推荐的提供。

  • 输入:用户向量(从标签中学习到的电影向量的平均值)

  • 输出:基于用户和电影向量的余弦相似度,与用户相似的电影列表

—END—

英文原文:https://towardsdatascience.com/how-to-build-a-simple-movie-recommender-system-with-tags-b9ab5cb3b616

往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习在线手册深度学习在线手册AI基础下载(pdf更新到25集)本站qq群1003271085,加入微信群请回复“加群”获取一折本站知识星球优惠券,请回复“知识星球”喜欢文章,点个在看

如何只使用标签来构建一个简单的电影推荐系统相关推荐

  1. python电影推荐系统 github_GitHub - Holy-Shine/movie_recommend_system: 一个简单的电影推荐系统...

    更新日志 2018-6-17 更新推荐方法接口 一个简单的电影推荐系统. 目录 模型概览:模型结构 代码构成:整体文件结构 模型实现:模型实现细节 快速开始:简单使用教程 1. Glimpse 模型移 ...

  2. 如何构建一个简单的图书推荐系统

    原作者:venkat-raman 出处:https://www.linkedin.com/pulse/content-based-recommender-engine-under-hood-venka ...

  3. 电影推荐系统 python简书_分析9000部电影|一个简单的电影推荐系统

    不知道大家平时喜不喜欢看电影来消遣时光,我是比较喜欢看电影的.对我而言,当我看完一部电影,觉得很好看的时候,我就会寻找类似这部电影的其他电影.刚好有这么一个数据集,包含了很多部的电影,于是打算对其进行 ...

  4. 电影推荐系统 python简书_【记录|Spark】简单的电影推荐系统

    为了学习spark,在实验楼上找到的一个spark入门课程,在此记录一下学习过程. 我使用的Spark版本为Spark 2.2.0, 实验楼教程使用的是Spark 1.6.1 流程和算法介绍 这个简单 ...

  5. 3.2 实战项目二(手工分析错误、错误标签及其修正、快速地构建一个简单的系统(快速原型模型)、训练集与验证集-来源不一致的情况(异源问题)、迁移学习、多任务学习、端到端学习)

    手工分析错误 手工分析错误的大多数是什么 猫猫识别,准确率90%,想提升,就继续猛加材料,猛调优?     --应该先做错误分析,再调优! 把识别出错的100张拿出来, 如果发现50%是"把 ...

  6. java jsf_使用Java和JSF构建一个简单的CRUD应用

    java jsf 使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护. 今天尝试Okta. JavaServer Fac ...

  7. 使用Java和JSF构建一个简单的CRUD应用

    使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护. 今天尝试Okta. JavaServer Faces(JSF)是用 ...

  8. python推荐系统-利用python构建一个简单的推荐系统

    摘要: 快利用python构建一个属于你自己的推荐系统吧,手把手教学,够简单够酷炫. 本文将利用python构建一个简单的推荐系统,在此之前读者需要对pandas和numpy等数据分析包有所了解. 什 ...

  9. 【编译原理】构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 8.)(笔记)一元运算符正负(+,-)

    [编译原理]让我们来构建一个简单的解释器(Let's Build A Simple Interpreter. Part 8.) 文章目录 C语言代码(作者没提供完整的python代码,关键的改动提供了 ...

最新文章

  1. 多任务训练的模式结构扩散
  2. 39个超实用jQuery实例应用特效
  3. 不会被计算机打败的棋类游戏,电脑首次打败人类围棋冠军意味着什么?
  4. springboot+mybatis+SpringSecurity 实现用户角色数据库管理(一)
  5. WebApi 接口参数不再困惑:传参详解
  6. linux mysql服务器安装_Linux服务器MySQL安装
  7. html语言及语法结构,HTML语法结构.ppt
  8. 一年赚4.5亿,网红盲盒公司泡泡玛特再战IPO
  9. php主动推送弹幕_源起网-织梦发布文档主动百度推送熊掌推送批量推送
  10. 武汉群硕面试心得体会(上)
  11. 熟练运用计算机进行数学教案,小学数学与信息技术整合教案
  12. Android 窗口全屏
  13. Android开机动画总结
  14. 数据结构实验1.2:高精度计算PI值
  15. 天宫初级认证答案_跨境电商人才初级认证试题以及答案
  16. matlab数理统计工具箱,Matlab数理统计工具箱
  17. H5的APP逆向方法
  18. NameError: name ‘XXX‘ is not defined
  19. 2018航电多校练习第9场-快速幂
  20. 为什么越来越多明星开始关注加密货币?

热门文章

  1. 实验1 Windows汇编语言开发环境
  2. 用gojs写的流程图demo
  3. 关于C/C++的trigraphs和Digraphs
  4. iOS对UIViewController生命周期和属性方法的解析
  5. vs设置语言后引用dll的一个错误
  6. mysql increment by 2_关于mysql auto-increment
  7. python实现函数ifodd_09-Python笔记整理(函数)
  8. 用c语言实现对n个进程采用“短进程优先”算法的进程调度_为什么Linux CFS调度器没有带来惊艳的碾压效果?...
  9. “铜死亡”顶级研究文献解读
  10. Python-OpenCV学习 -- 台式机外接USB摄像头的视频读取