# MovieRecommend
一个电影推荐系统——实现用户登录、评分、推荐,采用协同过滤算法。:cherry_blossom: <br/>
***
<!-- `2020.4.10 作者序`:<br/>
居然发现某二手交易app上出现了好几个卖家公然盗取我的项目及论文明码标价进行买卖。这个开源项目大家可以拿去用,但是买卖就造成侵权,望周知!
-->
## 作者序
<!-- 希望大家不要copy到本地修改后直接当做自己的毕业设计,最好自己学一遍`python+django+mysql`的基础知识。<br/> -->
我完成该项目的时间线可以参考README末尾的<a href="#note">笔记</a>,请注意`笔记`中所记载的内容和最后的实际成果有所出入,只做为本人完成的过程记录。<br/>
本项目为2018年所做,和当前主流技术有所出入,大家可以利用深度学习算法来改进推荐结果。<br/>
下面贴出我收藏的部分资料链接,希望对大家有帮助。
[Window 下 MySQL 5.6.15 下载安装及使用](https://blog.csdn.net/wtfmonking/article/details/17467399)
[Python3 MySQL 数据库连接](http://www.runoob.com/python3/python3-mysql.html)
[协同过滤算法](https://blog.csdn.net/acdreamers/article/details/44672305)
[django](https://www.cnblogs.com/fengbo1113/p/8547302.html)
## 系统流程
用户注册、登录系统,对看过的电影进行评分,点击提交评分按钮,再点击查看推荐按钮即可看见推荐的电影列表。项目主页以及推荐结果如下:<br/>
![img](https://github.com/JaniceWuo/MovieRecommend/blob/master/img/home.jpg)
![img](https://github.com/JaniceWuo/MovieRecommend/blob/master/img/recommend.jpg)
## 如何使用
1.首先将项目克隆到本地,用Pycharm打开movierecommend文件夹,并install<a href="#env">项目依赖</a> <br/>
2.将用到的csv文件导入mysql数据表中,详见<a href="#database">数据库建表</a> ,配置好数据库;注意数据库相关代码(settings.py、views.py)可能都要进行修改以符合实际情况;(本项目端口号为3307,用户为root,密码为admin,database为MovieData);<br/>
3.命令行执行:
```Python
python manage.py makemigrations
python manage.py migrate
python manage.py runserver
```
点击http://127.0.0.1:8000/ 即可查看注册登录以及评分页面。<br/>
**注意登录后点击电影海报下面的星星对该电影评分,之后还要点击左上角的“提交评分”按钮才能将该评分数据存入mysql中,否则代码会报错。**
***
<span id="env">项目依赖</span><br/>
1.Python3.6+django1.11 (python3.5亦可)<br/>
2.MySQL5.6<br/>
3.Jquery+CSS3+Html5
<span id="database">数据库建表处理</span><br/>
1.在MySQL中创建一个database,取好名字,比如`MovieData`;<br/>
2.在该数据库中创建`moviegenre3`和`users_resulttable`两张表,建表命令行如下:
```mysql
CREATE TABLE moviegenre3(imdbId INT NOT NULL PRIMARY KEY,title varchar(300),poster varchar(600));
```
```mysql
CREATE TABLE users_resulttable(userId INT NOT NULL,imdbId INT,rating DECIMAL(3,1));
```
3.通过命令行或者navicat等工具将项目`data`文件夹下的两张csv表分别导入上面创建好的两张table中。由于moviegenre3.csv中的超链接较复杂,建议使用navicat工具导入;users_resulttable表可以使用下面命令行导入:
```mysql
load data infile "E:/MovieRecommend/data/users_resulttable.csv" into table users_resulttable fields terminated by ',' lines terminated by '\n' (userId,imdbId,rating);
```
注意,此表没有主键,增加主键操作为:
```mysql
alter table users_resulttable add column id int auto_increment PRIMARY KEY;
```
## 问题
1.由于在`views.py`的查询推荐结果的代码中直接将查询sql写死为`select * from users_resulttable WHERE userId = 1001`,可能会报keyerror:1001的错误。如果报错请检查`users_resulttable`表的末尾是否存入了userId=1001的用户评分记录,如果没有,很可能是用户没有点击`提交评分`按钮将数据插入数据表造成的。如果要进行第二个用户的注册和登录推荐,要将sql改为userId=1002或者先将user表中所存用户信息删除。<br/>
2.如果通过命令行将csv导入数据库表报错‘The MySQL server is running with the --secure-file-priv option so it cannot execute this statement’,则是mysql版本问题,建议使用5.6版本。如果使用5.7版本出现此问题,修改mysql文件夹下的my.ini文件,增加`secure_file_priv=`语句,并且在service服务里面重启mysql即可。<br/>
3.执行迁移时出现问题建议删除迁移文件重新迁移。<br/>
***
<span id="note"></span>
**笔记**
2018年2月18日<br/> 寒假过的好快啊,前一阵子准备用flask,但是后面进一步了解之后决定用django+mysql+python完成这个推荐系统,现在就在懵懵懂懂的学django
2018/4/5<br/>
UserCF是给用户推荐和他有共同兴趣爱好的用户喜欢的电影,ItemCF是给用户推荐那些和他之前喜欢的电影类似的电影。
目前已经实现UserCF部分算法,模拟了用户-电影矩阵数据,对已有用户里的某一位用户进行电影推荐。之后的工作就是要从csv中获取数据。
看了《推荐系统实践》这本书,后期可能用基于标签,但是基于标签算法涉及更多,每部电影都需要多个标签,不能用movielens数据集。
2018/4/7<br/>
今天尝试用了pycharm,之前一直用的sublime,但是文件管理的比较混乱。用pycharm的时候遇到坑了,我系统按安装的是django1.11,
但是pycharm里面安装的是最新版本2.0,导致项目文件自带的代码有错误。后来又卸了重新安装,统一成了1.11.0版本。
接下来是mysql,项目迁移如下:
```Python
python manage.py makemigrations
```
这只是生成了迁移文件,还要执行迁移文件
```python
python manage.py migrate
```
***
2018/4/8
进行一下流程梳理:
1.先启动mysql:net start mysql;mysql -u root -p;
2. create database [数据库名字];<br/>
3.pycharm直接创建一个django项目,然后进入这个项目下<br/>
4.在settings.py 中,数据库代码为:
```python
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '[数据库名字]',
'PASSWORD': '[自己设置一个密码]',
'HOST': '127.0.0.1',
'USER': 'root',
'PORT': '',
}
}
```
5.在_init_.py中: import pymysql; pymysql.install_as_MySQLdb()
6.models.py:加入模型类,属性等。
7.生成迁移文件:python manage.py makemigrations;执行迁移:python manage.py migrate;
8.在mysql>中:use [数据库名]; show tables;
在项目文件下,python manage.py runserver 浏览器中输入127.0.0.1:8000
9.在templates下写html文件,然后和views.py视图文件、urls.py文件进行匹配
2018/4/10
今天搭建了django的虚拟开发环境,安装了virtualenv,一定要保证整个项目都在虚拟环境中运行。 django1.11.1
关于html文件调用js、css等文件:首先在建的app目录下建一个static文件,分支如下
├─migrations
│ └─__pycache__
├─static
│ ├─css
│ ├─img
│ └─js
└─__pycache__
注意migrations和static文件同级。html文件开头要加上 {% load staticfiles %},引入css的语句为:
```python
<link rel="stylesheet" href="{% static 'css/Test.css' %}">
```
如果纯粹像写前端那样调用css、js是不能成功的。
输入'http://127.0.0.1:8000/users/login/', 返回用户登录界面
点击登录后进入推荐系统首页(目前的首页只有一个电影分类页面,之后应增加分页,以及实现用户对电影评分,数据库记录用户对电影的