在自然语言处理中,处理句法结构树是比较常见的处理问题,如何对句法结构树进行遍历,以及如何抽取出其中的层次关系,是值得去深究的。
本文将从Stanfordcorenlp的句法结构树和nltk中的Tree的数据结构入手,进行对句法结构树的层次遍历,抽取出句子中所包含的句法的层次结构。
首先需要安装Stanfordcorenlp(请自行CSDN),然后安装nltk(pip一下就可以用其中的Tree模块了)

例句:公安部治安局局长刘绍武介绍,这次销毁的非法枪支来源于三个方面。

句法结构树可以通过nltk中draw()画出来如下图:

(字体有些变形)

通过递归来进行对句法结构的遍历,代码简洁,运行结果如下:

对照上面的结构树可见 “->”代表的是层次关系,“->”前是上一层的叶节点(这一层的根节点),‘->’后是这一层的叶节点,然后同层的叶节点以空格连接,从而反应出句法结构的层次关系。

代码如下:

from stanfordcorenlp import StanfordCoreNLP
from nltk import Treecen = []
def cenxun(tree):c = []  # 每一层结果的储存if type(tree[0]) == str:  # 如果遇到字符,即到达了叶子节点,便返回returnelse:root = []  # 储存子树,即遍历下一层时,每个子树的开始都是作为根r = tree.label()  # 取出当前节点的句法英文标注for i in range(len(tree)):  # 遍历这棵树的子树,root中储存子树,c中保留每棵子树根节点的标注root.append(tree[i])    # 即这棵树的叶节点的标注,作为一层的信息c.append(tree[i].label())c = " ".join(c)  # 每层的叶子节点用空格连接c = r + "->" + c  # 根节点用->连接每层的叶节点cen.append(c)  # 将每次遍历的结果存cen中for rt in root:  # 遍历得到的子树,将每个子树作为新的一棵树进行遍历cenxun(rt)  # 递归调用就可以returndef main():lang = "zh"nlp = StanfordCoreNLP(r'E:\stanford-corenlp-4.2.2', lang=lang)try:sentence = "公安部治安局局长刘绍武介绍,这次销毁的非法枪支来源于三个方面。"parse = nlp.parse(sentence)t = Tree.fromstring(parse)cenxun(t[0])t.draw()  # 展示句法结构树except:print("meet error")nlp.close()print("\n".join(cen))if __name__ == '__main__':main()
``

利用递归层次遍历句法结构树(Stanfordcorenlp及nltk)相关推荐

  1. 查找树的指定层级_非递归层次遍历方法实现二叉树中指定节点的层次数查找

    数据结构教材中,提供了基于队列实现一个二叉树的非递归层次遍历算法.但对于一个任意二叉树,如果要查找其中任何一个节点所在的层次数,教科书中并没有给出基于层次遍历的非递归算法.鉴于层次遍历算法比较容易理解 ...

  2. java实现递归层次遍历_Java实现二叉树的前序、中序、后序、层序遍历(递归方法)...

    在数据结构中,二叉树是树中我们见得最多的,二叉查找树可以加速我们查找的效率,那么输出一个二叉树也变得尤为重要了. 二叉树的遍历方法分为四种,分别为前序遍历.中序遍历.后序.层序遍历.下图即为一个二叉树 ...

  3. 二叉树的三种遍历(递归与非递归) + 层次遍历

    <转载于  >>> > 二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的.二叉树有前.中.后三种遍历方式,因为树的本身就是用递归定义的,因此 ...

  4. C++ 实现二叉树的非递归层次遍历(队列实现)

    代码如下: void BinaryTree::LevelOrder(BinTreeNode *cur) {if (cur == NULL)return ;queue<BinTreeNode *& ...

  5. 二叉树(前中后序递归非递归遍历,层次遍历

    #ifndef _BITREE_H  #define   _BITREE_H  #include "Stack.h" #include "Queue.h" te ...

  6. 数据结构(三)打印二叉树中结点层次遍历序列的实现

    1.实验目的: 掌握二叉树的结构特性以及二叉链表的存储结构的特点及适用范围.同时,掌握用指针类型描述.访问和处理二叉树的运算. 2.试验问题: 建立一棵二叉树,按层次遍历该二叉树,并显示出这棵二叉树. ...

  7. java 递归深度优先遍历_Java基础 - 二叉树的遍历之深度优先遍历(递归遍历)

    package com.yc.test; import java.util.ArrayList; import java.util.List; import com.yc.tree.ThreeLink ...

  8. 树的先序、中序、后序和层次遍历的C++递归实现

    树的遍历及遍历规则: 先序遍历:根左右 (即先访问根节点,在访问左儿子,最后访问右儿子) 中序遍历:左根右 后序遍历:左右根 层次遍历:按树的深度从小到大一层一层遍历 C++实现(递归): #incl ...

  9. (伪代码)树的前中后遍历和层次遍历算法实现(考研适用,递归和非递归)

    文章目录 前言 一.递归实现树的遍历 二.非递归实现 层次遍历 总结 前言 2022考研初试结束,总结了一些考研中基本常用算法.这篇主要是关于树的前中后遍历,递归实现和非递归实现两种,现在很多自命题在 ...

  10. UVA122 树的层次遍历 Trees on the level(两种方法详解)

    UVA122 树的层次遍历 Trees on the level 输入: (11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ...

最新文章

  1. 宝塔Linux常用命令
  2. 使用Nginx为Leanote配置Https
  3. Google Container Engine进军生产环境,容器技术势不可挡
  4. python将字符串中的数字相加求和的实现
  5. html表格判断,lua table 长度解析
  6. Java程序员从笨鸟到菜鸟之(十)枚举,泛型详解
  7. WSL2——Linux C中进程相关操作编程问题
  8. Git版本回退之 reset 和 revert
  9. 分布式缓存技术memcached学习系列(五)—— memcached java客户端的使用
  10. Trace文件过量生成问题解决
  11. 乐高百变工程旋转飞椅知识点_每日一个知识点:关于磁盘的一些事儿
  12. Java数据类型及类型转换
  13. H5商城与小程序商城哪个好_应该怎么选择_OctShop
  14. 玩客云pc端_玩客云下载-玩客云电脑版下载-华军软件园
  15. 电气绘图软件课程设计
  16. [Java学习] BFS算法示例
  17. halcon中面到面的距离_halcon学习网
  18. 《VSTO开发入门教程》配套资源下载
  19. 虹软人脸识别SDK离线激活(RV1109开发板)
  20. springcloud在 repository层通过sql语句实现查询功能

热门文章

  1. 虚拟光驱传文件到服务器,虚拟光驱服务器
  2. 虚拟主机安装php,php网站怎么安装到虚拟主机
  3. HTML5 页面布局【结合案例】
  4. Java毕设项目直播购物平台(java+VUE+Mybatis+Maven+Mysql)
  5. iphone6 计算机无法检测到照相机,爱思助手无法识别设备怎么办 爱思助手无法识别设备解决方法...
  6. 有哪些管理类书籍值得推荐?
  7. 考虑一个包含n个元素的普通二叉最小堆数据结构,它支持最坏情况时间代价为O(lgn)的操作INSERT和EXTRACT-MIN。请给出一个势函数Φ,使得INSERT的平摊代价为O(lgn),EXTRAC
  8. windows系统下更改itunes默认备份地址(小白实操)
  9. IT男不得不看的影视剧---《数字追凶》
  10. 【Word】编号与文字间距过大