Title: Cours 8
1Cours 8
- Analyse syntaxique
- - descendante
- - ascendante
- - par programmation dynamique
2Analyse syntaxique
- Parsing
- Entrées une phrase étiquetée et une grammaire
algébrique - Sorties le ou les arbres de dérivation de la
phrase - Algorithmes
- Descendants
- Ascendants
- Programmation dynamique
- Cascade de transducteurs
3Exemple de grammaire algébrique
- P --gt GN ltdisparaîtregt
- P --gt GN ltempirergt
- P --gt GN ltorchestrergt GN
- P --gt GN ltaimergt GN
- GN --gt Det N
- GN --gt Npr
- Det --gt ltlegt
- Det --gt ltcegt
- Det --gt ltungt
Det --gt tous les Det --gt toutes les N --gt
ltmélodiegt N --gt ltcorruptiongt N --gt ltorchestregt N
--gt ltempiregt Npr --gt Luc Npr --gt Anne
4Analyse syntaxique descendante
Les orchestres aiment cette mélodie
P
P
P
GN
ltdisparaîtregt
GN
ltdisparaîtregt
Det
N
P
GN
ltdisparaîtregt
Det
N
ltlegt
5Analyse descendante
P
P
GN
ltdisparaîtregt
GN
ltdisparaîtregt
exploration arborescente on essaye autre chose
Det
N
Det
N
ltlegt
ltlegt
ltcorruptiongt
ltmélodiegt
P
P
GN
ltdisparaîtregt
GN
ltdisparaîtregt
Det
N
Det
N
ltlegt
ltlegt
ltorchestregt
ltempiregt
6Analyse descendante
P
P
GN
ltdisparaîtregt
etc.
ltempirergt
GN
Npr
P
P
GN
ltaimergt
GN
GN
ltorchestrergt
GN
7Arbre produit
P
GN
GN
ltaimergt
Det
N
Det
N
ltcegt
ltmélodiegt
ltlegt
ltorchestregt
8Analyse descendante
- phrase.desc(arbre, feuilleCourante, tokenCourant)
- pour chaque feuille1 à partir de feuilleCourante
- symbole feuille1.étiquette
- si symbole est terminal
- si symbole est compatible avec token
- token phrase.suivant(token)
- sinon détruire arbre sortir de la fonction
- sinon si symbole est une variable
- pour chaque règle dont le membre gauche est
symbole - copieArbre arbre.copier()
- feuille2 équivalent de feuille1 dans
copieArbre - copieArbre.ajouter(règle, feuille2)
- feuille3 copieArbre.premierFils(feuille2)
- phrase.desc(copieArbre, feuille3, token)
- sortir de la fonction
- arbre.écrire()
9Exemple (1/8)
- L'orchestre aime cette mélodie
- desc(P, P, L')
- desc(P(GN disparaître), GN, L')
- desc(P(GN(Det N) disparaître), Det, L')
- desc(P(GN(Det(le) N) disparaître), le,
L') - desc(P(GN(Det(le) N(mélodie))
disparaître), mélodie, orchestre) - desc(P(GN(Det(le) N(corruption))
disparaître), corruption, orchestre) - desc(P(GN(Det(le) N(orchestre))
disparaître), orchestre, orchestre) - desc(P(GN(Det(le) N(orchestre))
disparaître), disparaître, aime) - desc(P(GN(Det(le) N(empire))
disparaître), empire, orchestre)
10Exemple (2/8)
- desc(P(GN(Det(ce) N) disparaître), ce,
L') - desc(P(GN(Det(un) N) disparaître), un,
L') - ...
- desc(P(GN(Npr) disparaître), Npr, L')
11Exemple (3/8)
- desc(P(GN empirer), GN, L')
- desc(P(GN(Det N) empirer), Det, L')
- desc(P(GN(Det(le) N) empirer), le, L')
- desc(P(GN(Det(le) N(mélodie)) empirer),
mélodie, - orchestre)
- desc(P(GN(Det(le) N(corruption)) empirer),
corruption, - orchestre)
- desc(P(GN(Det(le) N(orchestre)) empirer),
orchestre, - orchestre)
- desc(P(GN(Det(le) N(orchestre))
empirer), empirer, aime) - desc(P(GN(Det(le) N(empire))
empirer), empire, orchestre)
12Exemple (4/8)
- desc(P(GN(Det(ce) N) empirer), ce, L')
- desc(P(GN(Det(un) N) empirer), un, L')
- ...
- desc(P(GN(Npr) empirer), Npr, L')
13Exemple (5/8)
- desc(P(GN ochestrer GN), GN, L')
- desc(P(GN(Det N) orchestrer GN), Det, L')
- desc(P(GN(Det(le) N) orchestrer GN), le,
L') - desc(P(GN(Det(le) N(mélodie)) orchestrer GN),
mélodie, - orchestre)
- ...
- desc(P(GN(Det(ce) N) orchestrer GN), ce,
L') - desc(P(GN(Det(un) N) orchestrer GN), un,
L') - ...
- desc(P(GN(Npr) orchestrer GN), Npr, L')
14Exemple (6/8)
- desc(P(GN aimer GN), GN, L')
- desc(P(GN(Det N) aimer GN), Det, L')
- desc(P(GN(Det(le) N) aimer GN), le, L')
- desc(P(GN(Det(le) N(mélodie)) aimer GN),
mélodie, - orchestre)
- desc(P(GN(Det(le) N(corruption)) aimer GN),
corruption, - orchestre)
- desc(P(GN(Det(le) N(orchestre)) aimer GN),
orchestre, - orchestre)
- desc(P(GN(Det(le) N(orchestre)) aimer
GN), aimer, aime) - desc(P(GN(Det(le) N(orchestre)) aimer GN(Det
- N)), Det, cette)
15Exemple (7/8)
- desc(P(GN(Det(le) N(orchestre)) aimer GN(Det
- N)), Det, cette)
- desc(P(GN(Det(le) N(orchestre)) aimer
- GN(Det(le) N)), le, cette)
- desc(P(GN(Det(le) N(orchestre)) aimer
- GN(Det(ce) N)), ce, cette)
- desc(P(GN(Det(le) N(orchestre)) aimer
- GN(Det(ce) N(mélodie))),
- mélodie, mélodie)
- desc(P(GN(Det(le) N(orchestre)) aimer
- GN(Det(ce) N(corruption))),
- corruption, mélodie)
- ...
16Exemple (8/8)
- desc(P(GN(Det(un) N(orchestre)) aimer
- GN(Det(un) N)), un, cette)
- ...
- desc(P(GN(Det(le) N(orchestre)) aimer
- GN(Npr)), Det, cette)
- desc(P(GN(Det(le) N(empire)) aimer GN),
empire, - orchestre)
- desc(P(GN(Det(ce) N) aimer GN), ce, L')
- desc(P(GN(Det(un) N) aimer GN), un, L')
- ...
- desc(P(GN(Npr) aimer GN), Npr, L')
17Inconvénients
- On utilise peu le texte
- Avec Les orchestres aiment cette mélodie, les 10
premiers arbres contiennent disparaître, qui ne
figure pas dans la phrase - On construit plusieurs fois les mêmes sous-arbres
- Le sous-arbre pour Les orchestres est construit 4
fois et détruit 3 fois - Boucle en cas de récursivité gauche
- Une règle comme GN --gt GN Adj met l'algorithme
dans une boucle infinie
18Analyse syntaxique ascendante
Les orchestres aiment cette mélodie
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
ltlegt
ltorchestrergt
ltaimergt
ltcegt
ltmélodiegt
Det
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
N
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
19Analyse ascendante (itération 1)
Det
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
N
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
Det
ltlegt
ltorchestrergt
ltaimergt
ltcegt
ltmélodiegt
Det
ltlegt
ltorchestrergt
ltaimergt
ltcegt
ltmélodiegt
N
ltlegt
ltorchestrergt
ltaimergt
ltcegt
ltmélodiegt
20Analyse ascendante (itération 2)
Det
N
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
Det
Det
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
Det
N
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
N
Det
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
21Analyse ascendante (itération 2)
N
N
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
Det
N
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
Det
Det
ltlegt
ltorchestrergt
ltaimergt
ltcegt
ltmélodiegt
Det
N
ltlegt
ltorchestrergt
ltaimergt
ltcegt
ltmélodiegt
22Analyse ascendante (itération 2)
Det
N
ltlegt
ltorchestrergt
ltaimergt
ltcegt
ltmélodiegt
23Analyse ascendante (itération 3)
GN
Det
N
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
GN
Det
N
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
24Analyse ascendante (itération 3)
Det
N
Det
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
Det
N
N
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
N
Det
N
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
25Analyse ascendante (itération 3)
Det
Det
N
ltlegt
ltorchestrergt
ltaimergt
ltcegt
ltmélodiegt
GN
Det
N
ltlegt
ltorchestrergt
ltaimergt
ltcegt
ltmélodiegt
26Analyse ascendante (itération 4)
GN
Det
Det
N
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
GN
Det
Det
N
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
27Analyse ascendante (itération 4)
GN
N
Det
N
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
GN
N
Det
N
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
28Analyse ascendante (itération 4)
Det
N
Det
N
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
GN
Det
Det
N
ltlegt
ltorchestrergt
ltaimergt
ltcegt
ltmélodiegt
29Analyse ascendante (itération 5)
GN
Det
N
Det
N
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
GN
Det
N
Det
N
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
30Analyse ascendante (itération 6)
GN
GN
Det
N
Det
N
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
31Analyse ascendante (itération 7)
P
GN
GN
Det
N
Det
N
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
32Algorithme (1/2)
- ensSeqArbres un ensemble de séquences d'arbres
vide - pour chaque combinaison de terminaux compatible
avec phrase - ensSeqArbres.ajouterSeqArbres(combinaison)
- tant que ensSeqArbres n'est pas vide
- nouvEnsSeqArbres un ensemble de séquences
d'arbres vide - pour chaque seqArbres dans ensSeqArbres
- seqRacines seqArbres.seqRacines()
- pour chaque facteur de seqRacines
- pour chaque règle dont le membre droit corresp.
à facteur - copieSeqArbres seqArbres.copier()
- copieSeqArbres.ajouter(facteur, règle)
- nouvEnsSeqArbres.ajouter(copieSeqArbres)
33Algorithme (2/2)
- pour chaque seqArbres dans nouvEnsSeqArbres
- si seqArbres est un arbre et si sa racine est
l'axiome - seqArbres.écrire()
- nouvEnsSeqArbres.supprimer(seqArbres)
- ensSeqArbres nouvEnsSeqArbres
34Inconvénients
- On utilise peu la grammaire
- Avec Les orchestres aiment cette mélodie, toutes
les séquences qui contiennent ltorchestrergt suivi
de ltaimergt sont incompatibles avec la grammaire
35L'algorithme d'Earley (1970)
- Analyse descendante
- Sauvegarde dans un tableau tous les résultats
intermédiaires réutilisables (programmation
dynamique) - Tableau indicé par les tokens de la phrase
- Phrase Les orchestres aiment cette mélodie
- Indices 0 1 2
3 4 5 - Pour chaque indice, le tableau contient un
ensemble de sous-arbres correspondant à des
analyses partielles - On remplit le tableau de gauche à droite, sans
retours en arrière - On ne détruit jamais des sous-arbres déjà créés
- Pour construire les arbres de dérivation, on
combine les sous-arbres du tableau
36Les sous-arbres
- Un sous-arbre est représenté par
- - une règle pointée (le point indique jusqu'où on
a analysé) - - deux positions dans la phrase, correspondant
- - au début de la règle
- - et au point jusqu'où on a analysé
- Exemple 1
- P --gt GN ltaimergt . GN
- 0-3
P
GN
GN
Det
Det
N
N
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
0 1 2 3 4 5
37Les sous-arbres
- Exemple 2
- GN --gt Det N .
- 0-2
- Exemple 3
- GN --gt . Det N
- 3-3
- Si la 2e position d'un sous-arbre est j, ce
sous-arbre est rangé à l'indice j dans le tableau - Exemple 2 rangé à l'indice 2 Exemple 3 rangé
à l'indice 3
P
GN
GN
Det
Det
N
N
ltlegt
ltorchestregt
ltaimergt
ltcegt
ltmélodiegt
0 1 2 3 4 5
38L'algorithme
- On parcourt le tableau de gauche à droite
- Quand on est à l'indice i, on parcourt les
sous-arbres et on crée de nouveaux sous-arbres à
l'indice i (queue FIFO) et à l'indice i 1 - On suppose que l'axiome de la grammaire apparaît
une seule fois, dans une règle P0 --gt P - Début P0 --gt . P
- 0-0
- Fin P0 --gt P .
- 0-n (n nombre de tokens dans la phrase)
- Règle pointée complétée règle dont le point est
à la fin
39L'algorithme
- analyseur.table0.enfiler(P0 --gt . P, 0, 0)
- pour i de 0 à n
- pour chaque sousArbre dans tablei
- si sousArbre.complétée()
- analyseur.compléter(sousArbre)
- sinon si sousArbre.prochainSymbole() est
terminal - analyseur.vérifier(sousArbre)
- sinon analyseur.prédire(sousArbre)
- si analyseur.tablen.contient(P0 --gt P ., 0, n)
- analyseur.construireArbres(n)
-
40L'algorithme
- compléter(B --gt w ., j, k)
- pour chaque (A --gt u . B v, i, j) dans tablej
- tablek.enfiler(A --gt u B . v, i, k)
- vérifier(A --gt u . t v, i, j)
- si t correspond à tokenj
- tablej 1.enfiler(A --gt u t . v, i, j 1)
- prédire(A --gt u . B v, i, j)
- pour chaque (B --gt w) dans règles(B)
- tablej.enfiler(B --gt . w, j, j)