目 录
摘 要 I
Abstract II
1绪论 1
1.1选题背景及意义 1
1.2国内外研究现状 2
1.3推荐算法研究 5
1.3.1协同过滤算法 5
1.3.2基于内容的推荐算法 5
1.3.4基于标签的推荐算法 6
1.4本文研究目标和研究内容 6
2相关技术介绍 7
2.1系统实现相关技术的研究 7
2.2 Python语言研究 9
2.3 Django框架研究 10
2.4 MySQL数据库研究 11
3系统分析 13
3.1需求分析 13
3.2可行性分析 13
3.2.1社会可行性分析 13
3.2.2 技术可行性分析 13
3.3用户功能需求 14
4系统设计 15
4.1系统总体架构 15
4.2电影爬虫的模型设计 16
4.3数据库介绍与设计 17
4.3.1实验数据集介绍 17
4.3.2数据库逻辑结构设计 19
4.4.3系统E-R图 20
4.4.4系统数据表设计 21
5系统实现 24
5.1数据集处理模块 24
5.2注册登录模块 24
5.3电影分类模块 25
5.4用户评分反馈模块 27
5.5用户评分记录模块 29
5.6推荐算法模块 31
5.7显示推荐模块 33
6系统测试 35
6.1测试方法 35
6.2系统功能测试 35
7总结与展望 36
7.1总结 36
7.2不足之处及未来展望 36
参考文献 38
致 谢 40
3系统分析
3.1需求分析
随着电影市场的迅速发展,每天都有大量电影上映。人们都希望可以高效的在海量电影库中找到自己可能会喜欢的电影.以节省寻找电影的时间。电影推荐系统能给用户带来便利.本文要实现的是一个面向用户的个性化电影推荐系统,根据 movielens数据集里面大量用户对电影的评分数据,通过计算用户相似性、电影相似性,实现为用户推荐符合其兴趣的电影。
本文实现的个性化电影推荐系统有以下几点基本需求:
(1)数据集:每个用户所评电影数量要多,尽量广泛涉及大量电影
(2)推荐算法:推荐效果要良好
(3)包括用户注册登录在内的整个 web系统
(4)系统要易于扩展和维护
现在中国大部分的家庭都喜欢在家里置办属于自己风格的家庭影院或者到电影院观看电影。但是,仍然有很多人喜欢在手机和电脑等设备看电影。因为移动设备比较方便,随时随地都可以享受到看电影的乐趣。所以,一个可以在移动设备或电脑观看电影的网站就非常重要了。电影网站为了提高劳动的效率、节约成本、提高服务质量,我就开发了此款网站。用以方便用户可以随时随地的在互联网上找到各种类型电影视频。通过这个网站,可以很快实现一些常用的服务,并保证无错、高效。比如,视频搜索,视频点播,以及视频下载等基本功能。让用户打开本网站就能立刻在线观看自己喜欢的视频,省掉安装家庭影院的一大笔资金,同时也避免了到电影院观看电影的麻烦步骤。
3.2可行性分析
3.2.1社会可行性分析
近年来,随着中国国民经济的不断发展,人民生活水平不断提高,人均可支配收入不断增加,人们的消费需求和消费也越来越多。据相关统计分析,在2014全国电影票房收入约100亿元,在2013,电影票房同比增长约44%,强劲增长的基础上,同比增长约60%。改革开放以来,全国城市票房已经增加了约10倍,平均涨幅超过35%。今年的房屋总量占比,国内电影票房达57亿元左右,占全年票房的55%左右。
3.2.2 技术可行性分析
1.细化网站目标。具体目标的技术可行性分析。电影信息摘要,了解网站建设的目标和具体要求,功能实现中的每一个具体的目标和功能的技术,同时也考虑到需要什么条件和多少人需要实现,并列出每个具体目标的内容,任务列表。
2.网站可用性分析。网站的设计要求使它易于使用,而不仅仅是一个简单的信息和安排数组。此要求与网站的布局和服务器的功能有关。
3、网站的互动分析。互动是现代网站发展的趋势,网站的互动性能可以提高网站的处理功能和存储容量的需求,内部结构设计可以相应调整。
4.网站的性能分析。网站的用户数量随着网站的性能和功能的不断变化,在保证网站性能的前提下,不断满足更多用户的需求,并不断地进行规划、设计和系统维护。站点的整体性能一般通过站点的响应时间和处理时间以及平均用户等待时间和系统输出来衡量。本文转载自http://www.biyezuopin.vip/onews.asp?id=11926因此,为了提高网站的性能,可以通过调查用户的数量和信息处理量来确定网站服务器的功能。
3.3用户功能需求
如图 3-1是系统中用户的用例图,有 5个用例,分别是注册、登录、注销、评分、查看推荐结果。

