python电影推荐系统

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()

效果截图

简单的交互

老用户数量

老用户数量

看老用户数据,输入0或其他的,将不显示;输入1,将显示

查看老用户数据,输入0或其他的,将不显示;输入1,将显示

老用户数据

老用户数据

老用户与新用户相同电影数目老用户与新用户相同电影数目
相同电影数目降序处理相同电影数目降序处理
第一种推荐电影,并用老用户id推荐

第一种推荐电影,并用老用户id推荐

老用户相同电影名称

老用户相同电影名称

根据新老用户相同电影评分,计算各自方差,以方差来考量新老用户的相似度

根据新老用户相同电影评分,计算各自方差,以方差来考量新老用户的相似度

排序输出,方差最小的即匹配度最高的,输出第二种推荐电影排序输出,方差最小的即匹配度最高的,输出第二种推荐电影
  • 1
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值