推荐系统之数据处理与读取 您所在的位置:网站首页 avazu数据集介绍 推荐系统之数据处理与读取

推荐系统之数据处理与读取

2023-10-20 14:30| 来源: 网络整理| 查看: 265

内容都是百度AIstudio的内容,我只是在这里做个笔记,不是原创。

数据集回顾

在进行数据处理前,我们先回顾下本章使用的ml-1m电影推荐数据集。

ml-1m是GroupLens Research从MovieLens网站上收集并提供的电影评分数据集。包含了6000多位用户对近3900个电影的共100万条评分数据,评分均为1~5的整数,其中每个电影的评分数据至少有20条。该数据集包含三个数据文件,分别是:

users.dat,存储用户属性信息的文本格式文件。movies.dat,存储电影属性信息的文本格式文件。ratings.dat, 存储电影评分信息的文本格式文件。

电影海报图像在posters文件夹下,海报图像的名字以"mov_id" + 电影ID + ".png"的方式命名。由于这里的电影海报图像有缺失,我们整理了一个新的评分数据文件,新的文件中包含的电影均是有海报数据的,因此,本次实验使用的数据集在ml-1m基础上增加了两份数据:

posters/ , 包含电影海报图像。new_rating.txt, 存储包含海报图像的新评分数据文件。

 

数据处理流程

在计算机视觉和自然语言处理章节中,我们已经了解到数据处理是算法应用的前提,并掌握了图像数据处理和自然语言数据处理的方法。总结一下,数据处理就是将人类容易理解的图像文本数据,转换为机器容易理解的数字形式,把离散的数据转为连续的数据。在推荐算法中,这些数据处理方法也是通用的。

本次实验中,数据处理一共包含如下六步:

读取用户数据,存储到字典读取电影数据,存储到字典读取评分数据,存储到字典读取海报数据,存储到字典将各个字典中的数据拼接,形成数据读取器划分训练集和验证集,生成迭代器,每次提供一个批次的数据

流程如下图所示。

 

用户数据文件user.dat中的数据格式为:UserID::Gender::Age::Occupation::Zip-code。 

 

比如82::M::25::17::48380表示ID为82的用户,性别为男,年龄为25-34岁,职业technician/engineer。

至此,我们完成了用户数据的处理,完整的代码如下:

 

import numpy as np def get_usr_info(path): # 性别转换函数,M-0, F-1 def gender2num(gender): return 1 if gender == 'F' else 0 # 打开文件,读取所有行到data中 with open(path, 'r') as f: data = f.readlines() # 建立用户信息的字典 use_info = {} max_usr_id = 0 #按行索引数据 for item in data: # 去除每一行中和数据无关的部分 item = item.strip().split("::") usr_id = item[0] # 将字符数据转成数字并保存在字典中 use_info[usr_id] = {'usr_id': int(usr_id), 'gender': gender2num(item[1]), 'age': int(item[2]), 'job': int(item[3])} max_usr_id = max(max_usr_id, int(usr_id)) return use_info, max_usr_id usr_file = "./work/ml-1m/users.dat" usr_info, max_usr_id = get_usr_info(usr_file) print("用户数量:", len(usr_info)) print("最大用户ID:", max_usr_id) print("第1个用户的信息是:", usr_info['1'])

 

 电影信息包含在movies.dat中,数据格式为:MovieID::Title::Genres,保存的格式与用户数据相同,每一行表示一条电影数据信息。

 

 

data是list,下标起始是0, movie_info是字典,我们从1开始,因为电影的编号是从1开始的。

完整的电影数据处理代码如下:

def get_movie_info(path): # 打开文件,编码方式选择ISO-8859-1,读取所有数据到data中 with open(path, 'r', encoding="ISO-8859-1") as f: data = f.readlines() # 建立三个字典,分别用户存放电影所有信息,电影的名字信息、类别信息 movie_info, movie_titles, movie_cat = {}, {}, {} # 对电影名字、类别中不同的单词计数 t_count, c_count = 1, 1 # 初始化电影名字和种类的列表 titles = [] cats = [] count_tit = {} # 按行读取数据并处理 for item in data: item = item.strip().split("::") v_id = item[0] v_title = item[1][:-7] cats = item[2].split('|') v_year = item[1][-5:-1] titles = v_title.split() # 统计电影名字的单词,并给每个单词一个序号,放在movie_titles中 for t in titles: if t not in movie_titles: movie_titles[t] = t_count t_count += 1 # 统计电影类别单词,并给每个单词一个序号,放在movie_cat中 for cat in cats: if cat not in movie_cat: movie_cat[cat] = c_count c_count += 1 # 补0使电影名称对应的列表长度为15 v_tit = [movie_titles[k] for k in titles] while len(v_tit)


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有