评分数据处理
有了用户数据和电影数据后,还需要获得用户对电影的评分数据,ml-1m数据集的评分数据在ratings.dat文件中。评分数据格式为UserID::MovieID::Rating::Timestamp,如下图。
这份数据很容易理解,如1::1193::5::978300760 表示ID为1的用户对电影ID为1193的评分是5。
978300760表示Timestamp数据,是标注数据时记录的时间信息,对当前任务来说是没有作用的数据,可以忽略这部分信息。
接下来,读取评分文件里的数据:
use_poster = False
if use_poster:
rating_path = "./work/ml-1m/new_rating.txt"
else:
rating_path = "./work/ml-1m/ratings.dat"
# 打开文件,读取所有行到data中
with open(rating_path, 'r') as f:
data = f.readlines()
# 打印data的数据长度,以及第一条数据中的用户ID、电影ID和评分信息
item = data[0]
print(item)
item = item.strip().split("::")
usr_id,movie_id,score = item[0],item[1],item[2]
print("评分数据条数:", len(data))
print("用户ID:", usr_id)
print("电影ID:", movie_id)
print("用户对电影的评分:", score)
- 1::1193::5::978300760
- 评分数据条数: 1000209
- 用户ID: 1
- 电影ID: 1193
- 用户对电影的评分: 5
从以上统计结果来看,一共有1000209条评分数据。电影评分数据不包含文本信息,可以将数据直接存到字典中。
下面我们将评分数据封装到get_rating_info()函数中,并返回评分数据的信息。
def get_rating_info(path):
# 打开文件,读取所有行到data中
with open(path, 'r') as f:
data = f.readlines()
# 创建一个字典
rating_info = {}
for item in data:
item = item.strip().split("::")
# 处理每行数据,分别得到用户ID,电影ID,和评分
usr_id,movie_id,score = item[0],item[1],item[2]
if usr_id not in rating_info.keys():
rating_info[usr_id] = {movie_id:float(score)}
else:
rating_info[usr_id][movie_id] = float(score)
return rating_info
# 获得评分数据
#rating_path = "./work/ml-1m/ratings.dat"
rating_info = get_rating_info(rating_path)
print("ID为1的用户一共评价了{}个电影".format(len(rating_info['1'])))
- ID为1的用户一共评价了53个电影