Встраивание Knowledegraph в пользовательский набор данных с помощью GraphSAGE или (V)GAE в Torch Geometric ⇐ Python

Программы на Python
Anonymous
Встраивание Knowledegraph в пользовательский набор данных с помощью GraphSAGE или (V)GAE в Torch Geometric

Сообщение Anonymous »

В настоящее время я работаю над созданием встраивания из моего собственного графа знаний. Это встраивание будет использоваться для идентификации аналогичных активов данных на основе их структуры. Node2Vec и RandomWalk работают хорошо, но я также хочу изучить другие подходы, такие как GraphSAGE или GraphAutoencoder, чтобы увидеть если они работают лучше, хуже или сопоставимо.
Я следовал официальным руководствам по реализации этих подходов, но столкнулся с различными проблемами. Одной из основных проблем является перенос графика NetworkX в набор данных Torch Geometric. Кроме того, мне не нужно прогнозировать класс «y» или добавлять недостающие ребра; Я просто хочу создать встраивание из графа знаний, в котором аналогичные ресурсы данных будут расположены близко друг к другу.
Я также был бы очень признателен за любые советы о том, как лучше всего построить граф знаний из набора данных. в качестве конкретных примеров кода для создания набора данных Torch или реализации GraphSAGE на основе этой основы.
Вот исходная ситуация:
Я использую самостоятельно сгенерированный набор данных, описывающий различные наборы данных на Kaggle — пример можно посмотреть здесь.
Из этого были извлечены различные объекты и ребра набор данных с использованием GLiNER. Ссылкой всегда является имя набора данных. Вы можете найти отрывок здесь
Это основа для создания ноулеграфа. Я создал KG со следующим кодом:

Код: Выделить всё

# Function for edges
def increment_edge_weight(G, u, v):
if G.has_edge(u, v):
G[u][v]['weight'] += 1
else:
# Füge die Kante hinzu, falls sie noch nicht existiert, mit Gewicht 1
G.add_edge(u, v, weight=1)

# Create Graph
G = nx.Graph()
## Add Nodes
for node in nodes:
if not G.has_node(node[0]):
G.add_node(
node[0].lower(),
type="entity"
)
if not G.has_node(node[1]):
G.add_node(
node[1].lower(),
type="label"
)
if not G.has_node(node[2]):
G.add_node(
node[2].lower(),
type="dataset"
)
# Add tuple edges
increment_edge_weight(G, node[0].lower(), node[1].lower())
increment_edge_weight(G, node[1].lower(), node[2].lower())
increment_edge_weight(G, node[0].lower(), node[2].lower())

#####
print(f"Number of nodes: {G.number_of_nodes()}")
print(f"Number of edges: {G.number_of_edges()}")
Мой подход к созданию набора данных torch_geometric следующий:

Код: Выделить всё

# Schritt 1: Erstelle ein Mapping für 'id' (String zu Integer)
id_mapping = {id_str: i for i, id_str in enumerate([x[0] for x in list(G.nodes(data=True))])}

# Schritt 2: Erstelle ein Mapping für 'group' (String zu Integer)
group_mapping = {group_str: i for i, group_str in enumerate([x[1]['type'] for x in list(G.nodes(data=True))])}

from torch_geometric.utils.convert import from_networkx
from torch_geometric.nn import Node2Vec

# NetworkX in PyTorch Geometric Graph umwandeln
data = from_networkx(G)

# Konvertiere 'id' als Feature (data.x)
# data.x = torch.tensor([id_mapping[G.nodes[node]['id']] for node in G.nodes], dtype=torch.long).unsqueeze(1)
data.x = torch.tensor([id_mapping[node] for node in G.nodes], dtype=torch.long).unsqueeze(1)

# Konvertiere 'group' als Label (data.y)
# data.y = torch.tensor([group_mapping[G.nodes[node]['type']] for node in G.nodes(data=True)], dtype=torch.long)
data.y = torch.tensor([group_mapping[node[1]['type']] for node in G.nodes(data=True)], dtype=torch.long)

# Train- und Validation-Masken erstellen (z.B. 80% Train, 20% Validation)
train_mask = torch.zeros(data.num_nodes, dtype=torch.bool)
val_mask = torch.zeros(data.num_nodes, dtype=torch.bool)

train_indices = torch.randperm(data.num_nodes)[:int(0.8 * data.num_nodes)]
val_indices = torch.randperm(data.num_nodes)[int(0.8 * data.num_nodes):]

train_mask[train_indices] = True
val_mask[val_indices] = True

data.train_mask = train_mask
data.val_mask = val_mask
Это основа для создания графа знаний. Я создал KG со следующим кодом:
Мой подход к созданию набора данных torch_geometric следующий.
На основе этого есть какие-либо предложения или идеи о том, как лучше всего использовать такой график в GraphSAGE, GAE или других подходах? Поскольку у меня нет оснований, описанных выше, я сосредоточился на неконтролируемых методах.
Я благодарен за любую помощь!

Подробнее здесь: https://stackoverflow.com/questions/790 ... -torch-geo

Вернуться в «Python»