python电影推荐系统 github_GitHub - qingtang3009/MovieRecommend: 一个电影推荐系统
MovieRecommend
一個電影推薦系統(本科畢業設計)——實現用戶登錄、評分、推薦,采用協同過濾算法。🌸
作者序
我完成畢業設計的時間線可以參考README末尾的筆記,請注意筆記中所記載的內容和最后的實際成果有所出入,只做為本人完成畢業設計的過程記錄。
本畢設為2018年所做,和當前主流技術有所出入,大家可以利用深度學習算法來改進推薦結果。
系統流程
用戶注冊、登錄系統,對看過的電影進行評分,點擊提交評分按鈕,再點擊查看推薦按鈕即可看見推薦的電影列表。項目主頁以及推薦結果如下:
如何使用
1.首先將項目克隆到本地,用Pycharm打開movierecommend文件夾,并install項目依賴
2.將用到的csv文件導入mysql數據表中,詳見數據庫建表 ,配置好數據庫;注意數據庫相關代碼(settings.py、views.py)可能都要進行修改以符合實際情況;(本項目端口號為3307,用戶為root,密碼為admin,database為MovieData);
3.命令行執行:
python manage.py makemigrations
python manage.py migrate
python manage.py runserver
點擊http://127.0.0.1:8000/ 即可查看注冊登錄以及評分頁面。
注意登錄后點擊電影海報下面的星星對該電影評分,之后還要點擊左上角的“提交評分”按鈕才能將該評分數據存入mysql中,否則代碼會報錯。
項目依賴
1.Python3.6+django1.11 (python3.5亦可)
2.MySQL5.6
3.Jquery+CSS3+Html5
數據庫建表處理
1.在MySQL中創建一個database,取好名字,比如MovieData;
2.在該數據庫中創建moviegenre3和users_resulttable兩張表,建表命令行如下:
CREATE TABLE moviegenre3(imdbId INT NOT NULL PRIMARY KEY,title varchar(300),poster varchar(600));
CREATE TABLE users_resulttable(userId INT NOT NULL,imdbId INT,rating DECIMAL(3,1));
3.通過命令行或者navicat等工具將項目data文件夾下的兩張csv表分別導入上面創建好的兩張table中。由于moviegenre3.csv中的超鏈接較復雜,建議使用navicat工具導入;users_resulttable表可以使用下面命令行導入:
load data infile "E:/MovieRecommend/data/users_resulttable.csv" into table users_resulttable fields terminated by ',' lines terminated by '\n' (userId,imdbId,rating);
注意,此表沒有主鍵,增加主鍵操作為:
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表中所存用戶信息刪除。
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即可。
3.執行遷移時出現問題建議刪除遷移文件重新遷移。
4.如有其他問題可郵件致信我:mahappyending@gmail.com
筆記
2018年2月18日
寒假過的好快啊,前一陣子準備用flask,但是后面進一步了解之后決定用django+mysql+python完成這個推薦系統,現在就在懵懵懂懂的學django
2018/4/5
UserCF是給用戶推薦和他有共同興趣愛好的用戶喜歡的電影,ItemCF是給用戶推薦那些和他之前喜歡的電影類似的電影。
目前已經實現UserCF部分算法,模擬了用戶-電影矩陣數據,對已有用戶里的某一位用戶進行電影推薦。之后的工作就是要從csv中獲取數據。
看了《推薦系統實踐》這本書,后期可能用基于標簽,但是基于標簽算法涉及更多,每部電影都需要多個標簽,不能用movielens數據集。
2018/4/7
今天嘗試用了pycharm,之前一直用的sublime,但是文件管理的比較混亂。用pycharm的時候遇到坑了,我系統按安裝的是django1.11,
但是pycharm里面安裝的是最新版本2.0,導致項目文件自帶的代碼有錯誤。后來又卸了重新安裝,統一成了1.11.0版本。
接下來是mysql,項目遷移如下:
python manage.py makemigrations
這只是生成了遷移文件,還要執行遷移文件
python manage.py migrate
2018/4/8
進行一下流程梳理:
1.先啟動mysql:net start mysql;mysql -u root -p;
2. create database [數據庫名字];
3.pycharm直接創建一個django項目,然后進入這個項目下
4.在settings.py 中,數據庫代碼為:
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
如果純粹像寫前端那樣調用css、js是不能成功的。
輸入'http://127.0.0.1:8000/users/login/', 返回用戶登錄界面
點擊登錄后進入推薦系統首頁(目前的首頁只有一個電影分類頁面,之后應增加分頁,以及實現用戶對電影評分,數據庫記錄用戶對電影的評分)
2018/4/12
今天找到了另一個csv文件,里面含有電影海報的鏈接,這樣可以直接用Js動態獲取鏈接然后加載圖片;
還有由于有很多個csv文件,每個文件包含的內容都不一樣,所以要將各個文件合并。準備直接用mysql的多表查詢。花了很久才成功把csv導入進mysql表中的ratings.
2018/4/13
注意result表里面要存電影的名字,而名字里面很多不確定的特殊符號,比如有逗號,冒號等。所以不能加enclosed by '"'這句,否則csv導進mysql表時會中斷。
4/14
今天做的很少,主要都去看深度學習視頻了,為以后的研究生項目掃盲。
主要還是csv和Mysql的問題,不知道要怎么去遍歷里面的數據。之前是自己模擬的幾個用戶對電影進行評分,用的是列表類型,我就想能不能讀取csv然后轉為列表再操作。
4/20
由于之前創建表時,不小心將rating設為了int型,所以今天重新建了一張表改為DECIMAL,名為resultTable。而且增加了主鍵:id。
‘alter table resultTable add column id int auto_increment PRIMARY KEY;’是給表增加一列并設為自增主鍵。
現在前端頁面已經可以獲取圖片的imdbId號和評分,接下來就是獲取當前用戶的名字,給他分一個從669開始的userId號。然后插入imdbId號和rating,調用算法進行分析。
4/25
今天實現了可以從前端頁面獲取評分的電影的rating和imdbId號并存入users_resulttable中,還要解決的是給登錄用戶自動分配一個userId號,與他的評分相對應。
之后要實現算法從數據庫中獲取數據得出推薦結果。現在沒有存title,后面得出推薦結果了就通過查詢imdbId號得到海報和title。
還實現了index.html顯示用戶登錄信息。
重新根據model生產數據表要將所有的遷移文件都刪除才能生成成功。
4/26
實現了給每個用戶分配一個id,其實是在原有的user.id基礎上加1000.
然后將算法導入pycharm,并且實現了可以將mysql數據表導出為csv文件。
現在的Mysql表是user_resulttable,同csv文件,csv文件導出到static下。明天的任務是通過按鈕將其連貫起來。
4/27
poster2從moviegenre7.txt導入。
對users_resulttable的處理:
alter table users_resulttable drop column id;
load data local infile "e:/Moviedatabase/rrtotaltable.csv" into table users_resulttable fields terminated by ',' lines terminated by '\n' (userId,imdbId,rating);
alter table users_resulttable add column id int auto_increment PRIMARY KEY;
費勁周折終于實現了從數據庫里獲取海報鏈接并且顯示在html上。
但是,還沒有實現從recommend函數得到的imdbId中查詢到poster再顯示。可能要將imdbId存到數組里再循環查詢。
而且還有個問題,就是現在頁面一刷新數據庫里就會出現重復的值。
4/28
有個最大的問題,現在imdbId和poster對應的表不完整,很多推薦出來的ImdbId號找不到電影海報。
必須要解決這個問題,而且最好增加title。現已解決select查詢語句遍歷recommend函數輸出的數組。
4/29
到今天為止,畢設基本已經完成。且增加了用戶注銷按鈕。
但有幾點不足:
1.推薦頁面的排版樣式未設計 2.運行速度有點慢 3.只用了一種推薦算法 4.每次刷新都在重新生成推薦列表,應該去除這種效果,刷新不應該變動。
4/30
提高了一點運行速度。
5/2
今天寫完了ItemCF,但其實性能比UserCF差。因為電影數據集的電影數量比用戶多太多。
5/7
今天登入數據庫出現了問題,一直登不進去。后面重新建了數據庫,重設置了密碼。
數據庫端口號由3306改為3307,要刪除遷移文件重新執行遷移。
CREATE TABLE moviegenre3(imdbId INT NOT NULL PRIMARY KEY,title varchar(300),poster varchar(600));
然后通過navicat將moviegenre3.csv自動導入。
總結
以上是生活随笔為你收集整理的python电影推荐系统 github_GitHub - qingtang3009/MovieRecommend: 一个电影推荐系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JOSSO在JBOSS中安装与配置
- 下一篇: 插件之基类窗体