基于TensorFlow+CNN+协同过滤算法的智能电影推荐系统——深度学习算法应用(含微信小程序、ipynb工程源码)+MovieLens数据集(六)

目录

  • 前言
  • 总体设计
    • 系统整体结构图
    • 系统流程图
  • 运行环境
  • 模块实现
    • 1. 模型训练
      • 1)数据集分析
      • 2)数据预处理
      • 3)模型创建
      • 4)模型训练
      • 5)获取特征矩阵
    • 2. 后端Django
    • 3. 前端微信小程序
      • 1)小程序全局配置文件
      • 2)推荐电影页面
      • 3)个人信息界面以及用户登录记录页面
  • 相关其它博客
  • 工程源代码下载
  • 其它资料下载


在这里插入图片描述

前言

本项目专注于MovieLens数据集,并采用TensorFlow中的2D文本卷积网络模型。它结合了协同过滤算法来计算电影之间的余弦相似度,并通过用户的交互方式,以单击电影的方式,提供两种不同的电影推荐方式。

首先,项目使用MovieLens数据集,这个数据集包含了大量用户对电影的评分和评论。这些数据用于训练协同过滤算法,以便推荐与用户喜好相似的电影。

其次,项目使用TensorFlow中的2D文本卷积网络模型,这个模型可以处理电影的文本描述信息。模型通过学习电影的文本特征,能够更好地理解电影的内容和风格。

当用户与小程序进行交互时,有两种不同的电影推荐方式:

  1. 协同过滤推荐:基于用户的历史评分和协同过滤算法,系统会推荐与用户喜好相似的电影。这是一种传统的推荐方式,通过分析用户和其他用户的行为来推荐电影。

  2. 文本卷积网络推荐:用户可以通过点击电影或输入文本描述,以启动文本卷积网络模型。模型会分析电影的文本信息,并推荐与输入的电影或描述相匹配的其他电影。这种方式更注重电影的内容和情节相似性。

综合来看,本项目融合了协同过滤和深度学习技术,为用户提供了两种不同但有效的电影推荐方式。这可以提高用户体验,使他们更容易找到符合他们口味的电影。

总体设计

本部分包括系统整体结构图和系统流程图。

系统整体结构图

系统整体结构如图所示。
在这里插入图片描述

系统流程图

系统流程如图所示。

在这里插入图片描述

模型训练流程如图所示。

在这里插入图片描述

服务器运行流程如图所示。

在这里插入图片描述

运行环境

本部分包括Python环境、TensorFlow环境、 后端服务器、Django和微信小程序环境。

模块实现

本项目包括3个模块:模型训练、后端Django、 前端微信小程序模块,下面分别给出各模块的功能介绍及相关代码。

1. 模型训练

下载数据集,解压到项目目录下的./ml-1m文件夹下。数据集分用户数据users.dat、电影数据movies.dat和评分数据ratings.dat。

1)数据集分析

数据集网站地址为http://files.grouplens.org/datasets/movielens/ml-1m-README.txt对数据的描述。

相关博客:https://blog.csdn.net/qq_31136513/article/details/133124641#1_44

2)数据预处理

通过研究数据集中的字段类型,发现有一些是类别字段,将其转成独热编码,但是UserID、MovieID的字段会变稀疏,输入数据的维度急剧膨胀,所以在预处理数据时将这些字段转成数字。

相关博客:https://blog.csdn.net/qq_31136513/article/details/133124641#2_123

3)模型创建

相关博客:https://blog.csdn.net/qq_31136513/article/details/133125845#3_50

4)模型训练

相关博客:https://blog.csdn.net/qq_31136513/article/details/133130704#4_57

5)获取特征矩阵

本部分包括定义函数张量、生成电影特征矩阵、生成用户特征矩阵。

相关博客:https://blog.csdn.net/qq_31136513/article/details/133130704#5_240

2. 后端Django

该模块实现了推荐算法的封装与前端数据交互功能。

相关博客:https://blog.csdn.net/qq_31136513/article/details/133131103#2_Django_67

3. 前端微信小程序

该模块实现用户交互以及与后端数据的传输功能,通过微信开发者平台进行前端开发。

1)小程序全局配置文件

全局配置文件通常以APP开头,包括app.jsapp.jsonapp.wxss等, 这些文件在新建小程序时,由微信开发者平台自动生成。

app.js相关代码如下:

//app.js
App({onLaunch: function () {console.log("app launch")//展示本地存储能力var logs = wx.getStorageSync('logs') || []logs.unshift(Date.now())wx.setStorageSync('logs', logs)//登录wx.login({success: res => {}});//获取用户信息wx.getSetting({success: res => {if (res.authSetting['scope.userInfo']) {//已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框wx.getUserInfo({success: res => {//可以将res发送给后台解码出unionIdthis.globalData.userInfo = res.userInfo//由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回//此处加入callback 以防止类似情况if (this.userInfoReadyCallback) {this.userInfoReadyCallback(res)}}})}}})},globalData: {userInfo: null,}
})

文件app.json为json格式,不能添加注释。pages表示小程序包含的页面,共有三个,一是电影推荐页面movies;二是个人信息页面index;三是用户登录记录logs; window是标题栏设置,可以更改文字类型、背景颜色、标题文字; tabBar是 底部导航栏,可以选择当前页面,包含各页面的路径以及图标,图标可以在阿里巴巴矢量图标库https://www.iconfont.cn/中找到,其他为默认配置。

相关代码如下:

{"pages": ["pages/movies/movies","pages/index/index","pages/logs/logs"],"window": {"backgroundTextStyle": "light","navigationBarBackgroundColor": "#fff","navigationBarTitleText": "Movies","navigationBarTextStyle": "black"},"tabBar": {"list": [{"pagePath": "pages/movies/movies","text": "Movies","iconPath": "/icon/movie.png","selectedIconPath": "/icon/movie_selected.png"},{"pagePath": "pages/index/index","text": "Mine","iconPath": "/icon/user.png","selectedIconPath": "/icon/user_selected.png"}]},"style": "v2","sitemapLocation": "sitemap.json"
}

文件app.wxss中描述了小程序的样式表,用于配置全局页面元素样式,app.wxss相关代码如下:

/**app.wxss**/
@import './weui-miniprogram/weui-wxss/dist/style/weui.wxss';
/*定义了container的样式*/
.container {height: 100%;display: flex;flex-direction: column;align-items: center;justify-content: space-between;padding: 200rpx 0;box-sizing: border-box;
} 

2)推荐电影页面

推荐电影页面movies,包含movies.jsmovies.jsonmovies.wxmlmovies.wxss。其中movies.js记录的是逻辑层; movies.wxml记录的是视图层; movies.wxss记录页面元素的样式表;movies.json 类似于app.json,记录这个页面的相关配置信息。

相关代码如下:

