用户数据处理

    上图中,每一行表示一个用户的数据,以

    用户数据处理 - 图2 隔开,第一列到最后一列分别表示UserID、Gender、Age、Occupation、Zip-code。各数据对应关系如下:

    首先,读取用户信息文件中的数据:

    1. usr_file = "./work/ml-1m/users.dat"
    2. # 打开文件,读取所有行到data中
    3. with open(usr_file, 'r') as f:
    4. data = f.readlines()
    5. # 打印data的数据长度、第一条数据、数据类型
    6. print("data 数据长度是:",len(data))
    7. print("第一条数据是:", data[0])
    8. print("数据类型:", type(data[0]))
    1. data 数据长度是: 6040
    2. 第一条数据是: 1::F::1::10::48067
    3.  
    4. 数据类型: <class 'str'>

    观察以上结果,用户数据一共有6040条,数据以

    分隔,是字符串类型。为了方便后续数据读取,区分用户的ID、年龄、职业等数据,一个简单的方式是将数据存储到字典中。另外在自然语言处理章节中我们了解到,文本数据无法直接输入到神经网络中进行计算,所以需要将字符串类型的数据转换成数字类型。 另外,用户的性别F、M是字母数据,这里需要转换成数字表示。

    1. 性别M用数字 0 表示
    2. 性别F用数字 1 表示

    接下来把用户数据的字符串类型的数据转成数字类型,并存储到字典中,实现如下:

    1. usr_info = {}
    2. max_usr_id = 0
    3. #按行索引数据
    4. for item in data:
    5. # 去除每一行中和数据无关的部分
    6. usr_id = item[0]
    7. # 将字符数据转成数字并保存在字典中
    8. usr_info[usr_id] = {'usr_id': int(usr_id),
    9. 'age': int(item[2]),
    10. 'job': int(item[3])}
    11. max_usr_id = max(max_usr_id, int(usr_id))
    12. print("用户ID为3的用户数据是:", usr_info['3'])

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

    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. #按行索引数据
    12. for item in data:
    13. # 去除每一行中和数据无关的部分
    14. item = item.strip().split("::")
    15. usr_id = item[0]
    16. # 将字符数据转成数字并保存在字典中
    17. use_info[usr_id] = {'usr_id': int(usr_id),
    18. 'gender': gender2num(item[1]),
    19. 'age': int(item[2]),
    20. 'job': int(item[3])}
    21. max_usr_id = max(max_usr_id, int(usr_id))
    22. return use_info, max_usr_id
    23. usr_file = "./work/ml-1m/users.dat"
    24. usr_info, max_usr_id = get_usr_info(usr_file)
    25. print("用户数量:", len(usr_info))
    26. print("最大用户ID:", max_usr_id)
    1. 用户数量: 6040
    2. 1个用户的信息是: {'usr_id': 1, 'gender': 1, 'age': 1, 'job': 10}

    从上面的结果可以得出,一共有6040个用户,其中ID为1的用户信息是{‘usr_id’: [1], ‘gender’: [1], ‘age’: [1], ‘job’: [10]},表示用户的性别序号是1(女),年龄序号是1(Under 18),职业序号是10(K-12 student),都已处理成数字类型。