基于列表或字典构建依赖关系图(Python实现)
单词依赖关系图的构建与可视化
需求说明
给定单词关系对列表:
[['rowerowy', 'rower'], ['rowerzysta', 'rower'], ['domeczek', 'domek'], ['domek', 'dom'], ['rowerzystka', 'rowerzysta']]
需要将这些单词合并为依赖组,构建成如下形式的连接图:
rowerowy --> rower <-- rowerzysta <--- rowerzystka domeczek --> domek --> dom
无关联的单词则作为单节点图。
已实现的两种字典方案
第一种:列表存储依赖节点
data = [['rowerowy', 'rower'], ['rowerzysta', 'rower'], ['domeczek', 'domek'], ['domek', 'dom'], ['rowerzystka', 'rowerzysta']] dc = {} for a in data: if a[1] in dc: dc[a[1]].append(a[0]) else: dc[a[1]] = [a[0]]
输出结果:
{'rower': ['rowerowy', 'rowerzysta'], 'domek': ['domeczek'], 'dom': ['domek'], 'rowerzysta': ['rowerzystka']}
第二种:集合存储依赖节点(推荐,支持去重)
def maketree(source): graph = {} for pair in source: nodein, nodeout = pair if nodeout in graph: graph[nodeout].add(nodein) else: graph[nodeout] = {nodein} # 找出根节点(没有被其他节点指向的节点) graph[None] = set(graph.keys()).difference(set.union(*graph.values())) return graph
该方案使用集合存储每个节点的依赖项,自动实现去重,同时通过graph[None]标识出所有根节点(没有被其他节点关联的节点),更适合后续的图遍历与可视化。
图形化展示实现
可以使用Python的networkx库构建图结构,搭配matplotlib进行可视化,步骤如下:
- 安装依赖库(未安装时执行):
pip install networkx matplotlib
- 完整可视化代码:
import networkx as nx import matplotlib.pyplot as plt def maketree(source): graph = {} for pair in source: nodein, nodeout = pair if nodeout in graph: graph[nodeout].add(nodein) else: graph[nodeout] = {nodein} graph[None] = set(graph.keys()).difference(set.union(*graph.values())) return graph # 输入数据 data = [['rowerowy', 'rower'], ['rowerzysta', 'rower'], ['domeczek', 'domek'], ['domek', 'dom'], ['rowerzystka', 'rowerzysta']] # 构建依赖图结构 tree = maketree(data) # 创建有向图 G = nx.DiGraph() # 添加所有节点与边 all_nodes = set(tree.keys()) - {None} for node in all_nodes: G.add_node(node) for dependent in tree[node]: G.add_node(dependent) G.add_edge(dependent, node) # 依赖关系:依赖节点 -> 被依赖节点 # 设置固定布局保证图形稳定 pos = nx.spring_layout(G, seed=42) # 绘制节点、边与标签 nx.draw_networkx_nodes(G, pos, node_size=2000, node_color='lightblue') nx.draw_networkx_edges(G, pos, arrowstyle='->', arrowsize=20) nx.draw_networkx_labels(G, pos, font_size=12, font_weight='bold') # 隐藏坐标轴 plt.axis('off') # 显示图形 plt.show()
运行代码后会生成有向图,直观展示单词间的依赖关系:
rowerowy、rowerzysta指向rower,rowerzystka指向rowerzystadomeczek指向domek,domek指向dom
如果存在无关联的单节点,直接将节点添加到图中即可单独显示。
内容的提问来源于stack exchange,提问作者Pat Tom
相关产品推荐
相关产品推荐