//pages/movies/movies.js
Page({/*页面的初始数据*/data: {//电影相关信息movies: null,//推荐方式recommend_mode: null,//推荐方式选择信息recommend_mode_list: [{name: "同类型电影", value: 0, checked: "false"},{name: "看过这个的还喜欢看", value: 1, checked: "true"}]},//页面单选按钮逻辑功能函数,选择推荐方式时触发radioChange: function (e) {//用单选按钮的值给推荐方式变量赋值this.setData({ recommend_mode: e.detail.value })console.log(this.data.recommend_mode)},//推荐同类型电影post_st_movies: function (event) {var that = this;//向后端服务器发出请求wx.request({//这里url填写用户服务器的域名,不显示url: '',//发送数据为电影的IDdata: {movie_id: event.currentTarget.dataset.movie_id,},//POST方法method: 'post',header: {'content-type': 'application/x-www-form-urlencoded' //默认值},//成功后执行success(res) {//更新电影信息that.setData({ movies: res.data })console.log(that.data.movies[0].movie_id);}})},//推荐看过这个电影的人喜欢的电影post_of_movies: function (event) {var that = this;//向后端服务器发出请求wx.request({//这里url填写用户服务器的域名,不显示url: '',//发送数据为电影的IDdata: {movie_id: event.currentTarget.dataset.movie_id,},//POST方法method: 'post',header: {'content-type': 'application/x-www-form-urlencoded' //默认值},//成功后执行success(res) {//更新电影信息that.setData({ movies: res.data })console.log(that.data.movies[0].movie_id);}})},//电影推荐按钮的逻辑功能recommend_movies: function (event) {//如果是0模式if (this.data.recommend_mode == 0) {this.post_st_movies(event);}//如果是1模式else if (this.data.recommend_mode == 1) {this.post_of_movies(event);}},//随机获取电影函数逻辑功能get_rand_movies: function () {var that = this;//向后端服务器发出请求wx.request({//url填写用户服务器的域名,不显示url: '',data: {},//GET方法method: 'get',header: {'content-type': 'application/x-www-form-urlencoded' //默认值},//成功后执行success(res) {//更新电影信息that.setData({ movies: res.data })console.log(that.data.movies[0].movie_id);}})},/*生命周期函数--监听页面加载*/onLoad: function (options) {this.get_rand_movies();},/*生命周期函数--监听页面初次渲染完成*/onReady: function () {},/* 生命周期函数--监听页面显示*/onShow: function () {},/*生命周期函数--监听页面隐藏*/onHide: function () {},/*生命周期函数--监听页面卸载*/onUnload: function () {},/*页面相关事件处理函数--监听用户下拉动作*/onPullDownRefresh: function () {},/*页面上拉触底事件的处理函数*/onReachBottom: function () {},/*用户单击右上角分享*/onShareAppMessage: function () {}
})
//文件movies.json代码为空,movies.wxml相关代码如下:
<!--pages/movies/movies.wxml-->
<!--页面容器-->
<view class="container"><!--页面--><view class="page-body"><!--推荐方式选择容器--><view class="mode-choose-container"><text>请选择推荐方式:</text><radio-group class="mode-choose" bindchange="radioChange"><radio class="radio" wx:for-items="{{recommend_mode_list}}" value="{{item.value}}" ><text>{{item.name}}</text></radio></radio-group></view><!--电影信息容器--><view class="movie-container" wx:for="{{[0,1,2,3,4]}}" hover-class='hover_list' data-movie_id="{{movies[index].movie_id}}" bindtap="recommend_movies"><text>Top {{index+1}}</text><!--电影名称--><view class="movie-name-container"><text class="movie-name">{{movies[index].movie_name}}</text></view><!--电影流派--><view class="movie-genres-container"><text class="movie-genres">{{movies[index].movie_genres}}</text></view></view></view>
</view>
//movies.wxss相关代码
/* pages/movies/movies.wxss */
.container {/*透明度: 0.1*/align-items: center;background: #f5f5f5;
}
.page-body {/*透明度:0.2*/align-items: center;background: #fefefe;border-style: solid;border-color: #b2b2b2;border-width: thin medium medium thin;border-radius: 50rpx;width: 660rpx;
}
.mode-choose-container {align-items: center;padding:20rpx;
}
.movie-container {align-items: center;border-style: solid;border-color: #b2b2b2;border-width: thin medium medium thin;border-radius: 50rpx;margin: 20rpx 15rpx 20rpx 15rpx;padding:20rpx;text-align: center;
}
.hover_list {opacity: 0.9;background: #f7f7f7;
}

3)个人信息界面以及用户登录记录页面

这两个页面是新建小程序时系统自动生成的,不做改动。以下个人信息页面由index.jsindex.htmlindex.jsonindex.wxss等文件构成。

index.js相关代码如下:

