Как перемещаться по nltk.tree.Tree?
Я разделил предложение на несколько частей:
grammar = '''
NP:
{<DT>*(<NN.*>|<JJ.*>)*<NN.*>}
NVN:
{<NP><VB.*><NP>}
'''
chunker = nltk.chunk.RegexpParser(grammar)
tree = chunker.parse(tagged)
print tree
Результат выглядит так:
(S
(NVN
(NP The_Pigs/NNS)
are/VBP
(NP a/DT Bristol-based/JJ punk/NN rock/NN band/NN))
that/WDT
formed/VBN
in/IN
1977/CD
./.)
Но сейчас я застрял, пытаясь понять, как с этим справиться. Я хочу найти поддерево NVN и получить доступ к левой именной фразе ("The_Pigs"), глаголу ("are") и существительной фразе с правой стороны ("панк-рок-группа из Бристоля"), Как я могу это сделать?
4 ответа
Пытаться:
ROOT = 'ROOT'
tree = ...
def getNodes(parent):
for node in parent:
if type(node) is nltk.Tree:
if node.label() == ROOT:
print "======== Sentence ========="
print "Sentence:", " ".join(node.leaves())
else:
print "Label:", node.label()
print "Leaves:", node.leaves()
getNodes(node)
else:
print "Word:", node
getNodes(tree)
Конечно, вы могли бы написать свой собственный поиск в глубину... но есть более простой (лучший) способ. Если вы хотите, чтобы каждое поддерево укоренилось в NVM, используйте метод поддерева дерева с определенным параметром фильтра.
>>> print t
(S
(NVN
(NP The_Pigs/NNS)
are/VBP
(NP a/DT Bristol-based/JJ punk/NN rock/NN band/NN))
that/WDT
formed/VBN
in/IN
1977/CD
./.)
>>> for i in t.subtrees(filter=lambda x: x.node == 'NVN'):
... print i
...
(NVN
(NP The_Pigs/NNS)
are/VBP
(NP a/DT Bristol-based/JJ punk/NN rock/NN band/NN))
Вот пример кода для генерации всех поддеревьев с меткой "NP"
def filt(x):
return x.label()=='NP'
for subtree in t.subtrees(filter = filt): # Generate all subtrees
print subtree
для братьев и сестер, вы можете взглянуть на метод ParentedTree.left_siblings()
для более подробной информации, вот несколько полезных ссылок.
http://www.nltk.org/howto/tree.html некоторые базовые примеры использования и пример http://nbviewer.ipython.org/github/gmonce/nltk_parsing/blob/master/1.%20NLTK%20Syntax%20Trees.ipynb ноутбук с этими методами
http://www.nltk.org/_modules/nltk/tree.html # все API с источником
Попробуй это:
for a in tree:
if type(a) is nltk.Tree:
if a.node == 'NVN': # This climbs into your NVN tree
for b in a:
if type(b) is nltk.Tree and b.node == 'NP':
print b.leaves() # This outputs your "NP"
else:
print b # This outputs your "VB.*"
Это выводит это:
[('The_Pigs', 'NNS')]
('are', 'VBP')
[('a', 'DT'), ('на основе Бристоля', 'JJ'), ('punk', 'NN'), ('rock', 'NN'), ('band', 'NN ")]