Ознакомьтесь с инструментарием естественного языка (NLTK) по адресу nltk.org .
Инструментарий написан на Python и предоставляет код для чтения именно этих видов деревьев (а также множества других вещей).
В качестве альтернативы, вы можете написать собственную рекурсивную функцию для этого. Это было бы довольно просто.
Просто для удовольствия: вот супер простая реализация того, что вы хотите:
def parse():
itr = iter(filter(lambda x: x, re.split("\\s+", s.replace('(', ' ( ').replace(')', ' ) '))))
def _parse():
stuff = []
for x in itr:
if x == ')':
return stuff
elif x == '(':
stuff.append(_parse())
else:
stuff.append(x)
return stuff
return _parse()[0]
def find(parsed, tag):
if parsed[0] == tag:
yield parsed
for x in parsed[1:]:
for y in find(x, tag):
yield y
p = parse()
np = find(p, 'NP')
for x in np:
print x
Выходы:
['NP', ['NP', ['DT', 'The'], ['JJS', 'strongest'], ['NN', 'rain']], ['VP', ['ADVP', ['RB', 'ever']], ['VBN', 'recorded'], ['PP', ['IN', 'in'], ['NP', ['NNP', 'India']]]]]
['NP', ['DT', 'The'], ['JJS', 'strongest'], ['NN', 'rain']]
['NP', ['NNP', 'India']]
['NP', ['NP', ['DT', 'the'], ['JJ', 'financial'], ['NN', 'hub']], ['PP', ['IN', 'of' ['NP', ['NNP', 'Mumbai']]]]
['NP', ['DT', 'the'], ['JJ', 'financial'], ['NN', 'hub']]
['NP', ['NNP', 'Mumbai']]
['NP', ['NN', 'communication'], ['NNS', 'lines']]
['NP', ['NNS', 'airports']]
['NP', ['NP', ['NNS', 'thousands']], ['PP', ['IN', 'of'], ['NP', ['NNS', 'people']]]]
['NP', ['NNS', 'thousands']]
['NP', ['NNS', 'people']]
['NP', ['PRP$', 'their'], ['NNS', 'offices']]
['NP', ['NN', 'home']]
['NP', ['DT', 'the'], ['NN', 'night']]
['NP', ['NNS', 'officials']]