利⽤递归层次遍历句法结构树(Stanfordcorenlp及nltk)
在⾃然语⾔处理中,处理句法结构树是⽐较常见的处理问题,如何对句法结构树进⾏遍历,以及如何抽取出其中的层次关系,是值得去深究
的。
本⽂将从Stanfordcorenlp的句法结构树和nltk中的Tree的数据结构⼊⼿,进⾏对句法结构树的层次遍历,抽取出句⼦中所包含的句法的层
次结构。
⾸先需要安装Stanfordcorenlp(请⾃⾏CSDN),然后安装nltk(pip⼀下就可以⽤其中的Tree模块了)
例句:公安部治安局局长刘绍武介绍,这次销毁的⾮法枪⽀来源于三个⽅⾯。
句法结构树可以通过nltk中draw()画出来如下图:
(字体有些变形)
通过递归来进⾏对句法结构的遍历,代码简洁,运⾏结果如下:
对照上⾯的结构树可见“->”代表的是层次关系,“->”前是上⼀层的叶节点(这⼀层的根节点),‘->’后是这⼀层的叶节点,然后同层
的叶节点以空格连接,从⽽反应出句法结构的层次关系。
代码如下:
fromstanfordcorenlpimportStanfordCoreNLP
fromnltkimportTree
cen=[]
defcenxun(tree):
c=[]#每⼀层结果的储存
iftype(tree[0])==str:#如果遇到字符,即到达了叶⼦节点,便返回
return
el:
root=[]#储存⼦树,即遍历下⼀层时,每个⼦树的开始都是作为根
r=()#取出当前节点的句法英⽂标注
foriinrange(len(tree)):#遍历这棵树的⼦树,root中储存⼦树,c中保留每棵⼦树根节点的标注
(tree[i])#即这棵树的叶节点的标注,作为⼀层的信息
(tree[i].label())
c="".join(c)#每层的叶⼦节点⽤空格连接
c=r+"->"+c#根节点⽤->连接每层的叶节点
(c)#将每次遍历的结果存cen中
forrtinroot:#遍历得到的⼦树,将每个⼦树作为新的⼀棵树进⾏遍历
cenxun(rt)#递归调⽤就可以
return
defmain():
lang="zh"
nlp=StanfordCoreNLP(r'E:stanford-corenlp-4.2.2',lang=lang)
try:
ntence="公安部治安局局长刘绍武介绍,这次销毁的⾮法枪⽀来源于三个⽅⾯。"
par=(ntence)
t=ring(par)
cenxun(t[0])
()#展⽰句法结构树
except:
print("meeterror")
()
print("n".join(cen))
if__name__=='__main__':
main()
``
本文发布于:2022-11-24 18:06:55,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/13390.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |