关于“SASRec 基于自注意力的序列推荐”这篇论文的学习笔记和代码复现可以看之前写的这两篇:
学习笔记——SASRec 基于自注意力的序列推荐-CSDN博客
代码复现——SASRec 基于自注意力的序列推荐-CSDN博客
这次是关于这篇论文的代码展示,全文一万六千多字,难免会有所疏漏,有任何问题欢迎指出。
需要完整代码压缩包的伙伴可以私信我(复现不易,分享难得,小偿即可,白嫖勿扰)。
1、项目代码结构
1.1、data文件夹中存放了各种经过处理的数据集
文本内容长这样
其中user-course_order.txt是由user-course_order.json得来的, user-course_order.json长这样:
1.2、jsonProcessing文件夹中存放的是各种数据处理代码
如何将json文件转换成模型所需的数据格式呢,在jsonProcessing文件夹下运行json2txt.py代码
import json
def read_json(file_path):
"""
读取JSON文件,文件中每一行都是一个独立的JSON对象。它将每一行解析为Python字典,并将所有用户存储在一个列表中。
"""
data = []
with open(file_path, 'r', encoding='utf-8') as file:
for line in file:
data.append(json.loads(line))
return data
def write_to_txt(users, output_file):
"""
遍历用户列表,对于每个用户,提取新用户ID和课程编号列表,并将它们转换为指定的格式(每行包含用户ID和课程ID),然后写入TXT文件。
"""
with open(output_file, 'w', encoding='utf-8') as file:
for user in users:
new_user_id = user['新用户id']
for course_id in user['course_order_numbered']:
file.write(f"{new_user_id} {course_id}\n")
# 主函数
def main():
"""
读取JSON文件中的用户数据。
遍历每个用户的数据,提取新用户ID和课程编号列表。
将这些数据转换为指定的格式,即每行包含用户ID和课程ID。
将转换后的数据写入TXT文件。
"""
user_json_path = '../data/selected_user_numbered.json' # 筛选后的用户JSON文件路径
output_txt_path = '../data/user-course_order.txt' # 输出TXT文件路径
# 读取筛选后的用户数据
filtered_users = read_json(user_json_path)
# 将用户数据写入TXT文件
write_to_txt(filtered_users, output_txt_path)
print(f'用户数据已写入 {output_txt_path}')
if __name__ == '__main__':
main()
要想得到selected_user_numbered_large.json文件,要先将原始慕课数据集进行处理。
1.2.1、原始的user.json,存放了所有学生的id、姓名、课程观看序列等信息
1.2.2、原始的course.json,存放了所有课程的id、课程名等信息
1.2.3、在jsonProcessing文件夹下运行course_number.py代码
先给课程重新编号,从1开始,得到course_numbered.json,其文件内容为:
代码为:
import json
def read_course_json(file_path):
"""
读取JSON文件,假设每个课程占一行。
"""
courses = []
with open(file_path, 'r', encoding='utf-8') as file:
for line in file:
courses.append(json.loads(line))
return courses
def assign_numbers(courses):
"""
为课程分配从1开始的编号。
"""
course_id_map = {}
for index, course in enumerate(courses, start=1):
course_id_map[course['id']] = index
return course_id_map
def write_courses_with_numbers(courses, course_id_map, output_file):
"""
将编号后的数据写入新的JSON文件。
"""
with open(output_file, 'w', encoding='utf-8') as file:
for course in courses:
# 创建一个新的字典,只包含编号、原编号和课程名
new_course = {
'新课程编号id': course_id_map[course['id']],
'原课程编号id': course['id'],
'课程名name': course['name']
}
# 将新的课程字典转换为JSON格式的字符串,并确保中文字符不被转义
json.dump(new_course, file, ensure_ascii=False)
file.write('\n')
# def write_courses_with_numbers(courses, course_id_map, output_file):
# """
# 将编号后的数据写入新的JSON文件。
# """
# # 创建一个新的列表,包含所有课程的编号信息
# numbered_courses = [
# {
# '新课程编号id': course_id_map[course['id']],
# '原课程编号id': course['id'],
# '课程名name': course['name']
# } for course in courses
# ]
# # 将新的课程列表转换为JSON格式的字符串,并确保中文字符不被转义
# with open(output_file, 'w', encoding='utf-8') as file:
# json.dump(numbered_courses, file, ensure_ascii=False, indent=4)
# 主函数
def main():
course_json_path = '/Dataset/MOOCCub
标签:SASRec,courses,注意力,course,json,user,file,序列,id
From: https://blog.csdn.net/m0_63294504/article/details/142301198