Encontrar cabeça de uma frase substantiva em NLTK e Stanford analisar de acordo com as regras de encontrar cabeça de um NP

geralmente A cabeça de uma frase substantiva é um substantivo que está mais à direita do NP, como mostrado abaixo na árvore, é a cabeça do NP pai. assim

            ROOT                             
             |                                
             S                               
          ___|________________________        
         NP                           |      
      ___|_____________               |       
     |                 PP             VP     
     |             ____|____      ____|___    
     NP           |         NP   |       PRT 
  ___|_______     |         |    |        |   
 DT  JJ  NN  NN   IN       NNP  VBD       RP 
 |   |   |   |    |         |    |        |   
The old oak tree from     India fell     down

Fora [40]: Árvore ('S', [Árvore ('NP', [Árvore ('NP', [Árvore ('DT', ['The'])), Árvore ('JJ', ['antiga'] ), Árvore ('NN', ['oak']), Árvore ('NN', ['tree'])]), Árvore ('PP', [Árvore ('IN', ['from']), Árvore ('NP', [Árvore ('NNP', ['Índia'])])])]), Árvore ('VP', [Árvore ('VBD', ['caiu'])), Árvore ('PRT ', [Árvore (' RP ', [' abaixo '])])])])

O código a seguirbaseado em uma implementação java usa uma regra simplista para encontrar o chefe do NP, mas preciso basear-me noregras:

parsestr='(ROOT (S (NP (NP (DT The) (JJ old) (NN oak) (NN tree)) (PP (IN from) (NP (NNP India)))) (VP (VBD fell) (PRT (RP down)))))'
def traverse(t):
    try:
        t.label()
    except AttributeError:
          return
    else:
        if t.label()=='NP':
            print 'NP:'+str(t.leaves())
            print 'NPhead:'+str(t.leaves()[-1])
            for child in t:
                 traverse(child)

        else:
            for child in t:
                traverse(child)


tree=Tree.fromstring(parsestr)
traverse(tree)

O código acima fornece a saída:

NP: ['O', 'velho', 'carvalho', 'árvore', 'de', 'Índia'] NPhead: Índia NP: ['O', 'velho', 'carvalho', 'árvore'] NPhead : tree NP: ['Índia'] NPhead: Índia

Embora agora esteja dando a saída correta para a sentença dada, mas preciso incorporar uma condição que apenas o substantivo mais à direita seja extraído como cabeça, atualmente ele não verifica se era um substantivo (NN)

print 'NPhead:'+str(t.leaves()[-1])

Então, algo como seguir na condição np head no código acima:

t.leaves().getrightmostnoun() 

Dissertação de Michael Collins (Apêndice A) inclui regras de busca de cabeças para o Penn Treebank e, portanto, não é necessário que apenas o substantivo mais à direita seja a cabeça. Portanto, as condições acima devem incorporar esse cenário.

Para o exemplo a seguir, conforme indicado em uma das respostas:

(NP (NP a pessoa) que deu (NP a conversa)) foi para casa

O substantivo principal do sujeito é pessoa, mas o último nó de saída do NP é a pessoa que deu a palestra.

questionAnswers(2)

yourAnswerToTheQuestion