<aside> <img src="/icons/condense_yellow.svg" alt="/icons/condense_yellow.svg" width="40px" /> Python | 图 | 算法 | 社群 | 关系谱 | 图神经 | C++ | 通信 | 引文 | 道路 | 社评 | 电商 | 行为 | 模型 | 角色 | 图嵌入 | 全局结构 | 编码解码 | 半监督学习 | 富文本 | 表征 | 法律文本 | 语义

</aside>

📜用例

📜Python社群纽带关系谱和图神经 | 📜C++和Python通信引文道路社评电商大规模行为图结构数据模型 | 📜角色图嵌入学习 | 📜图全局结构信息学习 | 📜图编码解码半监督学习 | 📜富文本表征学习 | 📜法律文本内容语义学习

✒️Python提取图节点嵌入信息

图可以定义为 G = (V, E),其中 V 是一组节点,E 是一组边。 边是两个节点之间的连接,例如节点A和D有一条边。 另外,重要的是要注意图可以是有向图或无向图。 例如,下面的图是无向的,因为 A 与 D 连接,D 与 A 连接。还有一件事,图可以获取不同的节点属性以及边属性,但就我们的目的而言,今天并不重要。


flowchart LR
B((B))---A((A))---D((D))---C((C)) & E((E))

现在我们或多或少知道了图是什么,我们可以尝试从图中提取节点嵌入。

假设您需要解决如下场景:

对于所有提到的任务,我们需要有节点的表示。因此,如果我们需要运行机器学习算法,我们需要将图结构转换为向量空间。

方法一:

随机游走是一种将图转换为节点序列以训练此模型的方法。 基本上,对于图中的每个节点,模型都会生成连接节点的随机路径。 一旦我们有了这些节点的随机路径,它就会训练此模型来获得节点嵌入。

出于学习目的,请在下面找到该算法的实现,请注意该代码尚未准备好用于大规模应用,可以进行一些并行化和内存改进。

 import networkx as nx
 import random
 import numpy as np
 from typing import List
 from tqdm import tqdm
 
 
 class DWk:
     def __init__(self, window_size: int, embedding_size: int, walk_length: int, walks_per_node: int):
         self.window_size = window_size
         self.embedding_size = embedding_size
         self.walk_length = walk_length
         self.walk_per_node = walks_per_node
 
     def random_walk(self, g: nx.Graph, start: str, use_probabilities: bool = False) -> List[str]:

         walk = [start]
         for i in range(self.walk_length):
             neighbours = g.neighbors(walk[i])
             neighs = list(neighbours)
             if use_probabilities:
                 probabilities = [g.get_edge_data(walk[i], neig)["weight"] for neig in neighs]
                 sum_probabilities = sum(probabilities)
                 probabilities = list(map(lambda t: t / sum_probabilities, probabilities))
                 p = np.random.choice(neighs, p=probabilities)
             else:
                 p = random.choice(neighs)
             walk.append(p)
         return walk
 
     def get_walks(self, g: nx.Graph, use_probabilities: bool = False) -> List[List[str]]:

         random_walks = []
         for _ in range(self.walk_per_node):
             random_nodes = list(g.nodes)
             random.shuffle(random_nodes)
             for node in tqdm(random_nodes):
                 random_walks.append(self.random_walk(g=g, start=node, use_probabilities=use_probabilities))
         return random_walks
 
     def compute_embeddings(self, walks: List[List[str]]):

         model = Word2Vec(sentences=walks, window=self.window_size, vector_size=self.embedding_size)
         return model.wv
 

方法二:

该算法使用深度优先搜索和广度优先搜索算法的组合来提取随机游走。 这种算法组合由两个参数 P(返回参数)和 Q(输入输出参数)控制。

基本上,如果 P 很大,随机游走也会很大,所以它会进行探索,如果 P 很小,我们会停留在本地。 Q 也会发生类似但相反的行为,如果 Q 很小,它将进行探索,如果 Q 很大,它将停留在本地。

我们可以使用 PyTorch 几何测试算法。 该库实现了一系列图神经网络架构和方法来加速 GNN 的工作。 为了测试它,我将使用 Pytorch 几何上提出的教程的一小部分。 为此,他们使用 Cora 数据集。 Cora 数据集包含 2708 份科学出版物,分为七类。 引文网络由 5429 个链接组成。 数据集中的每个出版物都由 0/1 值词向量描述,指示词典中相应词的不存在/存在。该词典由 1433 个独特单词组成。