Создание вложений с использованием node2vec

#python #graph #nodes #networkx #word2vec

#python #График #узлы #networkx #word2vec

Вопрос:

Я пытаюсь создать вложения для списка границ, который у меня есть, используя networkx и node2vec. Мой список ребер выглядит следующим образом:

 1 2
1 6
...
450 230
...
601 602 
  

По сути, это невзвешенный неориентированный граф, который хранится в текстовом файле. Я пытаюсь преобразовать это в график, используя следующее:

 nx_G = nx.read_edgelist(args.input, delimiter=' ', create_using=nx.DiGraph())
G = node2vec.Graph(nx_G, args.directed, args.p, args.q, args.seed)
G.preprocess_transition_probs()
walks = G.simulate_walks(args.num_walks, args.walk_length)
walks = [str(walk) for walk in walks]
model = Word2Vec(walks, size=args.dimensions, window=args.window_size, min_count=0, sg=1, workers=args.workers, iter=args.iter)
model.wv.save_word2vec_format(args.output)
  

где args.input предоставляет текстовый файл. Функции read_edgelist правильно считывают узлы, и вложения создаются. Однако в файле вложений узлы не пронумерованы от 1 до 606 (это значения узлов в моем списке edge): вместо этого их 14, с цифрами от 0 до 9 и некоторыми специальными символами в качестве значений узлов, для которых были созданы вложения. То есть, вместо того, чтобы считывать целое число, состоящее более чем из одной цифры (скажем, 29), как отдельный узел, он просто считывает 2 и вычисляет для него вложения. Я не понимаю, почему это происходит, и был бы признателен за некоторое понимание.

Ответ №1:

Я решил это, закомментировав следующую строку кода в main.py файл репозитория node2vec:

 walks = [map(str, walk) for walk in walks]
  

Ответ №2:

Я предлагаю вам библиотеку stellargraph, которая предоставляет отличные графовые алгоритмы для машинного обучения. Например, базовый Node2Vec…

 from stellargraph.data import BiasedRandomWalk
from stellargraph import StellarGraph
from gensim.models import Word2Vec

rw = BiasedRandomWalk(StellarGraph(g_nx))

walks = rw.run(
      nodes=list(g_nx.nodes()), # root nodes
      length=100,  # maximum length of a random walk
      n=10,        # number of random walks per root node 
      p=0.5,       # Defines (unormalised) probability, 1/p, of returning to source node
      q=2.0        # Defines (unormalised) probability, 1/q, for moving away from source node
)

model = Word2Vec(walks, size=128, window=5, min_count=0, sg=1, workers=2, iter=1)

model.wv['29']