NLTK Разделение на фрагменты и обход дерева результатов

Я использую NLTK RegexpParser для извлечения групп существительных и групп глаголов из помеченных токенов.

Как мне пройтись по полученному дереву, чтобы найти только фрагменты, которые являются 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) для в/В ткань-/JJ и/CC-клеточная культура/JJ для/IN (NP/DT-препарат/NN) из/IN (NP-имплантаты/NNS) и/CC (NP-имплантат /НН) (В, содержащий /ВБГ) (НП /ДТ носитель/НН)./.)


person Vincent Theeten    schedule 01.10.2011    source источник


Ответы (3)


Это должно работать:

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)
person Savino Sguera    schedule 01.10.2011
comment
Дает мне AttributeError: объект «кортеж» не имеет атрибута «узел» n имеет тип «кортеж» › - person Vincent Theeten; 01.10.2011
comment
Добро пожаловать :) просто к вашему сведению, вы можете принять ответы, если они решили вашу проблему :) meta.stackexchange.com/questions/5234/ - person Savino Sguera; 03.10.2011
comment
node больше не рекомендуется. Вместо этого вы можете использовать label() для определения принадлежности поддерева группы. - person Learner; 09.07.2016

Небольшая ошибка в 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
person Wazy    schedule 03.08.2012

Ответ Савино великолепен, но также стоит отметить, что доступ к поддеревьям можно получить и по индексу, например.

for n in range(len(chunked)):
    do_something_with_subtree(chunked[n])
person TheKevJames    schedule 15.01.2014