基于内容(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

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





