首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NLTK会话树到边缘列表

NLTK会话树到边缘列表
EN

Stack Overflow用户
提问于 2019-11-27 12:17:59
回答 1查看 75关注 0票数 1

我有以下字符串:

代码语言:javascript
复制
dt = ' ( NS-elaboration ( EDU 1 )  ( NS-elaboration ( EDU 2 )  ( NS-elaboration ( EDU 3 )  ( EDU 4 )  )  )  ) '

我可以将其转换为NLTK树,如下所示:

代码语言:javascript
复制
from nltk import Tree
t = Tree.fromstring(dt)

此树在此link中进行了说明。

我想要的是这棵树的边列表。类似于下面的内容:

代码语言:javascript
复制
NS-elaboration0    EDU1
NS-elaboration0    NS-elaboration1
NS-elaboration1    EDU2
NS-elaboration1    NS-elaboration2
NS-elaboration2    EDU3
NS-elaboration2    EDU4

其中NS-elaboration后面的数字是树的高度。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-27 19:33:45

我试图为此找到一个内置的,但最终我只是构建了以下算法:

代码:

代码语言:javascript
复制
from nltk import Tree

def get_edges(tree, i):
    from_str = f"{tree.label()}{i}"
    children = [f"{child.label()}{child.leaves()[0]}" for child in tree if isinstance(child, Tree) and child.height() == 2]
    children.extend([f"{child.label()}{i+1}" for child in tree if isinstance(child, Tree) and child.height() > 2])
    return [(from_str, child) for child in children]

def tree_to_edges(tree):
    height = 0
    rv = []
    to_check = [tree]
    while to_check:
        tree_to_check = to_check.pop(0)
        rv.extend(get_edges(tree_to_check, height))
        height += 1
        to_check.extend([child for child in tree_to_check if isinstance(child, Tree) and child.height() > 2])
    return rv

用法:

代码语言:javascript
复制
>>> dt = ' ( NS-elaboration ( EDU 1 )  ( NS-elaboration ( EDU 2 )  ( NS-elaboration ( EDU 3 )  ( EDU 4 )  )  )  ) '
>>> t = Tree.fromstring(dt)
>>> tree_to_edges(t)
[('NS-elaboration0', 'EDU1'),
 ('NS-elaboration0', 'NS-elaboration1'),
 ('NS-elaboration1', 'EDU2'),
 ('NS-elaboration1', 'NS-elaboration2'),
 ('NS-elaboration2', 'EDU3'),
 ('NS-elaboration2', 'EDU4')]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59062943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档