Ответ 1
Это должно работать:
for n in chunked:
if isinstance(n, nltk.tree.Tree):
if n.label() == 'NP':
do_something_with_subtree(n)
else:
do_something_with_leaf(n)
Я использую NLTK RegexpParser для извлечения noungroups и verbgroups из помеченных токенов.
Как мне пройти полученное дерево, чтобы найти только куски, которые представляют собой группы NP или V?
from nltk.chunk import RegexpParser
grammar = '''
NP: {<DT>?<JJ>*<NN>*}
V: {<V.*>}'''
chunker = RegexpParser(grammar)
token = [] ## Some tokens from my POS tagger
chunked = chunker.parse(tokens)
print chunked
#How do I walk the tree?
#for chunk in chunked:
# if chunk.??? == 'NP':
# print chunk
(S (NP Carrier/NN) для /IN ткане/JJ и /CC клеточная культура /JJ для/IN (NP/подготовка/NN) из в (NP-имплантаты/NNS) и /CC (NP имплантат /NN ) (V, содержащий /VBG ) (NP/несущая/NN)./.)
Это должно работать:
for n in chunked:
if isinstance(n, nltk.tree.Tree):
if n.label() == 'NP':
do_something_with_subtree(n)
else:
do_something_with_leaf(n)
Небольшая ошибка в token
from nltk.chunk import RegexpParser
grammar = '''
NP: {<DT>?<JJ>*<NN>*}
V: {<V.*>}'''
chunker = RegexpParser(grammar)
token = [] ## Some tokens from my POS tagger
//chunked = chunker.parse(tokens) // token defined in the previous line but used tokens in chunker.parse(tokens)
chunked = chunker.parse(token) // Change in this line
print chunked
Ответ Savino велик, но также стоит отметить, что поддеревья также доступны по индексу, например,
for n in range(len(chunked)):
do_something_with_subtree(chunked[n])