评分数据处理

有了用户数据和电影数据后,还需要获得用户对电影的评分数据,ml-1m数据集的评分数据在ratings.dat文件中。评分数据格式为UserID::MovieID::Rating::Timestamp,如下图。

评分数据处理 - 图1

这份数据很容易理解,如1::1193::5::978300760 表示ID为1的用户对电影ID为1193的评分是5。

978300760表示Timestamp数据,是标注数据时记录的时间信息,对当前任务来说是没有作用的数据,可以忽略这部分信息。

接下来,读取评分文件里的数据:

  1. use_poster = False
  2. if use_poster:
  3. rating_path = "./work/ml-1m/new_rating.txt"
  4. else:
  5. rating_path = "./work/ml-1m/ratings.dat"
  6. # 打开文件,读取所有行到data中
  7. with open(rating_path, 'r') as f:
  8. data = f.readlines()
  9. # 打印data的数据长度,以及第一条数据中的用户ID、电影ID和评分信息
  10. item = data[0]
  11. print(item)
  12. item = item.strip().split("::")
  13. usr_id,movie_id,score = item[0],item[1],item[2]
  14. print("评分数据条数:", len(data))
  15. print("用户ID:", usr_id)
  16. print("电影ID:", movie_id)
  17. print("用户对电影的评分:", score)
  1. 1::1193::5::978300760
  2.  
  3. 评分数据条数: 1000209
  4. 用户ID 1
  5. 电影ID 1193
  6. 用户对电影的评分: 5

从以上统计结果来看,一共有1000209条评分数据。电影评分数据不包含文本信息,可以将数据直接存到字典中。

下面我们将评分数据封装到get_rating_info()函数中,并返回评分数据的信息。

  1. def get_rating_info(path):
  2. # 打开文件,读取所有行到data中
  3. with open(path, 'r') as f:
  4. data = f.readlines()
  5. # 创建一个字典
  6. rating_info = {}
  7. for item in data:
  8. item = item.strip().split("::")
  9. # 处理每行数据,分别得到用户ID,电影ID,和评分
  10. usr_id,movie_id,score = item[0],item[1],item[2]
  11. if usr_id not in rating_info.keys():
  12. rating_info[usr_id] = {movie_id:float(score)}
  13. else:
  14. rating_info[usr_id][movie_id] = float(score)
  15. return rating_info
  16. # 获得评分数据
  17. #rating_path = "./work/ml-1m/ratings.dat"
  18. rating_info = get_rating_info(rating_path)
  19. print("ID为1的用户一共评价了{}个电影".format(len(rating_info['1'])))
  1. ID1的用户一共评价了53个电影