Обход парсинга зависимостей в словарях - PullRequest
0 голосов
/ 31 января 2019

Я работаю над анализом зависимостей текстовых данных, и мой алгоритм использует API от http://framenet.icsi.berkeley.edu. Я получаю данные в виде словарей, и значения либо пустые, либо массив словарей, которые снова имеютеще несколько словарей в их значениях.

Этот код - то, что я использовал, чтобы углубиться в словарь на несколько шагов.

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 голосов
/ 31 января 2019

Вот рекурсивная функция для обхода dict и запуска функции на каждом узле (поиск в глубину, как предложено выше в 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...