基于内容(content_based)的电影推荐系统实战

本文介绍了一个基于内容的电影推荐系统实现过程,通过处理用户评分和电影列表数据,计算电影的平均得分、种类排名及用户偏好,最终实现个性化电影推荐。

基于内容(content_based)的电影推荐系统实战

本文思想和代码基于https://coding.m.imooc.com/classindex.html?cid=297 该课程写成

个人代码参考: https://github.com/yuanzhiqj/recom

介绍

基于内容的推荐系统是根据用户的之前的偏好,计算推荐项目中与用户偏好相似度最高的项目,推荐给用户。

下面通过一个具体的电影推荐系统的示例来初步了解它

输入数据

给定两个输入文件,rating.txt和movies。分别代表用户的评分文件和电影的列表。截取部分数据解释如下:

rating.txt

userId movieId rating timestamp
1 31 2.5 1260759144

userid: 用户编号

movid: 电影编号

rating:评分

timestamp:时间戳,越大表示越近时间评分

movie.txt

movie title genres
1 Toy Story (1995)A Adventure|Animation|Children|Comedy|Fantasy

move:电影编号

title:电影名称

genres:电影分类,以’|'号分隔

处理数据

处理数据是比较麻烦的一部分,我们把它分为几步

  • 获得电影的平均得分
  • 获得一部电影的种类
  • 得到一个种类下的电影排名,评分从高到低
  • 获得最近的时间戳

获得平均得分

通过输入ratings.txt文件,返回一个包含所有电影平均分的字典score

record: 临时存数电影得分和评分次数的字典。

def get_avg(input_file):
    """
    获取平均分
        args: 
            input_file:输入文件
        return:
            一个字典,key:itemid value:avg
    """
    record = {
   
   }
    score = {
   
   }
    if not os.path.exists(input_file):
        print("no path")
        return {
   
   }
    linenum = 0
    fp = open(input_file)
    for line in fp:
        if linenum == 0:
            linenum += 1
            continue
        item = line.strip().split(",")
        if len(item) < 4:
            continue
        userid, itemid, rating = item[0],item[1],float(item[2])
        if itemid not in record:
            record[itemid] = [0,0]
        record[itemid][0] += rating
        record[itemid][1] += 1
    fp.close()
    for itemid in record:
        score[itemid] = round(record[itemid][0]/record[itemid][1],3
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值