//获取应用实例
const app = getApp()
Page({data: {motto: 'Hope you find your peace.',userInfo: {},hasUserInfo: false,canIUse: wx.canIUse('button.open-type.getUserInfo')},//事件处理函数bindViewTap: function() {wx.navigateTo({url: '../logs/logs'})},onLoad: function () {if (app.globalData.userInfo) {this.setData({userInfo: app.globalData.userInfo,hasUserInfo: true})} else if (this.data.canIUse){
//由于getUserInfo是网络请求,可能会在Page.onLoad后才返回
//此处加入callback 防止这种情况发生app.userInfoReadyCallback = res => {this.setData({userInfo: res.userInfo,hasUserInfo: true})}} else {//在没有 open-type=getUserInfo版本的兼容处理wx.getUserInfo({success: res => {app.globalData.userInfo = res.userInfothis.setData({userInfo: res.userInfo,hasUserInfo: true})}})}},getUserInfo: function(e) {console.log(e)app.globalData.userInfo = e.detail.userInfothis.setData({userInfo: e.detail.userInfo,hasUserInfo: true})}
})
//index.html相关代码
<!--index.wxml-->
<view class="container"><view class="userinfo"><button wx:if="{{!hasUserInfo && canIUse}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 获取头像昵称 </button><block wx:else><image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image><text class="userinfo-nickname">{{userInfo.nickName}}</text></block></view><view class="usermotto"><text class="user-motto">{{motto}}</text></view>
</view>
//文件index.json为空,index.wxss相关代码
/**index.wxss**/
.userinfo {display: flex;flex-direction: column;align-items: center;
}
.userinfo-avatar {width: 128rpx;height: 128rpx;margin: 20rpx;border-radius: 50%;
}
.userinfo-nickname {color: #aaa;
}
.usermotto {margin-top: 200px;
}

以下是用户登录记录页面,由logs.jslogs.htmllogs.jsonlogs.wxss等文件构成。

logs.js相关代码如下:

//logs.js
const util = require('../../utils/util.js')
Page({data: {logs: []},onLoad: function () {this.setData({logs: (wx.getStorageSync('logs') || []).map(log => {return util.formatTime(new Date(log))})})}
})
//logs.html相关代码
<!--logs.wxml-->
<view class="container log-list"><block wx:for="{{logs}}" wx:for-item="log"><text class="log-item">{{index + 1}}. {{log}}</text></block>
</view>
//logs.wxss代码如下:
.log-list {display: flex;flex-direction: column;padding: 40rpx;
}
.log-item {margin: 10rpx;
}
//文件logs.json代码
{"navigationBarTitleText": "查看启动日志","usingComponents": {}
}

相关其它博客

基于TensorFlow+CNN+协同过滤算法的智能电影推荐系统——深度学习算法应用(含微信小程序、ipynb工程源码)+MovieLens数据集(一)

基于TensorFlow+CNN+协同过滤算法的智能电影推荐系统——深度学习算法应用(含微信小程序、ipynb工程源码)+MovieLens数据集(二)

基于TensorFlow+CNN+协同过滤算法的智能电影推荐系统——深度学习算法应用(含微信小程序、ipynb工程源码)+MovieLens数据集(三)

基于TensorFlow+CNN+协同过滤算法的智能电影推荐系统——深度学习算法应用(含微信小程序、ipynb工程源码)+MovieLens数据集(四)

基于TensorFlow+CNN+协同过滤算法的智能电影推荐系统——深度学习算法应用(含微信小程序、ipynb工程源码)+MovieLens数据集(五)

基于TensorFlow+CNN+协同过滤算法的智能电影推荐系统——深度学习算法应用(含微信小程序、ipynb工程源码)+MovieLens数据集(七)

工程源代码下载

详见本人博客资源下载页


其它资料下载

如果大家想继续了解人工智能相关学习路线和知识体系,欢迎大家翻阅我的另外一篇博客《重磅 | 完备的人工智能AI 学习——基础知识学习路线,所有资料免关注免套路直接网盘下载》
这篇博客参考了Github知名开源平台,AI技术平台以及相关领域专家:Datawhale,ApacheCN,AI有道和黄海广博士等约有近100G相关资料,希望能帮助到所有小伙伴们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/138574.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电容笔有必要买最好的吗?开学好用iPad手写笔推荐

