Как пройти объект дерева NLTK?
С учетом разбора в скобках я мог бы преобразовать его в объект Tree в NLTK следующим образом:
>>> from nltk.tree import Tree
>>> s = '(ROOT (S (NP (NNP Europe)) (VP (VBZ is) (PP (IN in) (NP (DT the) (JJ same) (NNS trends)))) (. .)))'
>>> Tree.fromstring(s)
Tree('ROOT', [Tree('S', [Tree('NP', [Tree('NNP', ['Europe'])]), Tree('VP', [Tree('VBZ', ['is']), Tree('PP', [Tree('IN', ['in']), Tree('NP', [Tree('DT', ['the']), Tree('JJ', ['same']), Tree('NNS', ['trends'])])])]), Tree('.', ['.'])])])
Но когда я пытаюсь пройти через него, я могу получить доступ только к самому верхнему дереву:
>>> for i in Tree.fromstring(s):
... print i
...
(S
(NP (NNP Europe))
(VP (VBZ is) (PP (IN in) (NP (DT the) (JJ same) (NNS trends))))
(. .))
>>> for i in Tree.fromstring(s):
... print i, i.label()
...
(S
(NP (NNP Europe))
(VP (VBZ is) (PP (IN in) (NP (DT the) (JJ same) (NNS trends))))
(. .)) S
>>>
Я мог бы углубиться на один уровень следующим образом:
>>> for i in Tree.fromstring(s):
... print i.subtrees()
...
<generator object subtrees at 0x7f1eb1571410>
>>> for i in Tree.fromstring(s):
... for j in i.subtrees():
... print j
...
(S
(NP (NNP Europe))
(VP (VBZ is) (PP (IN in) (NP (DT the) (JJ same) (NNS trends))))
(. .))
(NP (NNP Europe))
(NNP Europe)
(VP (VBZ is) (PP (IN in) (NP (DT the) (JJ same) (NNS trends))))
(VBZ is)
(PP (IN in) (NP (DT the) (JJ same) (NNS trends)))
(IN in)
(NP (DT the) (JJ same) (NNS trends))
(DT the)
(JJ same)
(NNS trends)
(. .)
Но есть ли способ пройти через все поддеревья в глубину?
Как пройти по дереву в НЛТК?
Как пройти все поддеревья в NLTK?
1 ответ
Решение
Может быть, я упускаю из виду вещи, но это то, что вы после?
import nltk
s = '(ROOT (S (NP (NNP Europe)) (VP (VBZ is) (PP (IN in) (NP (DT the) (JJ same) (NNS trends)))) (. .)))'
tree = nltk.tree.Tree.fromstring(s)
def traverse_tree(tree):
# print("tree:", tree)
for subtree in tree:
if type(subtree) == nltk.tree.Tree:
traverse_tree(subtree)
traverse_tree(tree)
Он пересекает ваше дерево в первую очередь.