深度学习入门篇-推荐系统-相似度算法原理
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)