赞
踩
大家好,我是南木元元,热衷分享有趣实用的文章。如今协同过滤等传统推荐算法被广泛用于推荐,但也存在冷启动、矩阵稀疏等问题,本文来分享一下用深度学习的方式来实现电影推荐,主要算法基于tensorflow和卷积神级网络,web端采用python的django框架来进行开发。
话不多说,先来看完成的效果。
输出1:推荐出与该电影相似的电影。
输出2:推荐看过该电影的人还喜欢看的电影。
输出:推荐出前5部他可能会喜欢的电影。
选择一部电影后,调用上述算法,从而为用户推荐的电影。
本项目使用的是文本卷积神经网络,并使用MovieLens数据集进行训练,网络模型如下:
经过训练后的loss:
网络模型的代码主要参考了这篇文章。
本项目主要是用python的django框架进行开发的,以下是django的一些主要代码:
def login(request): if request.method == 'GET': return render(request, 'login.html') else: #用户POST提交的数据 u = request.POST.get('user') p = request.POST.get('pwd') #把账号密码写死了 # if u == 'cxx' and p == '123': # #登录成功 # return redirect('/mess/') #从数据库中判断账号密码是否正确 if u and p: c = User.objects.filter(username=u,password=p).count() if c >= 1: #获取当前登录的用户id cur_id = User.objects.get(username=u, password=p).id return redirect('/mess/?user_id='+str(cur_id)) else: return render(request, 'login.html', {'msg': '账号密码错误'}) else: #登录失败 return render(request, 'login.html', {'msg': '请输入正确的账号密码'})
def like(request): user_id = request.GET.get('user_id') #获取当前用户 my_user = models.User.objects.get(id=user_id) global global_model model = global_model print('-------正在推荐--------', user_id) list_like_movies_names, list_like_movies_ids = model.recommend_your_movie(int(user_id)) print('你喜欢的电影:', list_like_movies_names) print('你喜欢的电影id:', list_like_movies_ids) # 你喜欢的电影 list_dict_like = [] for i in list_like_movies_names[:6]: list_dict_like.append(utils.movie_dic(i)) for i in range(len(list_dict_like)): # list_dict_like[i]['movie_id'] = list_like_movies_ids[i] list_dict_like[i]['movie_id'] = int(list_like_movies_ids[i]) #把字典中的id转int类型,便于前端if判断 print('相似电影列表:', list_dict_like) context = {} context['list_dict_like'] = list_dict_like context['my_user'] = my_user #返回当前用户,在前端页面显示当前登陆的用户名 return render(request, 'like.html', context)
def index(request): #获取电影id movie_id = request.GET.get('movie_id') global global_model model = global_model print('-------正在推荐--------', movie_id) #choice_movie_name 选择的电影名称 #list_same_movies_names 相似的电影名称 #list_pepole_like_movies_names 喜欢这个电影的人还喜欢的电影名称 #list_same_movies_ids 相似的电影id #list_pepole_like_movies_ids 喜欢这个电影的人还喜欢的电影id #和recommend_by_movie方法的返回值一一对应 choice_movie_name, list_same_movies_names, list_pepole_like_movies_names, list_same_movies_ids, list_pepole_like_movies_ids = model.recommend_by_movie( int(movie_id)) print('选择电影:', choice_movie_name) print('相似的电影:', list_same_movies_names) print('喜欢这个电影的人还喜欢:', list_pepole_like_movies_names) print('相似的电影id:', list_same_movies_ids) print('喜欢这个电影的人还喜欢id:', list_pepole_like_movies_ids) #选择的电影 list_dict_choice = [] for i in choice_movie_name: list_dict_choice.append(utils.movie_dic(i)) list_dict_choice[0]['movie_id'] = movie_id print('选择电影列表:', list_dict_choice) # 相似的电影 list_dict_same = [] # for i in list_same_movies_names[:3]: #最多显示3部电影 for i in list_same_movies_names: list_dict_same.append(utils.movie_dic(i)) for i in range(len(list_dict_same)): # list_dict_same[i]['movie_id'] = list_same_movies_ids[i] list_dict_same[i]['movie_id'] = int(list_same_movies_ids[i]) #把字典中的id转int类型,便于前端if判断 print('相似电影列表:', list_dict_same) # 看过的用户还喜欢的电影 list_dict_otherlike = [] for i in list_pepole_like_movies_names: list_dict_otherlike.append(utils.movie_dic(i)) for i in range(len(list_dict_otherlike)): # list_dict_otherlike[i]['movie_id'] = list_pepole_like_movies_ids[i] list_dict_otherlike[i]['movie_id'] = int(list_pepole_like_movies_ids[i]) #把字典中的id转int类型,便于前端if判断 print('喜欢这个电影的人还喜欢列表:', list_dict_otherlike) context = {} context['list_dict_choice'] = list_dict_choice context['list_dict_same'] = list_dict_same context['list_dict_otherlike'] = list_dict_otherlike return render(request, 'index.html', context)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。