• 人工智能-推荐数据处理


    数据处理

    用户数据处理

    用户数据一行 

    第一条数据是: 1::F::1::10::48067
    • 首先,读取用户信息文件中的数据:
    • 接下来把用户数据的字符串类型的数据转成数字类型,并存储到字典中,实现如下:
    • 代码如下:
    1. # 解压数据集
    2. !unzip -o -q -d ~/work/ ~/data/data19736/ml-1m.zip
    1. import numpy as np
    2. def get_usr_info(path):
    3. # 性别转换函数,M-0, F-1
    4. def gender2num(gender):
    5. return 1 if gender == 'F' else 0
    6. # 打开文件,读取所有行到data中
    7. with open(path, 'r') as f:
    8. data = f.readlines()
    9. # 建立用户信息的字典
    10. use_info = {}
    11. max_usr_id = 0
    12. #按行索引数据
    13. for item in data:
    14. # 去除每一行中和数据无关的部分
    15. item = item.strip().split("::")
    16. usr_id = item[0]
    17. # 将字符数据转成数字并保存在字典中
    18. use_info[usr_id] = {'usr_id': int(usr_id),
    19. 'gender': gender2num(item[1]),
    20. 'age': int(item[2]),
    21. 'job': int(item[3])}
    22. max_usr_id = max(max_usr_id, int(usr_id))
    23. return use_info, max_usr_id
    24. usr_file = "./work/ml-1m/users.dat"
    25. usr_info, max_usr_id = get_usr_info(usr_file)
    26. print("用户数量:", len(usr_info))
    27. print("最大用户ID:", max_usr_id)
    28. print("第1个用户的信息是:", usr_info['1'])

    电影数据处理

    1. 统计电影ID信息。
    2. 统计电影名字的单词,并给每个单词一个数字序号。
    3. 统计电影类别单词,并给每个单词一个数字序号。
    4. 保存电影数据到字典中,方便根据电影ID进行索引。
    5.  电影类别和电影名称定长填充,并保存所有电影数据到字典中

    1. def get_movie_info(path):
    2. # 打开文件,编码方式选择ISO-8859-1,读取所有数据到data中
    3. with open(path, 'r', encoding="ISO-8859-1") as f:
    4. data = f.readlines()
    5. # 建立三个字典,分别用户存放电影所有信息,电影的名字信息、类别信息
    6. movie_info, movie_titles, movie_cat = {}, {}, {}
    7. # 对电影名字、类别中不同的单词计数
    8. t_count, c_count = 1, 1
    9. # 初始化电影名字和种类的列表
    10. titles = []
    11. cats = []
    12. count_tit = {}
    13. # 按行读取数据并处理
    14. for item in data:
    15. item = item.strip().split("::")
    16. v_id = item[0]
    17. v_title = item[1][:-7]
    18. cats = item[2].split('|')
    19. v_year = item[1][-5:-1]
    20. titles = v_title.split()
    21. # 统计电影名字的单词,并给每个单词一个序号,放在movie_titles中
    22. for t in titles:
    23. if t not in movie_titles:
    24. movie_titles[t] = t_count
    25. t_count += 1
    26. # 统计电影类别单词,并给每个单词一个序号,放在movie_cat中
    27. for cat in cats:
    28. if cat not in movie_cat:
    29. movie_cat[cat] = c_count
    30. c_count += 1
    31. # 补0使电影名称对应的列表长度为15
    32. v_tit = [movie_titles[k] for k in titles]
    33. while len(v_tit)<15:
    34. v_tit.append(0)
    35. # 补0使电影种类对应的列表长度为6
    36. v_cat = [movie_cat[k] for k in cats]
    37. while len(v_cat)<6:
    38. v_cat.append(0)
    39. # 保存电影数据到movie_info中
    40. movie_info[v_id] = {'mov_id': int(v_id),
    41. 'title': v_tit,
    42. 'category': v_cat,
    43. 'years': int(v_year)}
    44. return movie_info, movie_cat, movie_titles
    45. movie_info_path = "./work/ml-1m/movies.dat"
    46. movie_info, movie_cat, movie_titles = get_movie_info(movie_info_path)
    47. print("电影数量:", len(movie_info))
    48. ID = 1
    49. print("原始的电影ID为 {} 的数据是:".format(ID), data[ID-1])
    50. print("电影ID为 {} 的转换后数据是:".format(ID), movie_info[str(ID)])
    51. print("电影种类对应序号:'Animation':{} 'Children's':{} 'Comedy':{}".format(movie_cat['Animation'],
    52. movie_cat["Children's"],
    53. movie_cat['Comedy']))
    54. print("电影名称对应序号:'The':{} 'Story':{} ".format(movie_titles['The'], movie_titles['Story']))

    评分数据处理

    评分数据格式为UserID::MovieID::Rating::Timestamp,如下图。

     

    将数据直接存到字典中。

    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'])))

    海报图像读取 

    通过构造图像读取路径。

    构建数据读取器

    首先,构造一个函数,把读取并处理后的数据整合到一起,即在rating数据中补齐用户和电影的所有特征字段。把所有数据进行打宽表。

    把全量数据分批次进行迭代,因为训练一次需要少量的数据。

    数据读取器函数实现,核心是将多个样本数据合并到一个列表(batch),当该列表达到batchsize后,以yield的方式返回(Python数据迭代器)。

    读取器返回的是宽表数据。

  • 相关阅读:
    中山市 香山杯2023 Misc pintu
    Go 查找重复的行
    “升级图片管理,优化工作流程——轻松将JPG转为PNG“
    【Vue简介+搭建Vue开发环境+Hello小案例】
    17个工作必备的Python自动化代码分享(上篇)
    【m98】接收udp包到变为CopyOnWriteBuffer的rtp包及call模块传递的过程
    无线蓝牙运动耳机哪个品牌好?运动蓝牙耳机推荐
    避免重复请求:接口重试机制最佳实践
    java spring cloud 企业电子招标采购系统源码:营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展
    java File AbsolutePath的路径不正确
  • 原文地址:https://blog.csdn.net/dhfzhishi/article/details/133860173