NLTK Чанкинг и ходьба по дереву результатов - PullRequest
13 голосов
/ 01 октября 2011

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

Ответы [ 3 ]

13 голосов
/ 01 октября 2011

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

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)
0 голосов
/ 15 января 2014

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

for n in range(len(chunked)):
    do_something_with_subtree(chunked[n])
0 голосов
/ 03 августа 2012

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