介绍
在这篇文章中,我们将使用现代的图机器学习技术在 Wikispeedia navigation paths路径数据集进行项目实践
West & Leskovec 之前在没有使用图神经网络 [1] 的情况下解决了类似的问题。Cordonnier & Loukas 还使用 Wikispeedia 图[2] 上的非回溯随机游走的图卷积网络解决了这个问题。我们的技术与这两篇论文都不同并且也取得了很好的效果。
在文章的最后还会提供 GitHub和Colab 的完整代码。
数据+问题描述
我们的数据来自斯坦福网络分析项目 (SNAP) 的数据集集合。该数据集获取了由 Wikispeedia 的玩家收集的 Wikipedia 超链接网络上的导航路径数据。Wikispeedia是一个更多的被称为 Wikiracing 的益智小游戏,目的是机器自动学习常识知识。游戏规则很简单——玩家在比赛中选择两个不同的*文章,目标是在只点击第一篇文章提供的链接的情况下到达第二篇文章并且越快越好。
那么我们的任务是什么?鉴于成千上万的用户在玩 Wikispeedia 创建的 Wikipedia 页面路径,如果我们知道用户到目前为止访问的页面顺序,我们是否可以预测玩家的目标文章?我们可以使用图神经网络提供的表达能力来做到这一点吗?
数据预处理
准备用于图机器学习的数据集需要大量的预处理。第一个目标是将数据表示为一个有向图,其中*文章作为节点,连接文章的超链接作为边。这一步可以使用 NetworkX,一个 Python 网络分析库,以及 Cordonnier & Loukas [2] 之前的工作。因为Cordonnier & Loukas 已经在使用图形建模语言 (GML) 处理并编码了了来自 SNAP 数据集的超链接图结构文件,我们可以轻松地将其导入 NetworkX。
下一个目标是处理来自 Cordonnier & Loukas 和原始 SNAP 数据集的数据,这样可以为 NetworkX 图中的每篇文章添加节点级属性。对于每个节点,我们希望包含页面的入度和出度以及文章内容,所以这里使用了文章中每个单词对应的 FastText 预训练词嵌入的平均值表示。Cordonnier & Loukas处理并编码了每个页面的度和文本文件中相应的内容嵌入。此外,我们还将每篇文章进行了层次分类的(例如,“猫”页面分类在科学 > 生物学 > 哺乳动物下)并添加到其相应的节点,所以在处理时使用 Pandas 以解析制表符分隔并为每篇文章生成一个多分类的变量来表示该文章属于哪些类别。然后再通过使用 set_node_attributes 方法,新的文章属性添加到 NetworkX 图中的每个相应节点。
import networkx as nx
# read our graph from file
our_graph = nx.read_gml('graph.gml')
# define our new node attributes
attrs = { "Cat": { "in_degree": 31 }, "New_York_City": { "in_degree": 317 } }
# add our new attributes to the graph
nx.set_node_attributes(our_graph, attrs)
NetworkX图表已经准备完毕可以加载并准备运行了!但是,还需要处理和定义输入数据和标签——即导航路径和目标文章。与前面类似,使用Pandas解析SNAP数据集中已完成的导航路径的制表符分隔值,然后处理每个导航路径以删除返回的点击(由Wikispeedia玩家创建的导航从当前页面返回到之前直接访问的页面),并删除每个路径中的最后一篇文章(我们的目标文章)。为了清洗数据,还删除了超过32个超链接点击长度的导航路径,并将每个导航路径填充为32个长度。
这样得到了超过50000条导航路径连接在4000多篇不同的*文章的已经经过处理的数据集。
WikiNet模型架构
我们的新方法试图将递归神经网络 (RNN) 捕获序列知识的能力与图神经网络 (GNN) 表达图网络结构的能力相结合。以上就是WikiNet——一种 RNN-GNN 混合体。
完整文章:
https://www.overfit.cn/post/8bdf984e46a54ef9a4076d7b82dc6268