我正在研究文本数据的依赖关系解析,我的算法使用的是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
答案 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)
在数据结构上调用它。