如何不使用nltk.tree打印给定结构的句子语法树
实现方案
实现思路
- 首先将输入的语法树节点列表转换为统一的节点查找字典,可通过父节点名快速查询对应子节点列表
- 采用深度优先递归遍历节点,每深入一层缩进量增加固定长度,子节点前使用树形符号标识层级关系
- 遇到叶子节点(子节点为
#)时停止向下递归
完整代码
# 输入的语法树原始数据 tree_data = [{'ROOT': ['S']}, {'S': ['VPS']}, {'VPS': ['N', 'VP']}, {'N': ['#']}, {'VP': ['PP', 'MV']}, {'PP': ['PREP_EZ', 'N']}, {'PREP_EZ': ['#']}, {'N': ['#']}, {'MV': ['N', 'V']}, {'N': ['#']}, {'V': ['#']}] # 转换为节点查找字典 node_map = {} for item in tree_data: for parent, children in item.items(): node_map[parent] = children # 递归打印树形结构的函数 def print_tree(node, indent=0, is_last=False): # 打印当前节点的前缀和节点名 prefix = "└── " if is_last else "├── " print(" " * (indent-1) + prefix + node if indent > 0 else node) # 不是叶子节点则继续递归打印子节点 children = node_map.get(node, []) if children == ['#']: return for i, child in enumerate(children): print_tree(child, indent + 1, i == len(children)-1) # 从根节点开始打印 print_tree('ROOT')
运行输出效果
ROOT └── S └── VPS ├── N └── VP ├── PP │ ├── PREP_EZ │ └── N └── MV ├── N └── V
内容的提问来源于stack exchange,提问作者user3633858
相关产品推荐
相关产品推荐

