YelpChi数据集:基于Yelp数据集上的一个行为图数据集,数据集中的数据以稀疏矩阵的形式存在。该数据集经常用于节点分类、欺诈检测、异常检测等的研究任务上。

Yelp垃圾评论数据集包括Yelp过滤(垃圾)和推荐(合法)的酒店和餐厅评论。Yelp-Fraud数据集上执行一个垃圾邮件审查检测任务,该任务是一个二元分类任务。YelpChi从SpEagle上提取了32个手工特性作为Yelp-Fraud的原始节点特性,基于前人研究发现意见欺假者在用户、产品、评论文本、时间等方面存在联系,将评论作为图中的节点,设计了三种关系:R-U-R:连接同一用户发布的评论;R-S-R:连接同一产品同一星级(1-5星)下的评论;R-T-R:连接同一个月发布的同一产品下的两个评论。

数据集预处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 设置数据文件的路径前缀
prefix = 'data/'

# 从 'YelpChi.mat' 文件中加载数据,返回一个包含数据的字典
yelp = loadmat('data/YelpChi.mat')

# 加载不同类型的图结构数据
net_rur = yelp['net_rur'] # 加载网状结构 'rur'(例如,用户-用户之间的关系网络)
net_rtr = yelp['net_rtr'] # 加载网状结构 'rtr'(例如,评论-评论之间的关系网络)
net_rsr = yelp['net_rsr'] # 加载网状结构 'rsr'(例如,服务-服务之间的关系网络)
yelp_homo = yelp['homo'] # 加载同构网络(例如,将所有关系混合成一个同构图)

# 将稀疏矩阵转换为邻接表并保存为pickle文件
sparse_to_adjlist(net_rur, prefix + 'yelp_rur_adjlists.pickle') # 将 'rur' 网络转换为邻接表,并保存为 pickle 文件
sparse_to_adjlist(net_rtr, prefix + 'yelp_rtr_adjlists.pickle') # 将 'rtr' 网络转换为邻接表,并保存为 pickle 文件
sparse_to_adjlist(net_rsr, prefix + 'yelp_rsr_adjlists.pickle') # 将 'rsr' 网络转换为邻接表,并保存为 pickle 文件
sparse_to_adjlist(yelp_homo, prefix + 'yelp_homo_adjlists.pickle') # 将同构网络转换为邻接表,并保存为 pickle 文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def sparse_to_adjlist(sp_matrix, filename):
"""
将稀疏矩阵转换为邻接表并将其保存为pickle文件。

:param sp_matrix: 输入的稀疏矩阵,表示图的边信息。
:param filename: 保存邻接表的文件名(以pickle格式保存)。
"""
# 添加自环(self-loop)到稀疏矩阵中,即对角线元素置为1
homo_adj = sp_matrix + sp.eye(sp_matrix.shape[0]) # sp.eye 创建对角线为1的单位矩阵

# 初始化一个空的邻接表,使用字典结构,字典的键是节点,值是与该节点相邻的节点集合
adj_lists = defaultdict(set)

# 获取稀疏矩阵中非零元素的位置,即图中的边
edges = homo_adj.nonzero() # 返回非零元素的位置

# 遍历所有的边,将其转化为邻接表表示
for index, node in enumerate(edges[0]):
adj_lists[node].add(edges[1][index]) # 将边的终点添加到起点的邻接列表中
adj_lists[edges[1][index]].add(node) # 同时将起点添加到终点的邻接列表中,保证无向图的对称性

# 将生成的邻接表保存为pickle文件
with open(filename, 'wb') as file:
pickle.dump(adj_lists, file) # 使用pickle将邻接表序列化保存
file.close() # 关闭文件

使用

加载给定数据集名称的图、特征和标签

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
def load_data(data, prefix='data/'):
"""
Load graph, feature, and label given dataset name
:returns: home and single-relation graphs, feature, label
"""

if data == 'yelp':
data_file = loadmat(prefix + 'YelpChi.mat')
labels = data_file['label'].flatten()
feat_data = data_file['features'].todense().A
# load the preprocessed adj_lists
with open(prefix + 'yelp_homo_adjlists.pickle', 'rb') as file:
homo = pickle.load(file)
file.close()
with open(prefix + 'yelp_rur_adjlists.pickle', 'rb') as file:
relation1 = pickle.load(file)
file.close()
with open(prefix + 'yelp_rtr_adjlists.pickle', 'rb') as file:
relation2 = pickle.load(file)
file.close()
with open(prefix + 'yelp_rsr_adjlists.pickle', 'rb') as file:
relation3 = pickle.load(file)
file.close()
elif data == 'amazon':
data_file = loadmat(prefix + 'Amazon.mat')
labels = data_file['label'].flatten()
feat_data = data_file['features'].todense().A
# load the preprocessed adj_lists
with open(prefix + 'amz_homo_adjlists.pickle', 'rb') as file:
homo = pickle.load(file)
file.close()
with open(prefix + 'amz_upu_adjlists.pickle', 'rb') as file:
relation1 = pickle.load(file)
file.close()
with open(prefix + 'amz_usu_adjlists.pickle', 'rb') as file:
relation2 = pickle.load(file)
file.close()
with open(prefix + 'amz_uvu_adjlists.pickle', 'rb') as file:
relation3 = pickle.load(file)

return [homo, relation1, relation2, relation3], feat_data, labels