遍历字典中的依赖项解析

时间:2019-01-31 09:14:40

标签: python python-3.x parsing dictionary

我正在研究文本数据的依赖关系解析,我的算法使用的是http://framenet.icsi.berkeley.edu中的api。 我正在以字典的形式接收数据,值要么为空,要么为字典数组,它们的值再次包含更多字典。

这段代码是我过去在字典中更深入的步骤。

keylist = parsed_tree.keys()
vallist = parsed_tree.values()
print(keylist)
print(vallist)
print("----------")
for k in vallist:
    for m in k:
        for l in m:
           print(l)
           print(m.values())
           print("/")
dict_keys([(3, 'ROOT', 'S')])
dict_values([[{(1, 'det', 'L'): []}, {(2, 'compound', 'L'): []}, {(6, 'nmod', 'R'): [{(4, 'case', 'L'): []}, {(5, 'det', 'L'): []}, {(9, 'nmod', 'R'): [{(7, 'case', 'L'): []}, {(8, 'amod', 'L'): []}, {(11, 'dep', 'R'): [{(10, 'det', 'L'): []}, {(13, 'nmod', 'R'): [{(12, 'case', 'L'): []}, {(14, 'cc', 'R'): []}, {(15, 'conj', 'R'): []}]}]}]}]}, {(16, 'punct', 'R'): []}]])

----------
(1, 'det', 'L')
dict_values([[]])
/
(2, 'compound', 'L')
dict_values([[]])
/
(6, 'nmod', 'R')
dict_values([[{(4, 'case', 'L'): []}, {(5, 'det', 'L'): []}, {(9, 'nmod', 'R'): [{(7, 'case', 'L'): []}, {(8, 'amod', 'L'): []}, {(11, 'dep', 'R'): [{(10, 'det', 'L'): []}, {(13, 'nmod', 'R'): [{(12, 'case', 'L'): []}, {(14, 'cc', 'R'): []}, {(15, 'conj', 'R'): []}]}]}]}]])
/
(16, 'punct', 'R')
dict_values([[]])
/

查看:(6,'nmod','R') 其值是更多的字典。我该如何编写一个通用函数来在字典及其值的最深处进行修剪?

  

编辑:因此,从这里的答案中,我可以获得该树的所有节点,但是在元组中,我们需要为所有节点添加根节点。

我们是从https://stackoverflow.com/a/54457756/10398679那里得到的:

(3, 'ROOT', 'S')
(1, 'det', 'L')
(2, 'compound', 'L')
(6, 'nmod', 'R')
(4, 'case', 'L')
(5, 'det', 'L')
(9, 'nmod', 'R')
(7, 'case', 'L')
(8, 'amod', 'L')
(11, 'dep', 'R')
(10, 'det', 'L')
(13, 'nmod', 'R')
(12, 'case', 'L')
(14, 'cc', 'R')
(15, 'conj', 'R')
(16, 'punct', 'R')

因此新的元组应如下所示:

(1, 'det', 'L', 3)
# In this tuple, 3 is the root node

1 个答案:

答案 0 :(得分:1)

这是一个递归函数,用于遍历字典并在每个节点上运行一个函数(深度优先搜索,如上面的KGS所述)。

def handle_tree(tree):
    for node in tree:
        handle_node(node)

        for child in tree[node]:
            handle_tree(child)


def handle_node(node):
    # Add some code here to do what you want with the node.
    print(node)

您可以使用handle_tree(parsed_tree)在数据结构上调用它。