2015-03-25 3 views
-1
[Tree('ROOT', [Tree('S', [Tree('INTJ', [Tree('UH', ['Hello'])]), Tree(',', [',']), Tree('NP', [Tree('PRP$', ['My']), Tree('NN', ['name'])]), Tree('VP', [Tree('VBZ', ['is']), Tree('ADJP', [Tree('JJ', ['Melroy'])])]), Tree('.', ['.'])])]), Tree('ROOT', [Tree('SBARQ', [Tree('WHNP', [Tree('WP', ['What'])]), Tree('SQ', [Tree('VBZ', ['is']), Tree('NP', [Tree('PRP$', ['your']), Tree('NN', ['name'])])]), Tree('.', ['?'])])])] 

У меня есть много из этих строк, доступных в Python, которые на самом деле представляют собой представления деревьев. Я хочу извлечь родительский и дочерний узел для каждого слова, например. для 'Hello' Я хочу (INTJ, UH), а для 'My' это (NP, PRP$).Извлечь родительский и дочерний узел из представления дерева питона

Это результат я хочу:

(INTJ, UH) , (NP, PRP$), (NP, NN) , (VP, VBZ) , (VP , VPZ) , (ADJP, JJ) , (WHNP, WP), (SQ, VBZ), (NP, PRP$), (NP, NN) 

Как я могу это сделать?

+1

Ваша структура данных 'sentences', то. Если вы не понимаете, как добраться оттуда до способности использовать решение в своем ответе, вам нужно задать новый вопрос. –

+0

[ссылка] (http://stackoverflow.com/questions/29397460/extract-parent-and-child-node-from-python-tree) задан новый вопрос. Спасибо, что помогли мне @Zero – rombi

+0

@rombi Это хорошо, однако удалите часть нового вопроса отсюда! Благодарю. –

ответ

2

Ваша строка, очевидно, представляет собой список из Tree объектов. Было бы намного лучше, если бы вы имели доступ или могли бы восстановить каким-то другим способом этот список - если нет, самым простым способом создания структуры данных, с которой вы можете работать, является eval() (со всеми usual caveats о вызове eval() на пользователе -пользуемые данные).

Поскольку вы ничего о вашем Tree классе не говорить, что я напишу простой, который достаточно для целей этого вопроса:

class Tree: 

    def __init__(self, name, branches): 
     self.name = name 
     self.branches = branches 

Теперь мы можем воссоздать структуру данных:

data = eval("""[Tree('ROOT', [Tree('S', [Tree('INTJ', [Tree('UH', ['Hello'])]), Tree(',', [',']), Tree('NP', [Tree('PRP$', ['My']), Tree('NN', ['name'])]), Tree('VP', [Tree('VBZ', ['is']), Tree('ADJP', [Tree('JJ', ['Melroy'])])]), Tree('.', ['.'])])]), Tree('ROOT', [Tree('SBARQ', [Tree('WHNP', [Tree('WP', ['What'])]), Tree('SQ', [Tree('VBZ', ['is']), Tree('NP', [Tree('PRP$', ['your']), Tree('NN', ['name'])])]), Tree('.', ['?'])])])]""") 

После того, как мы есть, что мы можем написать функцию, которая производит список 2-кортежей вы хотите:

def tails(items, path=()): 
    for item in items: 
     if isinstance(item, Tree): 
      if item.name in {".", ","}: # ignore punctuation 
       continue 
      for result in tails(item.branches, path + (item.name,)): 
       yield result 
     else: 
      yield path[-2:] 

Эта функция спускается рекурсивно в дерево, получая последние два имени Tree каждый раз, когда он попадает на соответствующий листовой узел.

Пример использования:

>>> list(tails(data)) 
[('INTJ', 'UH'), ('NP', 'PRP$'), ('NP', 'NN'), ('VP', 'VBZ'), ('ADJP', 'JJ'), ('WHNP', 'WP'), ('SQ', 'VBZ'), ('NP', 'PRP$'), ('NP', 'NN')] 
+0

В строке 6 функции хвостов появляется ошибка. Я думаю, что ключевое слово 'from' не требуется. Во-вторых, когда я запускаю код ** print list (tails (data)) **, он дает мне этот '[<хвосты генератора объектов в 0x043CA918>, <хвосты генератора объектов в 0x043CA940>]'. Пожалуйста, помогите мне. – rombi

+0

А, вы используете версию Python менее 3.3. Позвольте мне обновить код ... –

+1

@rombi Я обновил код, чтобы он больше не полагался на конструкцию 'yield from' [введено] (https://docs.python.org/3/whatsnew/3.3.html # pep-380-syntax-for-delegating-to-a-subgenerator) в Python 3.3 - надеюсь, он работает для вас сейчас. –

Смежные вопросы