在iPad平板的热卖下&#xff0c;一些学生开始从传统的纸和笔的教学模式转向无纸化教学。因此&#xff0c;原来的Apple Pencil也成了热门话题&#xff0c;不少人都对这款售价近千元的电容笔产生了浓厚的兴趣。我认为对于职业画师来说&#xff0c;这一点非常重要&#xff0c;因为…

开源项目-SeaTunnel-UI数据集成系统

哈喽,大家好,今天给大家带来一个开源项目-SeaTunnel-UI数据集成系统 系统主要有任务配置,任务实例,数据源,虚拟表,用户管理等功能 登录 数据源 mysql数据源配置参数说明 kafka参数配置 mysqlcdc配置参数说明 虚拟表

区块链交易平台开发流程

随着区块链技术的日益发展&#xff0c;越来越多的金融机构和创业公司开始探索开发区块链交易平台的潜力。以下是一篇关于区块链交易平台开发流程的指南。 一、理解区块链技术 在开发区块链交易平台之前&#xff0c;必须深入理解区块链技术的内在机制和原理。区块链是一…

Linux Kernel 之四 移植过程详解、STM32F769I-EVAL 开发板适配

在之前的博文 Linux Kernel 之一 完整嵌入式 Linux 环境、构建工具、编译工具链、CPU 体系架构 中说了要一步步搭建整个嵌入式 Linux 运行环境&#xff0c;今天主要学习一下将 Linux 内核适配 STM32F769I-EVAL 开发板。 源码 文中涉及的源代码均放到了我个人的 Github 上&…

SmartNews 基于 Flink 的 Iceberg 实时数据湖实践

摘要&#xff1a;本文整理自 SmartNews 数据平台架构师 Apache Iceberg Contributor 戢清雨&#xff0c;在 Flink Forward Asia 2022 实时湖仓专场的分享。本篇内容主要分为五个部分&#xff1a; SmartNews 数据湖介绍基于 Icebergv1 格式的数据湖实践基于 Flink 实时更新的数据…

C | atexit函数

C | atexit函数 文章目录 C | atexit函数atexit区别进程终止的方式Reference 欢迎关注公众号“三戒纪元” atexit main函数是整个程序的入口&#xff0c;但是其实可以在内核中可以使用链接器来设置程序的开始地方。 当内核使用⼀个exec函数执行C程序时&#xff0c;在调⽤main…

BI系统上的报表怎么导出来?附方法步骤

在BI系统上做好的数据可视化分析报表&#xff0c;怎么导出来给别人看&#xff1f;方法有二&#xff0c;分别是1使用报表分享功能&#xff0c;2使用报表导出功能。下面就以奥威BI系统为例&#xff0c;简明扼要地介绍这两个功能。 1、报表分享功能 作用&#xff1a; 让其他同事…

Android查看公钥与MD5

参考&#xff1a;填写App特征信息_备案-阿里云帮助中心 安卓应用获取App特征信息指导 包名、公钥和签名MD5获取方式有多种&#xff0c;本文以使用JadxGUI工具获取为例。 下载JadxGUI工具&#xff1a;GitHub - skylot/jadx: Dex to Java decompiler下载安装完成后&#xff0c;使…

【C++】String类基本接口介绍及模拟实现(多看英文文档)

string目录 如果你很赶时间&#xff0c;那么就直接看我本标题下的内容即可&#xff01;&#xff01; 一、STL简介 1.1什么是STL 1.2STL版本 1.3STL六大组件 1.4STL重要性 1.5如何学习STL 二、什么是string&#xff1f;&#xff1f;&#xff08;本质上是一个类&#xff0…

模式分类与“组件协作模式”

