Как перемещаться по 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" ), глаголу ( "есть" ) и правой части существительного ( "панк-рок-группа на основе Бристоля" ), Как это сделать?
Ответы
Ответ 1
Try:
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)
Ответ 2
Вы могли бы, конечно, написать свою собственную глубину первого поиска... но есть более простой (лучший) способ. Если вы хотите, чтобы каждое поддерево было внедрено в 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))
Ответ 3
Попробуйте следующее:
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'), ('Bristol based', 'JJ'), ('punk', 'NN'), ('rock', 'NN'), ('band', 'NN')]
Ответ 4
здесь пример кода для генерации всех поддеревьев с меткой "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 #a записная книжка с этими методами
http://www.nltk.org/_modules/nltk/tree.html #all api с исходным текстом