文章目錄
- 1 簡介
- 1 設計概要
- 2 課題背景和目的
- 3 協同過濾算法原理
- 3.1 基于用戶的協同過濾推薦算法實現原理
- 3.1.1 步驟1
- 3.1.2 步驟2
- 3.1.3 步驟3
- 3.1.4 步驟4
- 4 系統實現
- 4.1 開發環境
- 4.2 系統功能描述
- 4.3 系統數據流程
- 4.3.1 用戶端數據流程
- 4.3.2 管理員端數據流程
- 4.4 系統功能設計
- 5 主要頁面設計
- 5.1 登錄頁面設計
- 5.2 系統首頁設計
- 5.3 電影詳情頁面設計
- 5.4 代碼實現
- 5.4.1 Django配置
- 5.5 模板配置
- 5.6 用戶登錄功能實現
- 5.7 圖片上傳功能實現
- 5.8 個性化推薦功能實現
- 5 最后
1 簡介
🔥 優質競賽項目系列,今天要分享的是
基于協同過濾的電影推薦系統
該項目較為新穎,適合作為競賽課題方向,學長非常推薦!
🧿 更多資料, 項目分享:
https://gitee.com/dancheng-senior/postgraduate
1 設計概要
21世紀是信息化時代,隨著信息技術和網絡技術的發展,信息化已經滲透到人們日常生活的各個方面,人們可以隨時隨地瀏覽到海量信息,但是這些大量信息千差萬別,需要費事費力的篩選、甄別自己喜歡或者感興趣的數據。對網絡電影服務來說,需要用到優秀的協同過濾推薦功能去輔助整個系統。
學長設計的系統基于Python技術,使用UML建模,采用Django框架組合進行設計,Mysql數據庫存儲數據。本系統的功能主要包括:用戶注冊、登錄、信息維護、搜索電影、電影評分、個性化推薦以及管理員進行信息管理等。
個性化推薦功能使用基于用戶的協同過濾算法和熱點推薦來實現。開發工具主要有:Pycharm、Python3.8、Django3、mysql8、Navicat等。
電影在線推薦系統很大程度上提高了對電影管理的效率,符合廣大用戶的基本需求。
2 課題背景和目的
日益發展的網絡技術與信息技術,各種電影網站也是逐漸應運而生,例如:騰訊視頻、優酷視頻、愛奇藝視頻等。人們可以隨時隨地瀏覽到海量信息,但是這些大量信息千差萬別,需要人們費事費力的篩選、甄別自己喜歡或者感興趣的數據。
這個課題主要是解決電影網站的個性化推薦功能,以便準確向用戶推薦感興趣的信息。個性化推薦的主要思想是,根據用戶的歷史操作行為,分析用戶興趣喜好,然后把用戶比較感興趣的同時沒有操作行為的項目推薦給用戶。個性化推薦也可以根據用戶操作行為的變化而實時分析并推薦用戶喜好程度比較高的項目,這樣用戶會對網站產生粘性,提高用戶的忠誠度,為商家帶來流量,進一步提高商家利潤,具有較大的商業價值,可以達到雙贏的目的。
3 協同過濾算法原理
3.1 基于用戶的協同過濾推薦算法實現原理
傳統的基于用戶(User-Based)的協同過濾推薦算法實現原理分四個步驟:
3.1.1 步驟1
根據用戶歷史行為信息構建用戶-
項目評分矩陣,用戶歷史行為信息包括項目評分、瀏覽歷史、收藏歷史、喜好標簽等,本文以單一的項目評分為例,后期介紹其他行為信息和混合行為信息,用戶-
項目評分矩陣如表1所示:
注:用戶A對項目1的評分是1分,用戶A對項目2沒有評分。
3.1.2 步驟2
根據用戶-
項目評分矩陣計算用戶之間的相似度。計算相似度常用的方法有余弦算法、修正余弦算法、皮爾森算法等等(后期我們會將相似度算法展開講解,這里以余弦算法為例)。余弦算法公式如圖1所示:
3.1.3 步驟3
根據用戶之間的相似度得到目標用戶的最近鄰居KNN。KNN的篩選常用的有兩種方式,一種是設置相似度閥值(給定一個相似度的下限,大于下限的相似度為最近鄰居),一種是根據與目標用戶相似度的高低來選擇前N個最近鄰居(本次以前N個為例,后期會詳細對比講解兩者)。相似度排序可用經典冒泡排序法。
3.1.4 步驟4
預測項目評分并進行推薦。最常用的預測公式如圖所示:
注:該公式實際上是相似度和評分的加權平均數。表示用戶u對項目i的預測評分,n是最近鄰集合,v是任意一個最近鄰居,
表示最近鄰v和目標用戶u的相似度乘以最近鄰v對項目i的評分。得到預測評分后按照評分高低進行降序推薦。
4 系統實現
4.1 開發環境
- Python3.8,
- Django3,
- mysql8,
- navicat數據庫管理工具,
- html頁面,
- javascript腳本,
- jquery腳本,
- bootstrap前端框架,
- layer彈窗組件等。
4.2 系統功能描述
系統代碼目錄
項目功能
- 前臺首頁地址:http://127.0.0.1:8000/
- 后臺首頁地址:http://127.0.0.1:8000/admin
- 管理員賬號:admin 管理員密碼:admin
- 前臺用戶包含:注冊、登錄、注銷、瀏覽電影、搜索電影、信息修改、電影評分、個性化推薦電影等功能;
- 后臺管理員包含:用戶管理、電影管理、電影類型管理、評分管理、權限管理等。
性化推薦功能
游客采用熱點推薦(根據電影總評分降序推薦),
登錄用戶,首先根據用戶評分記錄,使用基于用戶的協同過濾推薦算法推薦電影,如果沒有推薦結果采用熱點推薦(根據電影總評分降序推薦)
算法的實現使用python常規函數,嚴格按照算法步驟實現。
舉例:
用戶A:對電影1,2,3進行評分
用戶B:對電影1,2進行評分
用戶C:對電影1進行評分
那么:
用戶B,C 不會對用戶A進行推薦
用戶A,C 不會對用戶B進行推薦
用戶A,B 會對用戶C進行推薦電影2
4.3 系統數據流程
電影在線推薦系統主要由用戶端、管理員端組成。用戶端主要負責用戶注冊、登錄、信息維護、搜索電影、查看電影、電影評分、個性化推薦等,管理員端負責管理員登錄、信息維護、用戶管理、電影類型管理、電影管理、評分管理等。
4.3.1 用戶端數據流程
用戶端的基本流程共有四個步驟:
- 1、用戶在系統首頁可瀏覽電影、搜索電影、個性化推薦。
- 2、用戶輸入用戶名、年齡、性別、郵箱、登錄密碼進行注冊。
- 3、用戶注冊成功后輸入正確的登錄憑證進入系統,若登錄憑證不正確,系統會自動返回到登錄頁面,提示用戶重新輸入登錄信息,直到用戶成功登錄進入系統。
- 4、用戶成功進入系統后,可以進行電影打分、修改信息、個性化推薦等。
具體如下圖所示:
4.3.2 管理員端數據流程
管理員端的基本流程共有三個步驟:
1、管理員輸入正確的登錄憑證進入系統,若登錄憑證不正確,系統會自動返回到登錄頁面,提示管理員重新輸入登錄信息,直到管理員成功登錄進入系統。
2、管理員成功進入系統后,首頁顯示用戶數量、電影類型數量、電影數量、評分數量等數據統計信息。
3、管理員具有用戶管理、電影類型管理、電影管理、評分管理等功能。
根據上述流程可得到管理員端的數據流程圖,具體如下圖所示
4.4 系統功能設計
電影在線推薦系統主要由用戶端、管理員端模塊組成,各個模塊下邊又有許多小模塊組成,每個模塊的作用各不相同,但彼此之間又存在一定關系,通過分析上述模塊之間的聯系以及系統需求,可得到該系統的功能架構,具體如圖
5 主要頁面設計
5.1 登錄頁面設計
用戶登錄頁面使用DIV標簽布局,Form標簽提交登錄名、登錄密碼,登錄時Jquery腳本會驗證登錄名或登錄密碼是否為空,如果為空,會給出提示取消登錄操作,登陸成功也會給出登錄成功提示
5.2 系統首頁設計
統首頁使用DIV標簽布局,分為頭頁面、中間頁面、底頁面,其中頭頁面是公共頁面,包含網站名稱、搜索框、注冊按鈕、登錄按鈕、用戶名、注銷按鈕、電影類型等,中間頁面是內容頁面,不同的頁面展示不同的內容,底頁面也是公共頁面,使用Django的include指令引入頭和底頁面
5.3 電影詳情頁面設計
電影詳情頁面使用DIV標簽布局,通過Django的include指令引入頭頁面和底頁面,內容頁展示電影封面、電影名稱、電影類型、電影簡介和五角星評分按鈕。如果當前登錄用戶沒有對該電影進行評分,那么評分五角星顏色是灰色,如果有用戶評分,那么根據評分多少顯示具體個數的黃色五角星,五角星評分功能使用Jquery的raty腳本組件
5.4 代碼實現
5.4.1 Django配置
Django是一個開放源代碼的Web應用框架,由Python寫成。采用了MTV的框架模式,即模型M,視圖V和模版T。通過Pycharm工具可以輕松創建Django框架項目,初始項目中主要包含settings.py主配置文件、urls.py路由配置文件、manage.py項目啟動配置文件等。settings.py主配置文件可配置項目自定義應用程序、數據庫鏈接、視圖路徑、靜態資源路徑、日志等;urls.py路由配置文件主要是配置請求路由、項目名稱等。
?
# 在setting.py中定義全局變量,該變量的變量名需要全部大寫,否則會引用不到
import os
# import rpvpext.webutil
from pathlib import Path# 項目根目錄:例如:F:\pycharmworkspace\WebMovieCFRSPython
BASE_DIR = Path(__file__).resolve().parent.parent# setting中的加密鹽,該配置是django的安全配置,防止攻擊用的,該值是startProject時用系統的某個算法產生
SECRET_KEY = 'django-insecure-9nvr8lf^amyc)9y)wgcm&2th*%j=2l-s4@_(%#z^%l1z4neyd$'# 調試模式是否開啟
DEBUG = True# 訪問web服務的的Ip配置,用于配置能夠訪問當前站點的域名(IP地址),
# 當 DEBUG = False 時,必須填寫,有以下三種使用方法:
# [],空列表,表示只有127.0.0.1,localhost能訪問本項目;
# ['*'],表示任何網絡地址都能訪問到當前項目;
# ['192.168.1.3', '192.168.3.3'] 表示只有當前兩個主機能訪問當前項目。
ALLOWED_HOSTS = ['*']# app應用的安裝配置
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','apps.index.apps.AppsConfig', # 自定義app,前臺首頁'apps.user.apps.AppsConfig', # 自定義app,用戶'apps.type.apps.AppsConfig', # 自定義app,電影類型'apps.item.apps.AppsConfig', # 自定義app,電影'apps.scorerecord.apps.AppsConfig', # 自定義app,評分記錄'apps.common.apps.AppsConfig' # 自定義app,公共
]# django的中間件配置,即MIDDLEWARE設置,
# 所謂中間件就是從用戶請求到用戶請求結束期間所做的操作,
# 即用戶的請求會次從上到下依次執行MIDDLEWARE中的配置,
# 然后服務器響應用戶的時候會再次從下至上依次執行,
# 在request請求前后,和response響應前后執行
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware', # 安全中間件'django.contrib.sessions.middleware.SessionMiddleware', # 會話中間件, 啟用會話框架'django.middleware.common.CommonMiddleware', # 通用中間件# CSRF防御中間件,增加防御保護以防止跨站偽造請攻擊。通過向表單Post請求中添加隱藏表單字段以及對請求進行檢查以獲取正確的值。'django.middleware.csrf.CsrfViewMiddleware',# admin用戶認證中間件,在每個HttpRequest請求對象中添加user屬性,表名當前已登錄的用戶'django.contrib.auth.middleware.AuthenticationMiddleware',# 消息中間件,提供Django的cookie以及session框架的支持,這兩個基于消息中間件實現。'django.contrib.messages.middleware.MessageMiddleware',# X框架操作中間件,通過頭部信息中增加X-Frame-OptionsLAI 防止簡單的點擊劫持。'django.middleware.clickjacking.XFrameOptionsMiddleware',# 前臺登錄權限驗證中間件,自定義'apps.common.loginMiddleware.LoginMiddleware',
]# 指定根級url的配置
ROOT_URLCONF = 'MovieRecommendSystemPython.urls'# 它用于指定模板的配置信息,列表中每一元素都是一個字典。如下所示是 Django 默認自帶模板引擎
# 全局上下文處理器提供的變量優先級高于單個視圖函數給單個模板傳遞的變量。
# 這意味著全局上下文處理器提供的變量可能會覆蓋你視圖函數中自定義的本地變量,
# 因此請注意避免本地變量名與全局上下文處理器提供的變量名稱重復。
# 這些變量名包括perms, user和debug等等。
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates', # 默認使用的模板引擎'DIRS': [os.path.join(BASE_DIR, 'templates')], # 模板路徑'APP_DIRS': True, # 引擎是否在已安裝應用程序(的目錄)內查找模板源文件。'OPTIONS': { # 傳遞給模板引擎的其他參數'context_processors': [ # 上下文處理器,也可以自定義,這樣就可以在模板中直接使用debug、request、auth、message變量# 在模板里面可以直接使用settings的DEBUG參數以及強大的sql_queries:它本身是一個字典,# 其中包括當前頁面執行SQL查詢所需的時間'django.template.context_processors.debug',# 在模板中可以直接使用request對象'django.template.context_processors.request',# 在模板里面可以直接使用user,perms對象。'django.contrib.auth.context_processors.auth',# 在模板里面可以直接使用message對象。'django.contrib.messages.context_processors.messages',# 也可以繼續添加# "django.template.context_processors.i18n", # 在模板里面可以直接使用settings的LANGUAGES和LANGUAGE_CODE# 'django.template.context_processors.media', # 可以在模板里面使用settings的MEDIA_URL參數# 'django.template.loaders.filesystem.Loader',# 'django.template.loaders.app_directories.Loader',],},},
]# 項目部署時,Django的內置服務器將使用的WSGI應用程序對象的完整Python路徑。
WSGI_APPLICATION = 'MovieRecommendSystemPython.wsgi.application'# 數據庫鏈接配置,也可以以配置文件的形式加載數據庫信息,django目前支持sqlite、mysql、postgreSQL、oracle數據庫
# sqlite數據庫:'django.db.backends.sqlite3',
# postgreSQL數據庫:'django.db.backends.postgresql_psycopg2',
# mysql數據庫:'django.db.backends.mysql'
# oracle數據庫:'django.db.backends.oracle'
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'movierecommendsystempython','USER': 'root','PASSWORD': 'root','HOST': '127.0.0.1','PORT': '3306',}
}# 這是一個支持插拔的密碼驗證器,且可以一次性配置多個,
# Django 通過這些內置組件來避免用戶設置的密碼等級不足的問題。
AUTH_PASSWORD_VALIDATORS = [{ # 檢查密碼和用戶某些屬性的相似性'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',},{ # 檢查密碼的最小長度(默認8)'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',},{ # 檢查密碼是否出現在常用密碼表中'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',},{ # 檢查密碼是否全為數字'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',},
]# 設置語言zh-hans,zh-cn,en-us
LANGUAGE_CODE = 'zh-hans'
# 設置時區Asia/Shanghai,UTC
TIME_ZONE = 'Asia/Shanghai'
# 設置國際化,根據個人需要進行設置:
USE_I18N = True
# 相同內容被不同時區地區的用戶訪問時,是否以不同格式內容展示(例如時間,日期,數字)
USE_L10N = True
# 設置保存到數據庫時間類型是否為UTC時間,如果不需要請設置為false,默認為true
USE_TZ = True# 它指的是靜態資源的存放位置,靜態資源包括 CSS、JS、Images。比如我們要在項目中添加一些靜態圖片
# 通常這些靜態圖片被存放在新建的 static 目錄下,這樣就實現了通過 STATIC_URL= '/static/' 路徑對靜態資源的訪問。
STATIC_URL = '/static/'# 靜態文件的路徑
STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')
]# 設置圖片上傳路徑
MEDIA_ROOT = os.path.join(BASE_DIR, "media/")
# 圖片的統一路由
MEDIA_URL = "/media/"# 日志
LOGGING = {'version': 1,'disable_existing_loggers': False,'handlers': {'console':{'level':'DEBUG','class':'logging.StreamHandler',},},'loggers': {'django.db.backends': {'handlers': ['console'],'propagate': True,'level':'DEBUG',},}
}
?
5.5 模板配置
模板是html文件,默認路徑是項目根路徑的templates文件夾中。Django模板中主要有兩種特殊符號:{{ }}和 {% %},{{
}}表示變量可直接獲取request、session、application中的變量,在模板渲染的時候替換成值,{% %}表示邏輯相關的操作,可直接編寫python代碼。圖5.5是前臺index.html部分配置。
5.6 用戶登錄功能實現
用戶在登錄頁面登錄失敗會提示登錄失敗原因,用戶登錄成功會提示正在跳轉頁面。用戶登錄實現代碼具體如圖
5.7 圖片上傳功能實現
本系統圖片上傳功能使用Django后臺框架的Model組件實現,在model文件中直接聲明實體類的屬性類型是圖片類型。圖片上傳功能代碼具體如圖
5.8 個性化推薦功能實現
基于用戶的協同過濾推薦算法實現可分為三個步驟:首先將用戶電影評分數據構建成用戶-
電影評分矩陣,然后通過皮爾森相似度算法計算用戶之間的相似度,再從中選出與目標用戶相似度最高的TopN個最近鄰用戶,然后計算TopN個近鄰用戶的相似度與電影的加權平均數,最后得到K個推薦的電影。
5 最后
🧿 更多資料, 項目分享:
https://gitee.com/dancheng-senior/postgraduate