python电影推荐系统
代码解释
封装类和函数
导包 随机数 字符 方差
import random
import string
import numpy as np
%load function.py
定义用户类 类函数可以生成用户 看过的电影字典
class user(object):
def getuserfilmsgrade(self):
userfilmsdict = dict()
userfilmsnumber = random.randint(1, filmsnumber)
for i in range(userfilmsnumber):
userfilmsdict[random.choice(films)] = round(random.random() * 10, 1)
return userfilmsdict
定义函数 生成用户id
def userid():
useridminlen = 5
useridmaxlen = 10
useridlen = random.randint(useridminlen,useridmaxlen)
code = string.ascii_letters + string.digits
useridnumber = ''.join(random.sample(code,useridlen))
return useridnumber
循环生成老用户数据
def oldusersdata(oldusersnumber):
oldusers = dict()
for i in range(oldusersnumber):
olduserid = userid()
olduser = user()
oldusers[olduserid] = olduser.getuserfilmsgrade()
return oldusers
将新用户 与 老用户 电影进行对比 输出 字典 老用户和新用户相同电影数目
def resultnamefunction(oldusers,newuser):
resultn = dict()
for olduserid,oldusersfilmsgrade in oldusers.items():
a = set(newuser.keys())
b = set(oldusersfilmsgrade.keys())
resultn[olduserid] = len(a & b)
return resultn
第一种推荐方式 观看电影相同的最多数目的老用户 在没看过的老用户 电影字典maxfilmsid 中最高评分为推荐电影
def highestdisparty(dict,id,oldusers):
maxfilmgrade = 0
bestfilmname = 'do not konw'
for maxfilmname in dict:
filmgrade = oldusers[id][maxfilmname]
if filmgrade > maxfilmgrade:
maxfilmgrade = filmgrade
bestfilmname = maxfilmname
return maxfilmgrade,bestfilmname
第二种推荐方式 新用户电影评分与老用户电影评分的方差 最低的为相似用户
两个用户之前进行判断相同电影 并返回相同电影评分均值
def common(a,b):
commonname = dict()
for olduserid,oldusersfilmsgrade in a.items():
new = set(b.keys())
old = set(oldusersfilmsgrade.keys())
commonname[olduserid] = new & old
return commonname
方差字典,并降序处理
def variancedictf(commonname,resultname,oldusers,newuser):
variancedict = dict()
for olduserid,commonfilms in commonname.items():
did = list()
variance = int()
for i in commonfilms:
did.append(round((oldusers[olduserid][i] - newuser[i]),1))
if len(did) == len(commonfilms):
variance = round((np.var(did)),2)
variancedict[olduserid] = variance
variancedict = sorted(resultname.items(),key = lambda d:d[1])
return variancedict
main()函数
%load film.py
电影推荐
历史数据: 会员名字/ID, 电影的观看记录: 电影名1:评分,电影名2:评分
新用户的数据 员名字/ID, 电影的观看记录: 电影名1:评分,电影名2:评分,只有一条
目标:根据新用户的数据,向新用户推荐电影
推荐规则: (1) 观看的共同电影数量 (2) 电影评分的差距
#根据推荐规则找到最相似的用户,在最相似用户的观看记录中找到评分最高的(共同观看电影除外)
1 完成电影推荐的完整程序,能够根据共同电影数量和电影评分的差进行推荐,也可以采用其他规则,比如演员信息等。
2 编写函数实现历史数据和新用户数据的生成,也可以输入新用户数据
初始化电影 film 表格
films = ['送你一朵小红花','功夫2','拆弹专家','温暖的抱抱','我和我的祖国','我和我的家乡','赤狐书生','魔兽','怪物猎人','花木兰','刺杀小说家','你的名字','秒速五厘米','龙猫','金刚川','紧急救援','隐形人2020','心灵奇旅','夺冠','刻在你心底的名字','菊次郎的春天','晴天雅集','小妇人','沐浴之王','除暴','釜山行','釜山行2:半岛','如果声音不记得','信条']
电影数量
filmsnumber = len(films)
main函数
def main():
#生成 老用户 数据字典
oldusers = dict()
oldusersnumber = int(input("请输入老用户数目"))
oldusers = oldusersdata(oldusersnumber)
look = int(input("是否要查看老用户数据库,请输入 0 or 1 "))
print(look)
if look == 1 :
print(oldusers)
else:
pass
#生成新用户类 生成看过的电影字典
newuser = user().getuserfilmsgrade()
print("自动生成新用户:",newuser)
#将新用户 与 老用户 电影进行对比 输出 字典 老用户和新用户相同电影数目
resultname = resultnamefunction(oldusers,newuser)
print("生成相同电影数目字典:",resultname)
#将电影数目进行降序排列
sortfilms = sorted(resultname.items(),key = lambda d:d[1],reverse = True)
print("并降序处理:",sortfilms)
#第一种推荐方式 观看电影相同的最多数目的老用户 在没看过的老用户 电影字典maxfilmsid 中最高评分为推荐电影
#取出最大电影相同数目的老用户id maxfilmsid
maxfilmsid = sortfilms[0][0]
#取出新用户 没看过的 老用户的电影字典
disparty = set(oldusers[maxfilmsid].keys()) - set(newuser.keys())
#取出评分最高的电影
highestdisparty1 = highestdisparty(disparty,maxfilmsid,oldusers)
print("第一种推荐的电影是:",highestdisparty1,"\nid%s和你观看电影数目最相同,是ta推荐给你的哦"%(maxfilmsid))
#第二种推荐方式 新用户电影评分与老用户电影评分的方差 最低的为相似用户
#两个用户之前进行判断相同电影 并返回相同电影评分均值
#用户相同电影
commonname = common(oldusers,newuser)
print("用户相同电影:",commonname)
variancedict = variancedictf(commonname,resultname,oldusers,newuser)
mostcommonid = variancedict[0][0]
print("各个用户相同电影评分 方差(越低代表和新用户匹配度越高):",variancedict,"\n其中匹配度最高的老用户是:",mostcommonid)
disparty2 = set(oldusers[mostcommonid].keys()) - set(newuser.keys())
highestdisparty2 = highestdisparty(disparty2,mostcommonid,oldusers)
print("第二种推荐的电影是:",highestdisparty2,"\nid%s和你观看电影评分最匹配,作为有缘人的ta推荐给你的哦"%(mostcommonid))
运行main()函数
if __name__ == '__main__':
main()