图3-1用户的用例图

from django.shortcuts import render, redirect,HttpResponseRedirect
from .forms import RegisterForm
from users.models import Resulttable,Insertposter
from django.db import modelsdef register(request):# 只有当请求为 POST 时,才表示用户提交了注册信息if request.method == 'POST':form = RegisterForm(request.POST)# 验证数据的合法性if form.is_valid():# 如果提交数据合法,调用表单的 save 方法将用户数据保存到数据库form.save()# 注册成功,跳转回首页return redirect('/')else:# 请求不是 POST,表明用户正在访问注册页面,展示一个空的注册表单给用户form = RegisterForm()# 渲染模板# 如果用户正在访问注册页面,则渲染的是一个空的注册表单# 如果用户通过表单提交注册信息,但是数据验证不合法,则渲染的是一个带有错误信息的表单return render(request, 'users/register.html', context={'form': form})def index(request):return render(request, 'users/..//index.html')
# 为啥?def check(request):return render((request, 'users/..//index.html'))
# def showregist(request):
#     passdef showmessage(request):usermovieid = []usermovietitle = []data=Resulttable.objects.filter(userId=1001)for row in data:usermovieid.append(row.imdbId)try:conn = get_conn()cur = conn.cursor()#Insertposter.objects.filter(userId=USERID).delete()for i in usermovieid:cur.execute('select * from moviegenre3 where imdbId = %s',i)rr = cur.fetchall()for imdbId,title,poster in rr:usermovietitle.append(title)print(title)# print(poster_result)finally:conn.close()return render(request, 'users/message.html', locals())# USERID = 1002
def recommend1(request):USERID = int(request.GET["userIdd"]) + 1000Insertposter.objects.filter(userId=USERID).delete()#selectMysql()read_mysql_to_csv('users/static/users_resulttable.csv',USERID)  #追加数据,提高速率ratingfile = os.path.join('users/static', 'users_resulttable.csv')usercf = UserBasedCF()#userid = '1001'userid = str(USERID)#得到了当前用户的idprint(userid)usercf.generate_dataset(ratingfile)usercf.calc_user_sim()usercf.recommend(userid)    #得到imdbId号#先删除所有数据try:conn = get_conn()cur = conn.cursor()#Insertposter.objects.filter(userId=USERID).delete()for i in matrix:cur.execute('select * from moviegenre3 where imdbId = %s',i)rr = cur.fetchall()for imdbId,title,poster in rr:#print(value)         #value才是真正的海报链接if(Insertposter.objects.filter(title=title)):continueelse:Insertposter.objects.create(userId=USERID, title=title, poster=poster)# print(poster_result)finally:conn.close()#results = Insertposter.objects.all()       #从这里传递给html= Insertposter.objects.all()  # 从这里传递给htmlresults = Insertposter.objects.filter(userId=USERID)return render(request,'users/movieRecommend.html', locals())# return render(request, 'users/..//index.html', locals())def recommend2(request):# USERID = int(request.GET["userIddd"]) + 1000USERID = 1001Insertposter.objects.filter(userId=USERID).delete()#selectMysql()read_mysql_to_csv2('users/static/users_resulttable2.csv',USERID)  #追加数据,提高速率ratingfile2 = os.path.join('users/static', 'users_resulttable2.csv')itemcf = ItemBasedCF()#userid = '1001'userid = str(USERID)#得到了当前用户的idprint(userid)itemcf.generate_dataset(ratingfile2)itemcf.calc_movie_sim()itemcf.recommend(userid)    #得到imdbId号#先删除所有数据try:conn = get_conn()cur = conn.cursor()#Insertposter.objects.filter(userId=USERID).delete()for i in matrix2:cur.execute('select * from moviegenre3 where imdbId = %s',i)rr = cur.fetchall()for imdbId,title,poster in rr:#print(value)         #value才是真正的海报链接if(Insertposter.objects.filter(title=title)):continueelse:Insertposter.objects.create(userId=USERID, title=title, poster=poster)# print(poster_result)finally:conn.close()results = Insertposter.objects.filter(userId=USERID)       #从这里传递给html= Insertposter.objects.all()  # 从这里传递给htmlreturn render(request, 'users/movieRecommend2.html',locals())# return HttpResponseRedirect('movieRecommend.html', locals())def insert(request):# MOVIEID = int(request.GET["movieId"])global USERIDUSERID = int(request.GET["userId"])+1000# USERID = {{}}RATING = float(request.GET["rating"])IMDBID = int(request.GET["imdbId"])Resulttable.objects.create(userId=USERID, rating=RATING,imdbId=IMDBID)#print(USERID)# return HttpResponseRedirect('/')return render(request, 'index.html',{'userId':USERID,'rating':RATING,'imdbId':IMDBID})import sys
import random
import os,math
from operator import itemgetter
import pymysql
import csv
from django.http import HttpResponse
import codecsdef get_conn():conn = pymysql.connect(host='127.0.0.1', port=3307, user='root', passwd='aptx4869.', db='haha', charset='utf8')return conndef query_all(cur, sql, args):cur.execute(sql, args)return cur.fetchall()def read_mysql_to_csv(filename,user):with codecs.open(filename=filename, mode='w', encoding='utf-8') as f:write = csv.writer(f, dialect='excel')conn = get_conn()cur = conn.cursor()cur.execute('select * from users_resulttable')#sql = ('select * from users_resulttable WHERE userId = 1001')rr = cur.fetchall()#results = query_all(cur=cur, sql=sql, args=None)for result in rr:#print(result)write.writerow(result[:-1])def read_mysql_to_csv2(filename,user):with codecs.open(filename=filename, mode='a', encoding='utf-8') as f:write = csv.writer(f, dialect='excel')conn = get_conn()cur = conn.cursor()cur.execute('select * from users_resulttable')sql = ('select * from users_resulttable WHERE userId = 1001')rr = cur.fetchall()results = query_all(cur=cur, sql=sql, args=None)for result in results:#print(result)write.writerow(result[:-1])# if __name__ == '__main__':
#     # main()
#     read_mysql_to_csv('../users/static/users_resulttable.csv')
#import sys
import random
import math
import os
from operator import itemgetterrandom.seed(0)
user_sim_mat = {}
matrix = []  #全局变量
matrix2 = []class UserBasedCF(object):''' TopN recommendation - User Based Collaborative Filtering '''def __init__(self):self.trainset = {}  # 训练集self.testset = {}  # 测试集self.initialset = {}  # 存储要推荐的用户的信息self.n_sim_user = 30self.n_rec_movie = 10self.movie_popular = {}self.movie_count = 0  # 总电影数量print('Similar user number = %d' % self.n_sim_user, file=sys.stderr)print('recommended movie number = %d' %self.n_rec_movie, file=sys.stderr)@staticmethoddef loadfile(filename):''' load a file, return a generator. '''fp = open(filename, 'r', encoding='UTF-8')for i, line in enumerate(fp):yield line.strip('\r\n')# if i % 100000 == 0:#     print ('loading %s(%s)' % (filename, i), file=sys.stderr)fp.close()print('load %s success' % filename, file=sys.stderr)def initial_dataset(self, filename1):initialset_len = 0for lines in self.loadfile(filename1):users, movies, ratings = lines.split(',')self.initialset.setdefault(users, {})self.initialset[users][movies] = (ratings)initialset_len += 1def generate_dataset(self, filename2, pivot=1.0):''' load rating data and split it to training set and test set '''trainset_len = 0testset_len = 0for line in self.loadfile(filename2):# user, movie, rating, _ = line.split('::')user, movie, rating = line.split(',')# split the data by pivotif random.random() < pivot:  # pivot=0.7应该表示训练集:测试集=7:3self.trainset.setdefault(user, {})self.trainset[user][movie] = (rating)  # trainset[user][movie]可以获取用户对电影的评分  都是整数trainset_len += 1else:self.testset.setdefault(user, {})self.testset[user][movie] = (rating)testset_len += 1print('split training set and test set succ', file=sys.stderr)print('train set = %s' % trainset_len, file=sys.stderr)print('test set = %s' % testset_len, file=sys.stderr)def calc_user_sim(self):movie2users = dict()for user, movies in self.trainset.items():for movie in movies:# inverse table for item-usersif movie not in movie2users:movie2users[movie] = set()movie2users[movie].add(user)  # 看这个电影的用户id# print(movie)   #输出的是movieId# print(movie2users[movie])   #输出的是{'userId'...}# print(movie2users)    #movieId:{'userId','userId'...}# count item popularity at the same timeif movie not in self.movie_popular:self.movie_popular[movie] = 0self.movie_popular[movie] += 1# print ('build movie-users inverse table succ', file=sys.stderr)# save the total movie number, which will be used in evaluationself.movie_count = len(movie2users)print('total movie number = %d' % self.movie_count, file=sys.stderr)# count co-rated items between users  计算用户之间共同评分的物品usersim_mat = user_sim_mat# print ('building user co-rated movies matrix...', file=sys.stderr)for movie, users in movie2users.items():  # 通过.items()遍历movie2users这个字典里的所有键、值for u in users:for v in users:if u == v:continueusersim_mat.setdefault(u, {})usersim_mat[u].setdefault(v, 0)usersim_mat[u][v] += 1 / math.log(1 + len(users))  # usersim_mat二维矩阵应该存的是用户u和用户v之间共同评分的电影数目# print ('build user co-rated movies matrix succ', file=sys.stderr)# calculate similarity matrix# print ('calculating user similarity matrix...', file=sys.stderr)simfactor_count = 0PRINT_STEP = 20000for u, related_users in usersim_mat.items():for v, count in related_users.items():usersim_mat[u][v] = count / math.sqrt(len(self.trainset[u]) * len(self.trainset[v]))simfactor_count += 1def recommend(self, user):''' Find K similar users and recommend N movies. '''matrix.clear()   #每次都要清空K = self.n_sim_user  # 这里等于20N = self.n_rec_movie  # 这里等于10rank = dict()  # 用户对电影的兴趣度# print(self.initialset[user])watched_movies = self.trainset[user]  # user用户已经看过的电影  只包括训练集里的# 这里之后不能是训练集# watched_movies = self.initialset[user]for similar_user, similarity_factor in sorted(user_sim_mat[user].items(),key=itemgetter(1), reverse=True)[0:K]:  # itemgetter(1)表示对第2个域(相似度)排序   reverse=TRUE表示降序for imdbid in self.trainset[similar_user]:  # similar_user是items里面的键,就是所有用户   similarity_factor是值,就是对应的相似度if imdbid in watched_movies:continue  # 如果该电影用户已经看过,则跳过# predict the user's "interest" for each movierank.setdefault(imdbid, 0)  # 没有值就为0rank[imdbid] += similarity_factor   #rank[movie]就是各个电影的相似度# 这里是把和各个用户的相似度加起来,而各个用户的相似度只是基于看过的公共电影数目除以这两个用户看过的电影数量积#print(rank[movie])# return the N best movies# rank_ = dict()rank_ = sorted(rank.items(), key=itemgetter(1), reverse=True)[0:N]  #类型是list不是字典了for key,value in rank_:matrix.append(key)    #matrix为存储推荐的imdbId号的数组#print(key)     #得到了推荐的电影的imdbid号print(matrix)#return sorted(rank.items(), key=itemgetter(1), reverse=True)[0:N]return matrix# class UserBasedCF(object):
#     ''' TopN recommendation - User Based Collaborative Filtering '''
#
#     def __init__(self):
#         self.trainset = {}  # 训练集
#         self.testset = {}  # 测试集
#         self.initialset = {}  # 存储要推荐的用户的信息
#         self.n_sim_user = 50
#         self.n_rec_movie = 10
#
#         self.movie_popular = {}
#         self.movie_count = 0  # 总电影数量
#
#         print('Similar user number = %d' % self.n_sim_user, file=sys.stderr)
#         print('recommended movie number = %d' %
#               self.n_rec_movie, file=sys.stderr)
#
#     @staticmethod
#     def loadfile(filename):
#         ''' load a file, return a generator. '''
#         fp = open(filename, 'r', encoding='UTF-8')
#         for i, line in enumerate(fp):
#             yield line.strip('\r\n')
#             # if i % 100000 == 0:
#             #     print ('loading %s(%s)' % (filename, i), file=sys.stderr)
#         fp.close()
#         print('load %s success' % filename, file=sys.stderr)
#
#     def initial_dataset(self, filename1):
#         initialset_len = 0
#         for lines in self.loadfile(filename1):
#             users, movies, ratings = lines.split(',')
#             self.initialset.setdefault(users, {})
#             self.initialset[users][movies] = (ratings)
#             initialset_len += 1
#
#     def generate_dataset(self, filename2, pivot=0.7):
#         ''' load rating data and split it to training set and test set '''
#         trainset_len = 0
#         testset_len = 0
#
#         for line in self.loadfile(filename2):
#             # user, movie, rating, _ = line.split('::')
#             user, movie, rating = line.split(',')
#             # split the data by pivot
#             if random.random() < pivot:  # pivot=0.7应该表示训练集:测试集=7:3
#                 self.trainset.setdefault(user, {})
#                 self.trainset[user][movie] = (rating)  # trainset[user][movie]可以获取用户对电影的评分  都是整数
#                 trainset_len += 1
#             else:
#                 self.testset.setdefault(user, {})
#                 self.testset[user][movie] = (rating)
#                 testset_len += 1
#
#         print('split training set and test set succ', file=sys.stderr)
#         print('train set = %s' % trainset_len, file=sys.stderr)
#         print('test set = %s' % testset_len, file=sys.stderr)
#
#     def calc_user_sim(self):
#         ''' calculate user similarity matrix '''
#         # build inverse table for item-users
#         # key=movieID, value=list of userIDs who have seen this movie
#         # print ('building movie-users inverse table...', file=sys.stderr)
#         movie2users = dict()
#
#         for user, movies in self.trainset.items():
#             for movie in movies:
#                 # inverse table for item-users
#                 if movie not in movie2users:
#                     movie2users[movie] = set()
#                 movie2users[movie].add(user)  # 看这个电影的用户id
#                 # print(movie)   #输出的是movieId
#                 # print(movie2users[movie])   #输出的是{'userId'...}
#                 # print(movie2users)    #movieId:{'userId','userId'...}
#
#                 # count item popularity at the same time
#                 if movie not in self.movie_popular:
#                     self.movie_popular[movie] = 0
#                 self.movie_popular[movie] += 1
#         # print ('build movie-users inverse table succ', file=sys.stderr)
#
#         # save the total movie number, which will be used in evaluation
#         self.movie_count = len(movie2users)
#         print('total movie number = %d' % self.movie_count, file=sys.stderr)
#
#         # count co-rated items between users  计算用户之间共同评分的物品
#         usersim_mat = user_sim_mat
#         # print ('building user co-rated movies matrix...', file=sys.stderr)
#
#         for movie, users in movie2users.items():  # 通过.items()遍历movie2users这个字典里的所有键、值
#             for u in users:
#                 for v in users:
#                     if u == v:
#                         continue
#                     usersim_mat.setdefault(u, {})
#                     usersim_mat[u].setdefault(v, 0)
#                     usersim_mat[u][v] += 1 / math.log(1 + len(users))  # usersim_mat二维矩阵应该存的是用户u和用户v之间共同评分的电影数目
#         # print ('build user co-rated movies matrix succ', file=sys.stderr)
#
#         # calculate similarity matrix
#         # print ('calculating user similarity matrix...', file=sys.stderr)
#         simfactor_count = 0
#         PRINT_STEP = 20000
#
#         for u, related_users in usersim_mat.items():
#             for v, count in related_users.items():
#                 usersim_mat[u][v] = count / math.sqrt(
#                     len(self.trainset[u]) * len(self.trainset[v]))
#                 simfactor_count += 1
#         #         if simfactor_count % PRINT_STEP == 0:
#         #             print ('calculating user similarity factor(%d)' %
#         #                    simfactor_count, file=sys.stderr)
#
#         # print ('calculate user similarity matrix(similarity factor) succ',
#         #        file=sys.stderr)
#         # print ('Total similarity factor number = %d' %
#         #        simfactor_count, file=sys.stderr)
#
#
#     def recommend(self, user):
#         ''' Find K similar users and recommend N movies. '''
#         matrix.clear()   #每次都要清空
#         K = self.n_sim_user  # 这里等于20
#         N = self.n_rec_movie  # 这里等于10
#         rank = dict()  # 用户对电影的兴趣度
#         # print(self.initialset[user])
#         # print(self.trainset[user])
#         watched_movies = self.trainset[user]  # user用户已经看过的电影  只包括训练集里的
#         # 这里之后不能是训练集
#         # watched_movies = self.initialset[user]
#         for similar_user, similarity_factor in sorted(user_sim_mat[user].items(),
#                                                       key=itemgetter(1), reverse=True)[
#                                                0:K]:  # itemgetter(1)表示对第2个域(相似度)排序   reverse=TRUE表示降序
#             for imdbid in self.trainset[similar_user]:  # similar_user是items里面的键,就是所有用户   similarity_factor是值,就是对应的相似度
#                 if imdbid in watched_movies:
#                     continue  # 如果该电影用户已经看过,则跳过
#                 # predict the user's "interest" for each movie
#                 rank.setdefault(imdbid, 0)  # 没有值就为0
#                 rank[imdbid] += similarity_factor   #rank[movie]就是各个电影的相似度
#                 # 这里是把和各个用户的相似度加起来,而各个用户的相似度只是基于看过的公共电影数目除以这两个用户看过的电影数量积
#                 #print(rank[movie])
#         # return the N best movies
#        # rank_ = dict()
#         rank_ = sorted(rank.items(), key=itemgetter(1), reverse=True)[0:N]  #类型是list不是字典了
#         for key,value in rank_:
#             matrix.append(key)    #matrix为存储推荐的imdbId号的数组
#             #print(key)     #得到了推荐的电影的imdbid号
#         print(matrix)
#         #return sorted(rank.items(), key=itemgetter(1), reverse=True)[0:N]
#         return matrixclass ItemBasedCF(object):''' TopN recommendation - Item Based Collaborative Filtering '''def __init__(self):self.trainset = {}self.testset = {}self.n_sim_movie = 20self.n_rec_movie = 10self.movie_sim_mat = {}self.movie_popular = {}self.movie_count = 0# print('Similar movie number = %d' % self.n_sim_movie, file=sys.stderr)# print('Recommended movie number = %d' %#       self.n_rec_movie, file=sys.stderr)@staticmethoddef loadfile(filename):''' load a file, return a generator. '''# data1=np.loadtxt(filename,delimiter=',',dtype=float)fp = open(filename, 'r', encoding='UTF-8')for i, line in enumerate(fp):yield line.strip('\r\n')# if i % 100000 == 0:#     print ('loading %s(%s)' % (filename, i), file=sys.stderr)fp.close()print('load %s succ' % filename, file=sys.stderr)def generate_dataset(self, filename, pivot=1.0):''' load rating data and split it to training set and test set '''trainset_len = 0testset_len = 0for line in self.loadfile(filename):user, movie, rating = line.split(',')# user, movie, rating = np.loadtxt(filename,delimiter=',')rating = float(rating)# print(type(rating))# split the data by pivotif random.random() < pivot:self.trainset.setdefault(user, {})self.trainset[user][movie] = float(rating)trainset_len += 1else:self.testset.setdefault(user, {})self.testset[user][movie] = float(rating)testset_len += 1# print('split training set and test set succ', file=sys.stderr)print('train set = %s' % trainset_len, file=sys.stderr)# print('test set = %s' % testset_len, file=sys.stderr)def calc_movie_sim(self):''' calculate movie similarity matrix '''print('counting movies number and popularity...', file=sys.stderr)for user, movies in self.trainset.items():for movie in movies:# count item popularityif movie not in self.movie_popular:self.movie_popular[movie] = 0self.movie_popular[movie] += 1# print('count movies number and popularity succ', file=sys.stderr)# save the total number of moviesself.movie_count = len(self.movie_popular)print('total movie number = %d' % self.movie_count, file=sys.stderr)# count co-rated users between itemsitemsim_mat = self.movie_sim_mat# print('building co-rated users matrix...', file=sys.stderr)for user, movies in self.trainset.items():for m1 in movies:for m2 in movies:if m1 == m2:continueitemsim_mat.setdefault(m1, {})itemsim_mat[m1].setdefault(m2, 0)itemsim_mat[m1][m2] += 1 / math.log(1 + len(movies) * 1.0)#print('build co-rated users matrix succ', file=sys.stderr)# calculate similarity matrix#print('calculating movie similarity matrix...', file=sys.stderr)simfactor_count = 0PRINT_STEP = 2000000for m1, related_movies in itemsim_mat.items():for m2, count in related_movies.items():itemsim_mat[m1][m2] = count / math.sqrt(self.movie_popular[m1] * self.movie_popular[m2])simfactor_count += 1if simfactor_count % PRINT_STEP == 0:print('calculating movie similarity factor(%d)' %simfactor_count, file=sys.stderr)#print('calculate movie similarity matrix(similarity factor) succ',# file=sys.stderr)#print('Total similarity factor number = %d' %#simfactor_count, file=sys.stderr)def recommend(self, user):''' Find K similar movies and recommend N movies. '''K = self.n_sim_movieN = self.n_rec_moviematrix2.clear()rank = {}watched_movies = self.trainset[user]for movie, rating in watched_movies.items():for related_movie, similarity_factor in sorted(self.movie_sim_mat[movie].items(),key=itemgetter(1), reverse=True)[:K]:if related_movie in watched_movies:continuerank.setdefault(related_movie, 0)rank[related_movie] += similarity_factor * rating# return the N best movies#print(sorted(rank.items(), key=itemgetter(1), reverse=True)[:N])rank_ = sorted(rank.items(), key=itemgetter(1), reverse=True)[:N]for key,value in rank_:matrix2.append(key)    #matrix为存储推荐的imdbId号的数组#print(key)     #得到了推荐的电影的imdbid号print(matrix2)#return sorted(rank.items(), key=itemgetter(1), reverse=True)[:N]return matrix2#
if __name__ == '__main__':# ratingfile = os.path.join('ml-1m', 'ratings.dat')# ratingfile1 = os.path.join('ml-100k', 'insertusers.csv')ratingfile2 = os.path.join('static', 'users_resulttable.csv')  # 一共671个用户#ratingfile2 = os.path.join('static', 'rrtotaltable.csv')usercf = UserBasedCF()userId = '1'# usercf.initial_dataset(ratingfile1)usercf.generate_dataset(ratingfile2)usercf.calc_user_sim()# usercf.evaluate()usercf.recommend(userId)  # 给用户5推荐了10部电影  输出的是‘movieId’,兴趣度   109444、110148都是用户2已经看过并且评分为4的电影。
# print(sorted(user_sim_mat['2'].items(),key=itemgetter(1), reverse=True)[0:20])    #输出的是{'useId':{'另一个userId':相似度,'其他userId':'相似度...'}}...
#这里输的userId,是要从另一张储存登录用户的userid# 这里输的userId,是要从另一张储存登录用户的userid




















