深度学习入门篇-推荐系统-相似度算法原理

时间:2025-04-06 20:40:51
import pandas as pd from sklearn.metrics.pairwise import cosine_similarity # 第一步特征选取 #导文件 user_df = pd.read_csv("data/用户信息.csv") article_df = pd.read_csv("data/文章信息.csv") # print(article_df) cols_df = pd.read_csv("data/栏目信息.csv") # print(cols_df) area_df = pd.read_csv("data/地域信息.csv") # print(area_df) publish_df = pd.read_csv("data/发布时间信息.csv") # print(publish_df) click_df = pd.read_csv("data/点击量信息.csv") # print(click_df) #第二步,特征预处理,独热编码 cols_vec = [0 for _ in cols_df["栏目编号"]] # 以上语句等同于 # cols_vec = [] # for _ in cols_df["栏目编号"]: # cols_vec.append(0) area_vec = [0 for _ in area_df["地域编号"]] publish_vec = [0 for _ in publish_df["发布时间编号"]] click_vec = [0 for _ in click_df["点击量分级编号"]] # 遍历每一篇文章,然后对其特征做处理 wenz_list = [] for i in range(len(article_df)): # 栏目独热编码 cols_str = str(article_df["栏目编号"][i]) cols_onehot_vec = cols_vec.copy() if cols_str == "不限": cols_onehot_vec = [1 for _ in cols_vec] else: # 用于多个栏目编号以逗号分隔的情况 cols_arr = cols_str.split(",") for j in cols_arr: j = int(j) cols_onehot_vec[j-1] =1 #地域独热编码 area_str = str(article_df["地域编号"][i]) area_onehot_vec = area_vec.copy() if area_str == "不限": area_onehot_vec = [1 for _ in area_vec] else: # 用于多个栏目编号以逗号分隔的情况 area_arr = area_str.split(",") for j in area_arr: j = int(j) area_onehot_vec[j - 1] = 1 # 发布时间分级独热编码 publish_str = str(article_df["发布时间分级"][i]) publish_onehot_vec = publish_vec.copy() if publish_str == "不限": publish_onehot_vec = [1 for _ in publish_vec] else: # 用于多个栏目编号以逗号分隔的情况 publish_arr = publish_str.split(",") for j in publish_arr: j = int(j) publish_onehot_vec[j - 1] = 1 # 点击量分级独热编码 click_str = str(article_df["点击量分级"][i]) click_onehot_vec = click_vec.copy() if click_str == "不限": click_onehot_vec = [1 for _ in click_vec] else: # 用于多个栏目编号以逗号分隔的情况 click_arr = click_str.split(",") for j in click_arr: j = int(j) click_onehot_vec[j - 1] = 1 # 拼接独热编码到文章列表中 wenz_list.append( cols_onehot_vec + area_onehot_vec + publish_onehot_vec + click_onehot_vec ) # 打印文章信息列表 # for v in wenz_list: # print(v) # 处理用户信息:用户信息中只有 栏目编号 和 所属地域编号 # 1、发布时间?最新发布的那个值 = 第1个分级 # 2、点击量?点击量最多的那个值 = 第8个分级 user_list = [] for i in range(len(user_df)): # 用户感兴趣的栏目编号 cols_str = str(user_df["感兴趣的栏目编号"][i]) cols_onehot_vec = cols_vec.copy() if cols_str == "不限": cols_onehot_vec = [1 for _ in cols_vec] else: # 用于多个栏目编号以逗号分隔的情况 cols_arr = cols_str.split(",") for j in cols_arr: j = int(j) cols_onehot_vec[j-1] =1 #地域独热编码 area_str = str(user_df["所属的地域编号"][i]) area_onehot_vec = area_vec.copy() if area_str == "不限": area_onehot_vec = [1 for _ in area_vec] else: # 用于多个栏目编号以逗号分隔的情况 area_arr = area_str.split(",") for j in area_arr: j = int(j) area_onehot_vec[j - 1] = 1 # 用户隐藏的发布时间兴趣设置为最新,也就是第一级,都为[1,0,0,0,0,0,0,0]的独热编码 publish_onehot_vec = publish_vec.copy() publish_onehot_vec[0] = 1 # 用户隐藏的点击量兴趣设置为最高,也就是最后一级,为[0,0,0,0,0,0,0,1]的独热编码 click_onehot_vec = click_vec.copy() click_onehot_vec[-1] = 1 user_list.append( cols_onehot_vec + area_onehot_vec + publish_onehot_vec + click_onehot_vec ) # for v in user_list: # print(v) # 第三步,基于余弦相似度求每一篇文章与用户的相似度 sim_lis = cosine_similarity(user_list,wenz_list) #第四步排序 sorted_sim_lis = [] for lis in sim_lis: # 相似度与对应的文章编号关联起来 lis1 = [(i+1, sim_v)for i, sim_v in enumerate(lis)] # 按第二列的值降序排序 lis1 = sorted(lis1, key=lambda row: row[1], reverse= True) sorted_sim_lis.append(lis1) for i,v in enumerate(sorted_sim_lis): print(user_df["昵称"][i]) print(v)