个性化电影推荐系统
设计总说明
本文设计了一个个性化电影推荐系统.众所周知,现在电影资源是网络资源的重要组成部分,随着网络上电影资源的数量越来越庞大,设计电影个性化推荐系统迫在眉睫.所以本文旨在为每一个用户推荐与其兴趣爱好契合度较高的电影.
论文首先阐述推荐系统的研究现状以及意义,随后介绍了相关的推荐算法,重点介绍协同过滤算法,并对系统实现所需技术进行了研究,接着介绍了整个推荐系统的实现,最后对整个项目进行了回顾与总结.
本系统包含电影前端展示界面、电影评分板块、推荐算法的实现以及后端数据库的设计.其中实现推荐算法是整个电影推荐系统的核心.系统采用由 grouplens 项目组从美国著名电影网站 movielens 整理的 ml-latest-small 数据集,该数据集包含了 671 个用户对 9000 多部电影的 10 万条评分数据.首先将该数据集包含的全部文件经过筛选重组之后存储到建好的数据库中,并将数据集按一定比例划分为训练集和测试集,对训练集进行算法分析生成 Top-N 个性化电影推荐列表,然后在测试集上对算法进行评测,至少包括准确率和召回率两种评测指标.
协同过滤算法是推荐领域最出名也是应用最广泛的推荐算法.所以系统拟采用两种协同过滤算法给出两种不同的推荐结果,一种是基于用户的协同过滤算法,另一种是基于物品的协同过滤算法,用户可以根据两种推荐结果更加合理的选择合适的电影.系统采用了改进之后的 ItemCF-IUF 和 UserCF-IIF 算法,对计算用户相似度和物品相似度的计算都做出了改进.最后通过计算两种算法的准确率(Precision)、召回率(Recall)和流行度从而对系统进行评测、并比较了两种算法各自的优势和劣势.实验证明,改进后的算法比原始的协同过滤算法推荐效果要好,准确率更高.
整个系统涉及到的编程语言包含 Python、Html5、jQuery、CSS3 以及 MySQL 数据库编程.用到的框架是 Django 重量级 Web 框架,通过该框架连接系统的前、后端.用户首先需要填写用户名、密码以及邮箱注册系统,然后才能登陆推荐系统.进入首页后会看到 8 个电影分类,包括恐怖片、动作片、剧情片等.用户需要给自己看过的电影进行评分,评分起止为 0.5-5.0 分,共 10 个分段.每评价一部电影就要点击一下提交按钮,将所评分的电影的imdbId 号以及对应的评分存入数据库中.用户点击“推荐结果”按钮,系统就调用推荐算法遍历数据库所存数据,得出推荐列表之后将结果反馈给浏览器,同时调取数据库所存电影海报图片进行展示.用户点击自己登陆的昵称,会跳转页面显示自己已经评价过的电影.
本文还分析了系统的需求,并对需求进行相关设计,最后用 Django 框架实现了该系统,并给出了系统所用的主要数据表展示以及各个功能界面的展示.
关键词 :电影推荐系统;协同过滤;基于邻域推荐;个性化服务
一、绪论
1.1 研究背景及意义
随着互联网技术的快速发展,现在已经进入了大数据时代,网络上的信息呈现爆炸式增长,每天都会有数以亿计的数据涌现.人们接触各种信息的途径也越来越丰富,比如微博、Facebook、Twitter、微信公众号等等.而这些在给用户带来便利的同时也带来了前所未有的问题——“信息过载”.
“信息过载”就是指用户很难从庞大的数据中找到自己感兴趣的信息.为了解决信息过载问题,首先出现的是搜索引擎,但是一旦用户无法准确描述自己所需的关键词,搜索引擎就无能为力了,且搜索是一种被动的检索.而且,不同用户之间的需求差异很大.如果只是单纯的靠搜索引擎以及无法满足获取自身需求的信息.随着科技的发展,后来才有了推荐系统.
但是,最初的自动推荐系统,只是会将时下热门的、大众都爱的或者能使公司获得最大收益的产品推荐给用户,并没有针对每一个用户进行分析给出推荐.这样推荐的效果非常不理想.因此,人们希望有一种能向用户自动推荐项目的系统和方法,并且这个系统基于用户的偏好且对所推荐的产品进行属性分析.这就是个性化推荐系统.
个性化推荐系统技术可以应用到很多网站上,比如图书网站、视频网站、音乐网站、交友网站等.用户使用推荐系统的时间越长,不仅可以提高用户对该网站的忠诚度,还能为网站带来更多收益.最近几年推荐系统发展迅速,这要归功于 Web2.0 技术的成熟.现在用户已经成为了网页的积极参与者而不再是被动的网页浏览者.所以,为众多平台用户提供个性化推荐迫在眉睫.
截止于 2017 年底,国内知名视频网站优酷网上的电影和电视剧数量已达 16040 部.在如此庞大的视频数量下,怎样快速帮助用户发掘自己感兴趣的电影在网站运营中显得尤为重要.而且看电影常常被用户当做一种放松娱乐的方式,所以用户在打开电影网站时可能没有明确想看的电影.这样只有靠推荐系统通过分析用户的历史行为以及现下看的电影去分析潜在的用户可能感兴趣的电影.
1.2 国内外研究现状
“推荐系统”这个概念首次由 Resnick 在 1997 年提出[7],此后就一直被广泛引用.2007 年,ACM 推荐系统会议开始举办,这是第一个以“推荐系统”命名的顶级会议,旨在分享研究成果和方法,推动该领域的发展.现在,AI(人工智能)、DM(数据挖掘)等学科的研究更加推动了推荐系统的发展.
如今,人们生活的方方面面已经离不开推荐系统了.几乎所有的领域都在应用个性化推荐,比如电子商务、图书网站、社交网站等等.
电子商务推荐
Amazon 是电子商务推荐系统的代表,当用户登录后进入亚马逊图书网站首页,就会看到“为您推荐”板块,系统根据你的历史行为生成了图书推荐列表,如图 1-1 所示.还有一个“与您浏览过的商品相关的推荐”板块.正式这样有针对性的推荐,潜在的给 Amazon 带来了巨大的经济收益.
图 1-1 亚马逊网站的推荐板块 1
图 1-2 亚马逊网站的推荐板块 2
国内的淘宝网也是典型代表.淘宝 app 首页的“必买清单”其实就是根据用户的浏览和购物行为而自动生成的产品推荐.当用户购买商品之后,页面下方有“你可能喜欢”板块,这样对用户进行针对性的推荐,极大的促进了每日的交易量.
社交网络推荐
扎克伯格开发的 Facebook 是社交网络推荐领域的代表[16],它也是利用社交网络数据进行相关推送.比如里面的好友推荐界面,其实是根据用户现有的好友以及用户的行为记录给用户推荐新的好友.因为如果社交网站里的用户的好友量很稀少,就不能体验到社会化的优势.因此,好友推荐模块已经成为社交网络的标配.
视频推荐
Netflix 是电影和视频推荐领域的代表,它举办了在整个业界都产生广泛影响的 Netflix 比赛,极大促进了推荐技术的研究.国内的爱奇艺视频网站也有相应的电影推荐模块.
音乐推荐
国内非常受大众喜爱的音乐播放器有“网易云音乐”.打开界面就能看到“私人 FM” 板块,里面全部是根据用户历史听过的歌曲进行的推荐;“个性化推荐”板块如图 1-3 所示,其中展示了三个歌单,都是根据用户听过的歌曲所生成的推荐列表.里面还包括了“每日歌曲推荐”,也是根据用户的音乐口味生成.点进去查看如图 1-4 所示.
图 1-3 网易云“个性化推荐”板块
图 1-3 网易云“每日歌曲推荐”板块
国外对音乐个性化推荐系统的研究:认为用户所处的情境,比如用户当时所处的地点、时间以及天气等因素,都会对用户的偏好类型有影响[8].如 Wang 等人[9]用手机作传感器来收集用户听音乐时的环境信息,然后构建出概率模型进行分析后给用户做推荐.
基本现在所有的推荐系统都是由前端 Web 页面、推荐算法、后台日志系统组成.其中最核心的就是推荐算法.目前常用的算法有:协同过滤算法(Breese JS et al,1998)、基于内容的推荐算法(Mooney et al,2000)、 基于关联规则的推荐算法(Agrawal el)以及混合推荐算法(Claypool M et al,1999).
基于内容的过滤算法是根据信息资源和用户兴趣的相似度来推荐商品.能推荐新项目或者冷门的项目,使推荐系统不受冷启动和数据稀疏问题的影响.其实搜索引擎就是基于内容的检索,该算法在国外的主要应用有 Pazzani 等人设计[19]的 Syskill&Webert 系统[17].
协同过滤是利用用户之间的相似性来推荐用户该兴趣的物品.但有两个很难解决的问题,一个是稀疏性:系统初期由于系统资源还未获得足够的评价与反馈[9],[10],另一个是可扩展性:用户和资源的增多会使系统性能越来越差.
1.3 本文研究目标和研究内容
本论文的研究目标是通过协同过滤算法实现一个个性化电影推荐系统:用户首先通过填写用户名、密码、邮箱地址注册后进入系统,然后对系统主页所展示的 8 个类别的电影中看过的电影进行评分,0.5 分为最低分,满分为 5 分,所对应的评价分别是:不喜欢、一般、喜欢、推荐.提交评分后浏览器将评分数据通过表单提交到数据库,推荐系统后台的
分析算法通过 UserCF(基于用户的协同过滤算法)和 ItemCF(基于物品的协同过滤算法)给出两种推荐.即一个是基于用户之间的相似度,一个是基于电影之间的相似度.
本文主要研究内容包括:
- 研究原始的协同过滤算法,并调研应用该算法的视频网站.
- 对原始的协同过滤算法做出改进,使推荐结果更加切符合用户兴趣.
- 选定 Top-N 推荐的常用评价标准召回率和准确率与原始的协同过滤算法进行比较.
- 以传统的协同过滤算法为基础,设计和实现一个个性化电影推荐系统,并从需求分析、系统设计、系统实现三个方面对该系统进行阐述.
二、推荐算法的研究
2.1 推荐算法简介
协同过滤算法
协同过滤算法[12]主要包括基于用户的协同过滤算法(UserCF)和基于物品的协同过滤算法(ItemCF)两种推荐算法.
基于用户的协同过滤算法是推荐系统中最古老的算法,它是推荐系统诞生的标志[17].
其主要包括两个步骤:
-
找到和目标用户兴趣相似的用户集合
-
找到这个集合中大多数用户都喜欢的,且目标用户没有买过或者看过的物品进行推荐[18]
基于物品的协同过滤算法目前使用也很普遍.很多著名的视频网站如:Hulu、YouTube 推荐算法的基础都是该算法.该推荐算法的原理是向用户推荐和他们之前购买过的物品相似度很高的物品.比如,该算法会因为你购买过《python 编程从入门到实践》而给你推荐《用 python 写网络爬虫》.主要分为两个步骤:
- 计算各个物品间的相似度
- 对物品的相似度从高到低进行排序,然后挑选一定数量的相似度较高物品进行推荐.或者根据用户曾经的历史记录进行推荐.
基于内容的推荐算法
从每个物品中抽取一些特征,然后利用一个用户过去喜欢和不喜欢的物品的特征数据来学习此用户的喜好特征.通过比较用户的特征和物品的特征,给用户推荐相似度较高的物品.基于内容的推荐算法保护了用户之间的独立性,并且能很好的解决物品的冷启动问题.
基于内容的推荐算法可以充分将项目内容和用户本身的诸多特征联系起来,比如一部电影的演员、导演、类型,用户的性别、年龄、职业等.
其根据用户历史行为构造出用户偏好文档,计算所推荐的项目与用户偏好文档的相似度,选择最相似的项目推荐给用户.首先为每个物品构建一个物品的属性资料,然后为每个用户建立其一个喜欢的物品集,最后计算其和物品属性资料的相似度.相似度高意味着用户可能喜欢这个物品,相似度很低则意味着用户会讨厌这个物品[13].
基于标签的推荐算法
标签是一种无层次化结构的、用来描述信息的关键词,可以描述物品的内涵特征.有很多网站都利用了标签系统.比如:CiteULike 论文书签网站,它允许科研人员收藏自己喜欢的论文并给论文打上标签[21].还有国内的豆瓣网站,豆瓣网允许用户对电影以及图书等打标签,系统利用打标签这个途径可以获悉图书和电影的内容以及所属类别.
三、系统实现相关技术的研究
3.1 系统实现相关技术的研究
论文中推荐系统的开发与实现主要包括 Web 前端技术、数据处理技术、推荐算法实现,系统开发所需技术如表 3-6 所示.
表 3-6 系统所需技术
技术类型 | 技术名称 |
---|---|
推荐算法开发语言 | Python3 |
前端开发语言 | Html5、CSS3、jQuery |
Web 框架 | Django |
数据库 | MySQL |
Python 语言研究
Python 是由 Guido van Rossum 在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的[16],[21].是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言[21].相比于 C 或者 Java 等其他编程语言,Python 能让开发者很轻松的用几行代码就能实现一个功能完善的程序.
详细说来,Python 语言的优势有以下几点:
- 易于学习:Python 相对其他语言比如 C++ 来说关键字较少,并且语法简单,这种特性可以让开发者轻而易举的上手.
- 易于阅读:Python 严格控制代码缩进,使读者能够更加清晰的阅读代码.
- 面向对象:Python 和 Java 类似,存在一个介于源代码文件和二进制代码文件之间的字节码文件,更有利于项目在不同的平台间移植.
- 丰富的库:Python 拥有大量且丰富的标准库,可以减少很多不必要的代码,也可以更高效的对数据、图像进行处理.
- 跨平台且开源.Python 可以跨平台运行,并且开放源码超过 20 年,能让开发者更加深入的了解 Python 的机制.
Django 框架研究
Django 是一个基于 Python 的 Web 框架,可以用来开发交互式网站.Django 采用的是 MTV 框架模式,即模型(Model),模板(Template)和视图(Views).它们各自的职责如表 3-7 所示.
由于 Django 是免费的,且公布了其源码,又拥有丰富的文档,所以使用的人员很多. 其具体有以下几个优点:
-
通用性:Django 可以和任何客户端框架一起工作,并且可以提供几乎任何格式的内容.
-
安全性:Django 提供一种安全的方式管理用户的账户和密码,其 cookies 只包括一个秘钥,而实际数据存储在数据库中.并且 Django 可以防范许多漏洞,大大提高了网站的安全性.
-
灵活性:由于 Django 是用 Python 语言所编写的,所以它不受服务器平台的限制.
比如在 Linux 系统、Windows 系统或者 Mac 系统上都能运行程序.
表 3-7 MTV 各自职责
层次 | 职责 |
---|---|
模型,即数据存取层 | 处理与数据相关的事物,比如存取数据、验证数据合法性 |
模板,即业务逻辑层 | 一般包含前端所有代码以及调用的图片 |
视图,即表现层 | 是模型与模板之间的桥梁 |
Django 的 MTV 各个组织之间的协作如图 3-5 所示.
图 3-5 MTV 协作流程图
MySQL 数据库研究
数据库是一种用于存储数据集合的独立应用程序.每种数据库都会有一个或多个独特的 API,用来创建、访问、管理、搜索或复制数据库中保存的数据.关系数据库是建立在关系模型基础上的数据库,其所有数据都存储在不同的表中,表之间的关系由主键或者外键等连接.
MySQL 数据库就是一种快速易用的关系型数据库管理系统(RDBMS),是瑞典的 MySQL AB 公司开发的一个可用于各种流行操作系统平台的关系数据库系统,并且是一种免费的数据库管理系统.
MySQL 语言由 DDL(数据定义语言)、DML(数据操纵语言)、DCL(数据控制语言)组成.相比于其他的关系型数据库,MySQL 具有许多吸引人之处:
- 比较容易使用.MySQL 是一个高性能并且相对很多其他数据库来说是比较简单的数据库系统.
- 全面支持查询语言.MySQL 可以利用结构化查询语言,并且支持聚合函数,程序员可以在同一个查询中混合来自不同数据库的表.
- 连接性和安全性.完全支持网络化,其数据库可以在 Internet 上的任何地方访问,不会有限制.
- MySQL 是客户端/服务器架构的服务器,为客户端提供了不同的程序接口和连接库,且是多线程的[24].
- 支持大型的数据库,可以方便的支持上千万条记录的数据库.
四、推荐系统的设计与实现
本章将改进后的基于用户的协同过滤算法和基于物品的协同过滤算法相结合应用到实际中,做出了个性化的电影推荐系统.本章首先对国内外的主流视频网站进行了调研,然后讲解系统的需求分析,介绍系统架构以及数据库,最后展示系统界面.
4.1 国内外主流视频网站推荐效果调研
国内视频网站调研
调研了作为国内第一大视频网站的优酷网.图 4-1 为优酷视频网站首页的“优酷懂你” 板块为某用户给出的推荐列表[17],图 4-2 为该用户的观看记录.
对比观察用户的观看记录和优酷给出的推荐列表,发现该用户比较偏向看综艺、日剧以及恐怖片.但是推荐列表中的视频基本都与用户的喜好不同.其实优酷网的这个版块只是推荐了一些热门视频,缺乏个性化和针对性,推荐效果很差,既浪费用户时间也降低了用户的体验.
图 4-1 “优酷懂你”给出的推荐
图 4-2 用户观看记录
国外视频网站调研
调研了在全世界都著名的 YouTube 视频网站.用户登录后进入首页就有“推荐视频”板块,如图 4-3 所示.其中推荐的视频都是根据用户的历史看过的视频分析所得,而且每个视频下方还有上传网站的时间.该用户的历史记录所看的视频节选如图 4-4 和图 4-5 所示.
图 4-3 YouTube 首页的推荐板块
图 4-4 用户历史记录节选 1
图 4-5 用户历史记录节选 2
4.2 需求分析
随着电影市场的迅速发展,每天都有大量电影上映.人们都希望可以高效的在海量电影库中找到自己可能会喜欢的电影,以节省寻找电影的时间[22].电影推荐系统能给用户带来便利.本文要实现的是一个面向用户的个性化电影推荐系统,根据 movielens 数据集里面大量用户对电影的评分数据,通过计算用户相似性、电影相似性,实现为用户推荐符合其兴趣的电影.
本文实现的个性化电影推荐系统有以下几点基本需求:
- 数据集:每个用户所评电影数量要多,尽量广泛涉及大量电影
- 推荐算法:推荐效果要良好
- 包括用户注册登录在内的整个 Web 系统
- 系统要易于扩展和维护
4.3 用户功能需求
如图 4-6 是系统中用户的用例图,有 5 个用例,分别是注册、登录、注销、评分、查看推荐结果.
图 4-6 用户的用例图
4.4 系统设计
系统总体架构
本文从互联网上下载 movielens 数据集,经过数据重组和筛选,基于两种推荐算法得出推荐结果保存至 MySQL 数据库中,并通过 Django 框架进行前端展示.本系统采用 B/S(浏览器/服务器)体系结构,用户通过浏览器就能和网站上的内容交互. 实现本系统主要需要以下几种编程语言:
- Python:进行后台开发,写推荐算法,和 MySQL 数据库交互,将用户的数据存储到数据库中,又将生成的推荐列表展示到前端页面.
- Html5:进行前端页面的开发.
- Css3:美化前端页面,特别是对电影分类板块做处理.
- jQuery:实现提交表单和首页中的星星评分效果.
系统的总体架构设计图如图 4-7 所示.
图 4-7 系统架构图
一个良好的推荐系统,必须要有一个良好的用户交互界面和用户行为数据[16].其之间的关系如图 4-8 所示.
图 4-8 推荐系统和日志系统之间的联系
系统功能模块简述本系统以改进后的用户协同过滤和物品协同过滤算法为依据,采用 django 重量级 Web 框架设计并实现.包括了数据集处理模块、注册登录模块、电影分类模块、用户评分反馈模块、推荐算法模块和推荐电影展示模块.
数据集处理模块
本文设计的推荐系统的源数据集来源于 movielens 的 ml-latestl-small,其中包含 671 个用户的 10 万条评分数据.对数据集里面的 ratings.csv 和 links.csv 文件进行连接处理,只保留 userId、imdbId、rating 三个字段存入数据库中新建好的数据表 users_resulttable 中.
注册登录模块
用户只有先注册并且登录系统之后才能提交对电影的评分.注册界面含用户名、电子邮箱地址以及密码.注册和登录界面如图 4-9 所示.
图 4-9 注册和登录界面
用户注册界面的核心代码如下:
```c++ @register.html
注册
```
用户登录界面的核心代码如下:
```c++ @login.html
登录
```
电影分类模块系统
首页一共有 8 种类型的电影,如 4-10 所示.
从左到右依次是动作片、恐怖片、喜剧片、动画片、科幻片、犯罪片、爱情片以及剧情片.
图 4-10 系统首页
图 4-11 是爱情片的展示界面.
图 4-11 爱情片展示界面
实现分类效果的部分代码如下:
```html @index.html
```
每一部电影包括电影海报、电影名字、imdb 网站的超链接以及星星评分.代码如下:
```html @index.html
```
点击电影名字会链接到 imdb 网站,用户可以浏览电影的详情页.图 4-12 是电影《千与千寻》的 imdb 网站的展示页面.
图 4-12 《千与千寻》的 imdb 网站详情页
用户评分反馈模块
系统利用了 jquery-raty 评分插件,收集用户对每一部电影的评分.用户通过点击‘提交评分’按钮将评分数据提交到 MySQL 中的 users_resulttable 表中,插入到源数据集末尾.
图 4-13 用户对动作片评分
图 4-14 用户对恐怖片评分图 4-13 和图 4-14 分别是某用户对电影分类模块中的动作片和恐怖片的评分图. 实现星星评分效果的核心代码如下:
c++
@index.html
$(".starts").raty({
number : 5,//星星个数
{#score :3,#}
path : '{% static 'img' %}',//图片路径
{#target : '#grade',//#}
{#hints : ['0.5','1','1.5','2','2.5','3','3.5','4','4.5','5'],#}
hints : [
'不喜欢','不喜欢','一般','喜欢','推荐'],
starHalf:'star-half-big.png',
half:true,
round:{down:.26,full:.7,up:.9},
click : function(score, evt) {
if((score<0.5)) result = 0.5;
else if((score>0.51)&&(score<1.0)) result = 1.0;
else if((score>1.1)&&(score<1.5)) result = 1.5;
else if((score>1.5)&&(score<2)) result = 2.0;
else if((score>2.0)&&(score<2.5)) result = 2.5;
else if((score>2.5)&&(score<3.0)) result = 3.0;
else if((score>3.0)&&(score<3.5)) result = 3.5;
else if((score>3.5)&&(score<4.0)) result = 4.0;
else if((score>4.0)&&(score<4.5)) result = 4.5;
else result = 5.0;
$("#rating").val(result.toFixed(1));
{#alert(result.toFixed(1));#}
}
});
提交用户对电影的评分相关代码如下:
```c++ @index.html
def insert(request):
global USERID
USERID = int(request.GET["userId"])+1000
RATING = float(request.GET["rating"])
IMDBID = int(request.GET["imdbId"])
Resulttable.objects.create(userId=USERID, rating=RATING,imdbId=IMDBID)
return HttpResponseRedirect('/')
```
用户评分记录模块
用户登录系统后点击自己的昵称,将跳转页面显示自己曾经评价过的电影列表.如图
4-15 所示.
图 4-15 某用户评价过的电影列表
相关代码如下:
```html @views.py def showmessage(request): usermovieid = [] usermovietitle = [] data=Resulttable.objects.filter(userId=1001) for row in data: usermovieid.append(row.imdbId) try: conn = get_conn() cur = conn.cursor() #Insertposter.objects.filter(userId=USERID).delete() for i in usermovieid: cur.execute('select * from moviegenre3 where imdbId = %s',i) rr = cur.fetchall() for imdbId,title,poster in rr: usermovietitle.append(title) print(title) finally: conn.close() return render(request, 'users/message.html', locals())
@message.html
您评价过下列电影:
{% for dd in usermovietitle %}
{{ dd }}
```
推荐算法模块
本模块是整个系统的核心组成部分,当用户登录进入系统并对电影进行评分之后,系统就记录下了该用户的 id 号,当用户再次登入系统时,系统会将源数据集和该用户之前的评分数据整合成新的数据表作为推荐的依据. 整个推荐过程流程图如图 4-16 所示.
图 4-16 系统推荐流程图
算法生成推荐电影的 imdbId 号之后存入 matrix 全局变量列表中,并在 moviegenre 数据表中查询到相关的电影名称以及电影海报的链接,将 userId、title、poster 数据插入到 users_insertposter 数据表中,此表即为所有登录用户的电影推荐列表集.得出用户的电影推荐结果并插入数据表中的核心代码如下:
```python @views.py
def recommend(self, user): matrix.clear() K = self.n_sim_user N = self.n_rec_movie rank = dict() watched_movies = self.trainset[user] for similar_user, similarity_factor in sorted(user_sim_mat[user].items(), key=itemgetter(1), reverse=True)[ 0:K]:
for imdbid in self.trainset[similar_user]:
if imdbid in watched_movies:
continue
rank.setdefault(imdbid, 0)
rank[imdbid] += similarity_factor
rank_ = sorted(rank.items(), key=itemgetter(1), reverse=True)[0:N]
for key,value in rank_:
matrix.append(key) #matrix 为存储推荐的 imdbId 号的数组
return matrix
def recommend1(request): Insertposter.objects.filter(userId=USERID).delete() read_mysql_to_csv('users/static/users_resulttable.csv',USERID) #追加数据,提高速率 ratingfile2 = os.path.join('users/static', 'users_resulttable.csv') usercf = UserBasedCF() userid = str(USERID) print(userid) usercf.generate_dataset(ratingfile2) usercf.calc_user_sim() usercf.recommend(userid) try: conn = get_conn() cur = conn.cursor() for i in matrix: cur.execute('select * from moviegenre3 where imdbId = %s',i) rr = cur.fetchall() for imdbId,title,poster in rr: if(Insertposter.objects.filter(title=title)): continue else: Insertposter.objects.create(userId=USERID, title=title, poster=poster) finally: Conn.close() results = Insertposter.objects.filter(userId=USERID) return render(request, 'users/movieRecommend.html',locals()) ```
显示推荐模块
根据登录用户对电影的评分反馈,通过基于用户的协同过滤和基于物品的协同过滤算法给出图 4-17 和图 4-18 两种推荐结果.
图 4-17 基于用户的推荐结果
图 4-18 基于物品的推荐结果
算法从 users_insertposter 数据表中获取相应登录用户的推荐电影列表相关内容展示到前端界面.上述过程的核心代码如下:
```c++ @movieRecommend.html
{% for result in results %}
{{ result.title }}
{% endfor %} ```
4.5 数据库介绍与设计
实验数据集介绍本实验采用的数据集是由 GroupLens 科研小组从电影网站 MovieLens 上统计的 ml-latest-small 数据集,该数据集包含了从 1995 年到 2016 年 10 月内 671 名用户对 9125 部电影的评分记录,一共 100004 条电影评分.里面的每一名用户评价的电影数量都不少于 20部.
该 ml-latest-small 数据集由四个 CSV 文件组成,分别是 ratings.csv、movies.csv、links.csv 以及 tags.csv[25].下面将一一介绍.
ratings.csv 是用户评分信息表,第一行是 4 个 title:userId(用户 id)、电影 id(movieId)、
用户评分(rating)以及 timestamp(时间戳),其中用户评分区间为 0.5 分-5 分.表 4-1 即为 ratings.csv 文件的节选.movies.csv 是电影属性表,包含三个字段,分别是 movieId(电影的 id 号)、title(电影名称)、genre(电影的题材),表 4-2 即为 movies.csv 文件的节选.
表 4-1 ratings.csv 内容节选
userId | movieId | rating | timestamp |
---|---|---|---|
1 | 31 | 2.5 | 1260759144 |
1 | 1029 | 3 | 1260759179 |
1 | 1061 | 3 | 1260759182 |
2 | 10 | 4 | 835355493 |
2 | 17 | 5 | 835355681 |
2 | 39 | 5 | 835355604 |
表 4-2 movies.csv 内容节选
movieId | title | genres |
---|---|---|
1 | Toy Story (1995) | Adventure|Animation|Children|C omedy|Fantasy |
2 | Jumanji (1995) | Adventure|Children|Fantasy |
3 | Grumpier Old Men (1995) | Comedy|Romance |
4 | Waiting to Exhale (1995) | Comedy|Drama|Romance |
5 | Father of the Bride Part II (1995) | Comedy |
links.csv 包含 movieId、imdbId、tmdbId 三个字段.其中 imdbId 是该电影在电影网站 imdb 的编号,tmdbId 是该电影在电影网站 The Movie Database 的编号,都可以用来唯一识别某部电影.tags.csv 主要包括电影的标签,适合做基于标签的推荐系统,本系统没有用到该文件中的内容.表 4-3 和表 4-4 分别是 links.csv 文件和 tags.csv 文件的内容节选.
表 4-3 links.csv 内容节选
movieId | imdbId | tmdbId | |
---|---|---|---|
1 | 0114709 | 862 | |
2 | 0113497 | 8844 | |
3 | 0113228 | 15602 | |
4 | 0114885 | 31357 | |
5 | 0113041 | 11862 | |
6 | 0113277 | 949 |
表 4-4 tags.csv 内容节选
userId | movieId | tag | timestamp |
---|---|---|---|
15 | 339 | sandra 'boring' bullock | 1138537770 |
15 | 1955 | dentist | 1193435061 |
15 | 7478 | Cambodia | 1170560997 |
15 | 32892 | Russian | 1170626366 |
15 | 34162 | forgettable | 1141391765 |
15 | 35957 | short | 1141391873 |
另外数据库中还有 moviegenre 数据表,里面包含 imdbId、title(电影名字)、imdb score(imdb 网站的电影评分)、poster(电影海报链接),通过查询电影 imdbId 可以得到该电影的名字和海报图展示到前端.
数据库逻辑结构设计
本节归纳了用户、电影、推荐列表、用户评分数据表之间的关系.
用户实体属性如图 4-19 所示.每个用户注册系统的时候都必须填写用户名、邮箱地址,设置用户密码,并且系统会自动为其分配一个 id 号.
图 4-19 用户 E-R 图
每部电影信息的实体属性如图 4-20 所示.
图 4-20 电影 E-R 图
推荐结果列表信息的实体属性如图 4-21 所示.推荐结果列表中包含电影的海报图地址,这样推荐页面就会展示出电影海报,增加系统美观的同时也提高了用户的可阅读性.
图 4-21 推荐结果 E-R 图
用户对电影的评分实体属性如图 4-22 所示.
图 4-22 用户评分 E-R 图
系统 E-R 图
数据库模型通常包括层次模型、网状模型、关系模型以及 ER 图(实体-联系图).系统的 E-R 图如图 4-23 所示.
图 4-23 系统 E-R 图
系统数据表设计
本系统采用 MySQL 数据库,数据库中包括用户信息表、电影属性表、电影评分表、电影推荐列表.下面将介绍主要的存储表的结构.
电影属性表
电影属性表用来保存系统中每部电影的一些属性,包括电影的 imdbId 号、电影名字、电影的海报链接三个字段,数据表的名字为 moviegenre.表 4-5 即为 moviegenre 表.
表 4-5 电影属性表
字段名称 | 字段类型 | 含义 | 备注 |
---|---|---|---|
imdbId | int(11) | imdb 网站上电影的编码 | 主键 |
title | varchar(300) | 电影名字 | |
poster | varchar(300) | 电影海报图的链接地址 |
电影评分表
该表所存内容来自 movielens 的 ratings.csv 和 links.csv 文件,这两个文件所含内容已经在 4.5.1 节说明,这里略过.用 MySQL 语句将 ratings.csv 和 links.csv 连接,只保留 userId、 imdbId、rating 并存入已经建好的空数据表 users_resulttable 中.这个数据表里的数据就是推荐算法得出推荐结果的依据.算法只有遍历这个数据表,才能计算出登录用户和该表中的哪些用户相似度较高,从而给出推荐结果.电影评分表如表 4-6 所示.
表 4-6 电影评分表
字段名称 | 字段类型 | 含义 | 备注 |
---|---|---|---|
userId | int(11) | 用户的 id 号 | |
imdbId | int(11) | imdb 网站上电影的编码 | |
rating | decimal(3,1) | 用户的电影评分 | |
id | int(11) | 主键 |
电影推荐列表
推荐算法遍历 users_resulttable 表之后,会生成目标用户的推荐的电影的 imdbID 号,然后在电影属性表 moviegenre 中查询出电影的名字和海报链接并插入电影推荐列表中.存海报链接是为了展示页面既有电影名也有电影的海报图,这样就生成了属于登录用户专属的电影推荐列表,表名为 users_insertposter.
系统给出的电影推荐列表包含字段如表 4-7 所示.
表 4-7 电影推荐列表
字段名称 | 字段类型 | 含义 | 备注 |
---|---|---|---|
id | int(11) | 主键 | |
userId | int(11) | 用户的 id 号 | |
title | varchar(60) | 电影名字 | |
poster | varchar(400) | 电影海报地址 |
表 4-8 为 users_insertposter 数据表部分内容节选.
表 4-8 users_insertposter 数据表内容节选
id | userId | title | poster |
---|---|---|---|
1 | 1002 | Pitch Black (2000) | https://images-na.ssl-images-amazon.com/images/M/ ;MV5BNTNmYzE1OWYtZDdjNC00OTdhLTg1YjU tYWJlZTVkMzkzNmVkXkEyXkFqcGdeQXVyMT QxNzMzNDI@ . V1_UX182_CR0,0,182,268_AL .j pg |
2 | 1002 | The Transporter (2002) | https://images-na.ssl-images-amazon.com/images/M/ MV5BMTk2NDc2MDAxN15BMl5BanBnXkFtZTY wNDc1NDY2. V1_UY268_CR2,0,182,268_AL .jp g |
3 | 1002 | Big Hero 6 (2014) | https://images-na.ssl-images-amazon.com/images/M/ ;MV5BMDliOTIzNmUtOTllOC00NDU3LWFiNjYt;MGM0NDc1YTMxNjYxXkEyXkFqcGdeQXVyNT;M3NzExMDQ@. V1_UY268_CR3,0,182,268_AL ;.jpg |
4 | 1002 | Donnie Darko (2001) | https://images-na.ssl-images-amazon.com/images/M/ ;MV5BZWQyN2ZkODktMTBkNS00OTBjLWJhOG;YtNGU4YWVkNTY0ZDZkXkEyXkFqcGdeQXVy;NjU0OTQ0OTY@. V1_UY268_CR0,0,182,268_A;L .jpg |
五、总结与展望
总结
随着互联网的飞速发展,关于推荐系统的研究工作也蒸蒸日上.本文主要研究了实现推荐系统所需的技术,研究了推荐算法以及推荐系统的一些国内外现状.并以电影推荐系统为实例,对整个推荐系统的架构以及所有功能做了详尽的阐述与分析.从系统的需求分析出发,剖析了用户对功能的需求,然后介绍了系统的各个功能模块,最后充分展示了系统数据库的设计以及数据表的内容.
设计的系统包含用户信息模块、电影展示模块、用户评分模块、推荐结果模块.每个模块的介绍都有流程图或者系统截图.数据库中的核心数据表也充分对所存内容、每个字段的类型进行了阐述.
本系统采用改进过的两种协同过滤算法:基于用户的协同过滤和基于物品的协同过滤,使用户能从两种不同角度获得推荐,提高用户的可选择性.并且利用准确率、召回率以及流行度三个指标对算法进行评测.实验表明,基于本系统所用数据集,UserCF-IIF 算法的性能要优于 ItemCF-IUF 算法.
核心的推荐算法工作完成后,本文结合现有的较热门的 Web 重量级框架 Django,利用 Django 内置的用户注册表单实现用户注册,编写视图代码进行电影推荐结果的 UI 前端展示.利用 CSS3 语言对网页进行排版、美化,使系统看上去更加简洁和美观,增加用户的体验.
5.1 不足之处及未来展望
本文工作完成了一个简单的个性化电影推荐系统,仍然还有很多地方不足需要进一步完善,主要有以下几个方面:
-
采用的算法效率不够高.当前使用的两种算法依旧是上个世纪提出的算法,所以系统运行效率不高,速度很慢,推荐的物品准确率不高.后期可以考虑抛弃古老的推荐算法,采用更新、效率更高的推荐算法,并结合基于标签和基于内容的推荐算法进行推荐.可以在用户注册时就填写年龄、性别、职业等信息先进行初步的分类给出推荐,再根据评分精准推荐,效果会更好.
-
本系统使用的是用户对电影的历史评分数据,这些数据都存在一定的稀疏性.登录用户看过的电影可能很少,这样就导致他和数据库中所存用户评过分的电影有较少的交叉项目,使得计算出的相似度很不准确.如何减少数据稀疏带来的困扰是提高推荐系统准确度的又一个出发点.系统采用的是 movielens 网站的较小的数据集,整个数据集压缩之后只有897kb,所以包含的电影数目也不是很多,推荐的效果大打折扣.之后可以用更大的数据集,考虑遍历百万条评分数据来进行推荐.
-
本系统电影首页的分类模块,只针对数据集中含有的电影的 8 个类别分别挑选了16部电影,导致用户能进行评分的电影数量有限.且没有设计电影搜索功能,用户不能针对性的对自己看过的电影进行评分.
参考文献
- 基于协同过滤的推荐系统的设计与实现(中山大学·刘振兴)
- Research and Development of Movie Recommendation System Based on Hybrid Recommendation Algorithm(首都经济贸易大学·石科)
- 基于SparkALS的电影推荐系统设计与实现(重庆大学·王旭东)
- 基于Hadoop的电影推荐系统的研究与实现(重庆理工大学·唐雪)
- 基于图数据库的电影推荐系统的设计与实现(云南大学·刘东华)
- 基于协同过滤的电影推荐系统的构建(西安电子科技大学·张海朋)
- 基于云计算的协同过滤推荐系统的研究与应用(安徽理工大学·范虎)
- 基于SparkALS的电影推荐系统设计与实现(重庆大学·王旭东)
- 基于混合协同过滤的个性化电影推荐系统研究(武汉理工大学·刘文佳)
- 基于混合协同过滤的个性化电影推荐系统研究(武汉理工大学·刘文佳)
- 基于协同过滤的电影票务系统设计与实现(北京交通大学·祝月芳)
- 基于协同过滤的推荐系统的设计与实现(中山大学·刘振兴)
- 基于SparkALS的电影推荐系统设计与实现(重庆大学·王旭东)
- 基于图数据库的电影推荐系统的设计与实现(云南大学·刘东华)
- 基于用户画像与知识图谱融合的电影推荐算法研究(重庆大学·安冉)
本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:毕设港湾 ,原文地址:https://m.bishedaima.com/yuanma/35822.html