在学习图神经网络 GNN 之前,必然要了解一些GNN的常用数据集,这篇博客主要以Cora数据集为例介绍GNN的数据集格式与读取方式,并以一个项目实例进行说明。
GNN常用数据集:https://linqs.soe.ucsc.edu/data
Cora数据集下载地址:https://linqs-data.soe.ucsc.edu/public/lbc/cora.tgz
以下内容均是对Cora数据集文件夹中README文件的翻译与解读,为避免误导读者,现作此说明,若有误请告知更正,感谢各位大牛不吝指教!
Cora数据集由机器学习论文组成。 这些论文分为以下七个类别之一:
这些论文的选择方式是,在最终语料库中,每篇论文引用或被至少一篇其他论文引用。整个语料库中有 2708篇 论文。
在词干堵塞和去除词尾后,只剩下 1433个 唯一的单词。文档频率小于10的所有单词都被删除。
该数据集由 cora.cites 与 cora.content 两个文件组成。
The .content file contains descriptions of the papers in the following format:
+
The first entry in each line contains the unique string ID of the paper followed by binary values indicating whether each word in the vocabulary is present (indicated by 1) or absent (indicated by 0) in the paper. Finally, the last entry in the line contains the class label of the paper.
.content文件包含以下格式的论文描述:
每行(其实就是图的一个节点)的第一个字段是论文的唯一字符串标识,后跟 1433 个字段(取值为二进制值),表示1433个词汇中的每个单词在文章中是存在(由1表示)还是不存在(由0表示)。最后,该行的最后一个字段表示论文的类别标签(7个)。因此该数据的特征应该有 1433 个维度,另外加上第一个字段 idx,最后一个字段 label, 一共有 1433 + 2 个维度。
The .cites file contains the citation graph of the corpus. Each line describes a link in the following format:
< ID of cited paper > < ID of citing paper>
Each line contains two paper IDs. The first entry is the ID of the paper being cited and the second ID stands for the paper which contains the citation. The direction of the link is from right to left. If a line is represented by “paper1 paper2” then the link is “paper2->paper1”.
.cites文件包含语料库的引用关系‘图’。
每行(其实就是图的一条边)用以下格式描述一个引用关系:<被引论文编号> <引论文编号>
每行包含两个paper id。第一个字段是被引用论文的标识,第二个字段代表引用的论文。引用关系的方向是从右向左。如果一行由“论文1 论文2”表示,则“论文2 引用 论文1”,即链接是“论文2 - >论文1”。可以通过论文之间的链接(引用)关系建立邻接矩阵adj。
import pandas as pd
import numpy as np
raw_data = pd.read_csv('cora.content', sep='\t', header=None)
print("content shape: ", raw_data.shape)
raw_data_cites = pd.read_csv('cora.cites', sep='\t', header=None)
print("cites shape: ", raw_data_cites.shape)
读取两个1.2节中的两个文件,并查看数据维度。
可以发现,content文件数据一共有2708条记录(即图有2708个节点),每条记录有 1435 个维度,其中 1433 个维度是记录的 feature(即1433个词汇) 。cites文件数据一共有5429条记录(即图有5429条边),每条记录包括引用与被引用 paper id。
import pandas as pd
raw_data = pd.read_csv('cora.content', sep='\t', header=None)
print("content shape: ", raw_data.shape)
features = raw_data.iloc[:,1:-1]
print("features shape: ", features.shape)
# one-hot encoding
labels = pd.get_dummies(raw_data[1434])
print("\n----head(3) one-hot label----")
print(labels.head(3))
import pandas as pd
import numpy as np
raw_data = pd.read_csv('cora.content', sep='\t', header=None)
num_nodes = raw_data.shape[0]
# 将节点重新编号为[0, 2707]
new_id = list(raw_data.index)
id = list(raw_data[0])
c = zip(id, new_id)
map = dict(c)
raw_data_cites = pd.read_csv('cora.cites', sep='\t', header=None)
# 根据节点个数定义矩阵维度
matrix = np.zeros((num_nodes,num_nodes))
# 根据边构建矩阵
for i ,j in zip(raw_data_cites[0],raw_data_cites[1]):
x = map[i] ; y = map[j]
matrix[x][y] = matrix[y][x] = 1 # 无向图:有引用关系的样本点之间取1
# 查看邻接矩阵的元素
print(matrix)