Skip to main content
 首页 » 编程设计

python之允许 Networkx 中的重复节点/防止节点在 TreeMap 中有两个父节点

2024年08月14日36lidabo

我正在尝试将选区解析树表示为 networkx DiGraph。我有一个二进制元组列表,显示节点之间的边缘:

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

到目前为止,我已经设法将其表示为:Here's what I have

使用以下命令:

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

但是,networkx 删除了重复的节点,这产生了不良影响。 我想成为这样的人: This

即我如何通过允许两个副本来防止节点 NP 有两个父节点?

请您参考如下方法:

图表中的节点标识符是字符串(例如,“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() 

结果是: