此例构建的是用户-评分-用户的元路径。索引号即对应的用户id。
# 构建稀疏矩阵
import scipy.sparse as ss
from itertools import combinations, permutations
import numpy as np
import pandas as pd
def build_matrix(aa,l):#aa代表邻接矩阵索引号,l是最后要构建的邻接矩阵
# aa = [0, 2, 3]
A = list(permutations(aa, 2)) # aa代表的是邻接矩阵的索引号。
print(A) # 那些索引号的排列组合,即坐标,没有对角线。
col = []
row = []
for i in range(len(A)):
row.append(A[i][0])
col.append(A[i][1])
# print(row)
# print(col)
'''
#https://www.cnblogs.com/hellojamest/p/11769467.html 关于稀疏矩阵知识详见此链接
# data = [1] * len(A)
# c = ss.coo_matrix((data, (row, col)), shape=(4, 4)) # 生成稀疏矩阵,shape是最后生成的矩阵大小。
'''
for i in range(len(row)):
l[row[i],col[i]]=1
# print(l.toarray())
#传数据,读取构建元路径所在列数据
#加载数据集
file_path = pd.read_excel(r"D:\BaiduNetdiskDownload\yelp\new10.xls",usecols=[8])#传进来当前我的文件夹路径,data_dir等是从命令行传进来的,即从配置文件那里
meta_data = []
# column_list = file_path.columns
index=0
#train_data中存储的所有评论
for d in file_path['rating']:
meta_data.append(
d)
# a=[1,2,1,1]#这就是要传入元路径
b=set(meta_data)#得到拥有的值
print(b)
newlist = []#将集合中的元素转到此列表中
l=ss.lil_matrix((len(meta_data),len(meta_data)))#最后想要创建的邻接矩阵
for i in b:
newlist.append(i)#将集合转成列表
for i in range(len(newlist)):
indices = []#存储索引
start=0
while newlist[i]!=-1:
try:
x = meta_data.index(newlist[i], start)
indices.append(x)
start = x + 1
except:
print(indices)
build_matrix(indices,l)
break
# print(l.toarray())#此时得到的邻接矩阵会在相关索引部分弄成对角线为1。
l[np.eye(len(meta_data),dtype=np.bool)]=0#将对角线变成0,即自身与自身的关联去掉
print(l.toarray())#得到最终的邻接矩阵
参考链接:
将对角线变成0