Sto cercando di estrarre le produzioni CNF-grammaticali di una frase dal suo albero di analisi:Chomsky-normale-forma di estrazione grammatica da un albero di analisi
(ROOT
(S
(NP (DT the) (NNS kids))
(VP (VBD opened)
(NP (DT the) (NN box))
(PP (IN on)
(NP (DT the) (NN floor))))))
ho messo l'albero buco in una stringa denominata S e quindi:
tree = Tree.fromstring(S)
tree.chomsky_normal_form()
for p in tree.productions():
print p
L'uscita è
(1) NN -> 'box'
(2) PP -> IN NP
(3) DT -> 'the'
(4) ROOT -> S
(5) NP -> DT NN
(6) VBD -> 'opened'
(7) VP|<NP-PP> -> NP PP
(8) VP -> VBD VP|<NP-PP>
(9) NP -> DT NNS
(10) NN -> 'floor'
(11) IN -> 'on'
(12) NNS -> 'kids'
(13) S -> NP VP
Ma alcune delle produzioni (numero 7 & 8) non sembra essere CNF! Qual è il problema?
Quindi, come posso distinguere tra le barre che significano OR (che sono sempre sul RHS) con barre che non significano OR e possono verificarsi sia su RHS e LHS (come quella che hai citato)? – sabzdarsabz
In quale contesto è necessario "distinguere" tra loro? Al livello più elementare, alimentando un simbolo non terminale sul LHS come 'VP | 'genererà un errore, in quanto i simboli non dovrebbero contenere spazi. Renditi conto anche che la specifica 'A -> B | C' è una scorciatoia per il più formale 'A -> B',' A -> C'. –
jayelm
Infatti, NLTK divide queste regole nelle loro forme costitutive, quindi a parte l'inserimento manuale di regole come 'A -> B | C', non troverai occorrenze di '|' che significa "opzioni multiple" nelle grammatiche NLTK. Prova 'nltk.CFG.fromstring (" A -> B | C ")', che crea una grammatica con due regole di produzione. – jayelm