1. GOF-23 模式分类 从目的来看&#xff1a; 创建型&#xff08;Creational&#xff09;模式&#xff1a;将对象的部分创建工作延迟到子类或者其他对象&#xff0c;从而应对需求变化为对象创建时具体类型实现引来的冲击。结构型&#xff08;Structural&#xff09;模式&#…

爱分析《商业智能最佳实践案例》

近日&#xff0c;国内知名数字化市场研究咨询机构爱分析发布《2023爱分析商业智能最佳实践案例》&#xff0c;此评选活动面向落地商业智能的各行企业和商业智能厂商&#xff0c;以第三方专业视角深入调研&#xff0c;评选出具有参考价值的创新案例。永达汽车集团与数聚股份合作…

计算机竞赛 深度学习LSTM新冠数据预测

文章目录 0 前言1 课题简介2 预测算法2.1 Logistic回归模型2.2 基于动力学SEIR模型改进的SEITR模型2.3 LSTM神经网络模型 3 预测效果3.1 Logistic回归模型3.2 SEITR模型3.3 LSTM神经网络模型 4 结论5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 …

nginx反向代理

nginx反向代理8.反向代理8.1 实现http反向代理8.1.1 反向代理配置参数8.1.2 反向代理单台web服务器8.1.2.1 端口号后加"/"8.1.2.2 端口号后不加"/" 8.1.3指定location 实现反向代理,动静分离8.1.4 反向代理实例&#xff1a;缓存功能8.1.4.1 举例 8.1.5 实现…

Python:Tornado框架之获取get和post的传参

一、获取get方式传参 import tornado.ioloop #导入tornado包 import tornado.web class MainHandle(tornado.web.RequestHandler):def get(self,id): #定义请求函数self.write("Hello %s!" %id)apptornado.web.Application([ #定义应用配置函数(r"/…

HCL Domino LEAP与新的软件下载门户站点

大家好&#xff0c;才是真的好。 还记得Domino Volt吗&#xff1f;是的&#xff0c;我前面花了不少时间来讲基于Domino平台上的低代码开发工具Volt&#xff0c;不下十篇&#xff0c;我记得最后一篇是《Domino Volt 1.0.5中的可视化流程设计器》。结果就在去年11月&#xff0c;…

Android存储权限完美适配(Android11及以上适配)

一、Bug简述 一个很普通的需求&#xff0c;需要下载图片到本地&#xff0c;我的三个测试机&#xff08;荣耀Android10&#xff0c;红米 11 和小米Android 13都没有问题&#xff09;。 然后&#xff0c;主角登场了&#xff0c;测试的三星Android 13 死活拉不起存储权限弹窗。 …

A股风格因子看板 (2023.09 第07期)

该因子看板跟踪A股风格因子&#xff0c;该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子&#xff0c;用以分析市场风格切换、组合风格景露等。 今日为该因子跟踪第7期&#xff0c;指数组合数据截止日2023-08-31&#xff0c;要点如下 近1年A股风格因子收益走…

springboot集成mybatis-plus

一、在spring boot中配置mybatis-plus 1、创建一个spring boot项目&#xff0c;注意勾选mysql 2、在pom.xml文件中添加mybatis-plus的依赖包 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0&qu…

Linux C 网络基础

为什么需要网络通信&#xff1f; 进程间通信解决的是本机内通信 网络通信解决的是任意不同机器的通信 实现网络通信需要哪些支持 1.通信设备&#xff1a;网卡&#xff08;PC机自带&#xff09;&#xff1b; 路由器和交换机&#xff1b; 光纤…

MySQL的sql_mode合理设置

MySQL的sql_mode合理设置 1、sql_mode设置介绍说明 sql_mode是个很容易被忽视的变量&#xff0c;默认值是空值&#xff0c;在这种设置下是可以允许一些非法操作的&#xff0c;比如允许一些非法数据的插入。在生产环境必须将这个值设置为严格模式&#xff0c;所以开发、测试环…