基于python爬虫的电影推荐网站的设计与实现相关推荐

  1. python爬虫项目毕业设计_基于python爬虫的电影推荐网站的设计与实现毕业论文+初稿+项目源码+安装说明+使用说明...

    摘 要 现在电影资源是网络资源的重要组成部分,随着网络上电影资源的数量越来越庞大,设计电影个性化推荐系统迫在眉睫.所以本文旨在为每一个用户推荐与其兴趣爱好契合度较高的电影. 本系统包含电影前端展示界面 ...

  2. 【大数据分析专业毕设之基于python爬虫的电影票房大数据预测分析+大屏可视化分析

    [大数据分析专业毕设之基于python爬虫的电影票房大数据预测分析+大屏可视化分析-哔哩哔哩https://b23.tv/saIKtBH flask web框架,数据使用requests模块爬取数据, ...

  3. python爬虫项目-33个Python爬虫项目实战(推荐)

    今天为大家整理了32个Python爬虫项目. 整理的原因是,爬虫入门简单快速,也非常适合新入门的小伙伴培养信心.所有链接指向GitHub,祝大家玩的愉快~O(∩_∩)O WechatSogou [1] ...

  4. python爬虫知网实例-33个Python爬虫项目实战(推荐)

    今天为大家整理了32个Python爬虫项目. 整理的原因是,爬虫入门简单快速,也非常适合新入门的小伙伴培养信心.所有链接指向GitHub,祝大家玩的愉快~O(∩_∩)O WechatSogou [1] ...

  5. 基于python爬虫————静态页面和动态页面爬取

    基于python爬虫----静态页面和动态页面爬取 文章目录 基于python爬虫----静态页面和动态页面爬取 1. 爬虫的原理 2. 用正则表达式匹配获取数据 3. 页面源码解析 4. 通过req ...

  6. python毕业设计开题报告-基于python爬虫的影评情感分析研究开题报告

    论文(设计)题目 基于python爬虫的影评情感分析研究开题报告 选题的背景.意义及研究现状: 研究现状: 文本情感分析又称倾向性分析.情感挖掘,主观分析或评论挖掘,是对带有情感色彩的评论文本内容进行 ...

  7. 基于python爬虫技术的应用_基于Python爬虫技术的应用

    办公自动化杂志 一.引言 本文主要是对 Python 爬虫技术进行阐述,基于 python 的爬虫与其他语言相比的有很多优势.通过爬去某个网站的所有新闻这个案例,来进一步阐释 Python 爬虫技术的 ...

  8. 计算机毕业设计JAVA电影推荐网站mybatis+源码+调试部署+系统+数据库+lw

    计算机毕业设计JAVA电影推荐网站mybatis+源码+调试部署+系统+数据库+lw 计算机毕业设计JAVA电影推荐网站mybatis+源码+调试部署+系统+数据库+lw 本源码技术栈: 项目架构:B ...

  9. java毕业设计电影推荐网站mybatis+源码+调试部署+系统+数据库+lw

    java毕业设计电影推荐网站mybatis+源码+调试部署+系统+数据库+lw java毕业设计电影推荐网站mybatis+源码+调试部署+系统+数据库+lw 本源码技术栈: 项目架构:B/S架构 开 ...

最新文章

  1. 30个Python常用极简代码,拿走就用
  2. HM16.0之帧间预测——xCheckRDCostInter()函数
  3. spring异常Unsatisfied dependency expressed through constructor parameter 0
  4. python 画log曲线
  5. itchat群机器人的自动画实现
  6. 菜鸟学ASP.NET MVC4入门笔记
  7. mysql集群软件有哪些_浅谈数据库集群软件优缺点有哪些
  8. java文件下载的utils_Java文件操作Utils
  9. 钉钉作弊,被判5年!
  10. p2p 源码 linux,我们打算开发一个WiFi功能的P2P文件共享系统在Linux平台…
  11. 复选框的遍历和选中设置
  12. 关于线程插入函数如何用的问题
  13. 三国将星录java阵容_三国将星录,通关攻略
  14. 部分UCI数据集分享
  15. 更新macOS Monterey后遇到的各种Bug及解决方法
  16. 分享PHP多功能在线工具箱网站源码,安装教程详解
  17. 斐讯k2怎么设置虚拟服务器,设置斐讯K2路由器上网连接教程 | 192路由网
  18. PDA应用软件开发特点
  19. 课程学习与自步学习Curriculum learning and self-paced learning:极简入门
  20. PHP微信公众平台开发高级篇--微信JS-SDK

热门文章

  1. 硬件(R820T+RTL2832)+RTL1090+adsbscope接收ADS-B信号
  2. 可编程控制器对环境的要求
  3. 计算机组成原理自考pdf,2018年自考《计算机组成原理》试题.pdf
  4. python 吃豆人_用tkinter编写的伪吃豆人
  5. TROPOMI卫星甲醛数据和模式模拟对比评估及数据处理
  6. 实验室(教学室)智能同传,把某台电脑的操作系统、软件、设置等全部克隆到其他电脑里面。
  7. 4款超级实用的浏览器插件,让你的浏览器好用到飞起!
  8. 阿里云服务器企业邮箱发送邮件,解决25端口被封问题
  9. oracle基础回顾(超详细)
  10. 【企业数智化转型】第一章:产业互联网浪潮