2013-10-16 15 views
5

Sto provando a scrivere un programma che includerà due frasi e verificherà se sono simili. Non volevo usare un parser a tutti gli effetti e ne ho creato uno usando una semplice grammatica che penso che avrei incontrato più spesso. Ora, il mio interesse è nelle frasi nominali nelle frasi. Controllare l'uguaglianza dei sottotitoli etichettati come frasi nominali sarebbe abbastanza facile. Voglio aggiungere altro a questo, e lasciare che l'utente decida se devono essere accettati determinanti mancanti/non corrispondenti (corrispondenze parziali).Confronto tra due alberi NLTK simili non identici

L'albero di output è nella forma (S (NP The/DT bag/NN) è/VBZ (JP blue/JJ)), dove ho definito le frasi di grammatica nome (NP) e le frasi di aggettivo (JP)

per andare sulla corrispondenza, ho considerato alcuni itinerari:

  • per eliminare i nodi determinante negli alberi rilevanti e quindi confrontare
  • per modificare il valore di tutti i nodi determinante per un valore comune , per esempio, X
  • per creare un elenco di tutti i nodi foglia tranne quelli contrassegnati come "D" T'

Sono nuovo di pitone e sto affrontando alcuni problemi qui:

  • se scrivo una funzione ricorsiva per attraversare l'albero sintagma nominale fino a raggiungere una foglia con un determinante, Non riesco a modificare il valore nell'albero originale, poiché sta solo passando il valore.

  • l'unica funzione di eliminazione che ho trovato rispetto agli alberi nltk è quella che richiede l'indice esatto del nodo da eliminare rispetto alla radice dell'albero, in un formato come [0,0] se è il figlio più a sinistra del figlio più a sinistra del nodo radice. Questo è difficile da ottenere poiché molto probabilmente coinvolgerebbe un elenco di numeri interi che crescono con l'altezza dell'albero, per ogni nodo

  • Ho creato un elenco di liste, in cui ogni lista ha tutte le foglie di una frase di un nome escludendo i determinanti e confrontandoli.

Quindi, le mie domande sono,

Come si elimina un nodo da un albero NLTK, senza aver prima ottenuto esso è indice nella forma [0,0,1,0, ...]?

Come faccio a modificare un valore foglia, ancora una volta senza l'utilizzo di un indice? (Vorrei utilizzare una funzione ricorsiva, e ogni volta che la funzione colpisce una foglia che voglio modificare, vorrei modificarlo)

Se questi non sono possibili, come posso ottenere l'indice di una foglia? Sono perplesso a questo. Gli alberi Nltk hanno una funzione treeposition, ma questo funziona solo per i sottoalberi. Python considera la foglia come un tipo diverso rispetto ad altri nodi? Perché la posizione dell'albero non funziona per le mie foglie. Questo potrebbe essere dovuto al fatto che le mie foglie sono tuple e non solo stringhe, ma non so come cambiarle, perché è l'uscita del tagger pos. Quindi c'è un modo per sostituire la mia foglia, che è una tupla della forma [il/DT] con un sottoalbero del modulo (DT il)? Definire nuovamente le procedure ricorsive non modificherà l'albero originale.

Eventuali suggerimenti/osservazioni?

risposta

3

Ok, affrontiamo le vostre domande una per una.

tree = Tree.parse("(S (NP The/DT bag/NN) is/VBZ (JP blue/JJ))") 

L'eliminazione di un nodo:

tree.remove(Tree('JP', ['blue/JJ']))

tree.remove('is/VBZ')

Modifica di un valore. Si potrebbe fare questo ottenendo l'indice di un membro dell'Albero (ricordate, eredita le liste):

tree.index('is/VBZ')

ma ancora una volta, questo non è un buon approccio.

Il modo migliore nell'attraversare le foglie è sempre le foglie con tree.leaves() e quindi ottenere gli indici da tree.leaf_treeposition(index), e l'utilizzo di questi per modificare/cancellare la foglia sul posto.

Problemi correlati