Разрешение повторяющихся узлов в Networkx / Предотвращение наличия у узла двух родителей в графе дерева - PullRequest
0 голосов
/ 01 января 2019

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

[('S', 'NP'), ('S', 'VP'), ('NP', "'I'"), ('VP', 'V'), ('VP', 'NP'), ('V', "'saw'"), ('NP', "'him'")]

До сих пор мне удалось представить это как: Вот что у меня есть

с помощью следующих команд:

tree2graph = nx.DiGraph()
tree2graph.add_edges_from(parsed_tree)
p= nx.drawing.nx_pydot.to_pydot(tree2graph)

Однако networkx удаляет дублирующиеся узлы, и это оказало нежелательный эффект.Я хотел бы быть похожим на: Это

т.е. как бы я запретил узлу NP иметь двух родителей, разрешив две копии?

1 Ответ

0 голосов
/ 02 января 2019

Идентификаторы узла на вашем графике - это строки (например, «NP»).Поскольку у вас не может быть двух разных узлов с одним и тем же идентификатором, разные экземпляры одной и той же строки сталкиваются.Вы можете решить эту проблему, разделив идентификатор узла и строку узла.Сохраните уникальное целое число, чтобы идентифицировать каждый узел, и сопоставьте его с соответствующей строкой.Например:

import networkx as nx
import matplotlib.pyplot as plt

parsed_tree = [(0,1), (0,2), (1,3), (2,4), (2,5), (4,6), (5,7)]
id_to_str = {0: 'S', 1: 'NP', 2: 'VP', 3: 'I', 4: 'V', 5: 'NP', 6: "'saw'", 7: "'him'"}

tree2graph = nx.DiGraph()
tree2graph.add_edges_from(parsed_tree)
for node in tree2graph.nodes():
    tree2graph.nodes[node]['label'] = id_to_str[node]
pos = nx.nx_pydot.pydot_layout(tree2graph, prog='dot')
nx.draw_networkx(tree2graph, pos=pos, arrows= True, with_labels=True, labels=id_to_str)
plt.show()

Это приводит к:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...