Académique Documents
Professionnel Documents
Culture Documents
Afin de développer des outils informatiques de traitement de langue naturelle, nous avons
d'abord besoin d’algorithmes permettant de déterminer automatiquement si une phrase répond à
une structure prédéfinie.
Les premières étapes effectuées pour aboutir à ce but ont été dans le cadre des grammaires
formelles utilisées pour la définition de langages de programmation. Au contraire des langages
artificiels, dans le cas des langues naturelles, il faut tenir compte de phénomènes complexes et
donc les structures des grammaires ou des analyseurs deviennent plus compliquées.
Un formalisme qui a prouvé sa valeur est celui des grammaires logiques basées essentiellement
sur le langage Prolog. “ Les programmes Prolog sont spécifiés sous forme de relations et de
règles autour des relations définies par la programmation en logique. Les programmes peuvent
être interrogés pour déterminer la véracité des faits ou pour déduire de nouveaux faits à l'aide des
règles.”
Une grammaire G est caractérisée par quatre composants :
snm svb
dt nm vb snm
le garçon mange dt nm
la pomme
Cet arbre est construit via un paramètre véhiculant l’information structurelle. Un foncteur Prolog
est très facile à construire car il suffit d'écrire sa forme et le processus d’unification le complète
ou vérifie son adéquation. Ainsi la structure d’une phrase est donnée par le foncteur ph avec
comme paramètre la structure du syntagme nominal et celle du syntagme verbal :
p(ph(SN_Struct,SV_Struct),L0,L) :
- sn(SN_Struct,L0,L1), sv(SV_Struct,L1,L),
Il faudra aussi vérifier qu’on ne retrouve pas le même syntagme nominal avant et après le verbe.
Nous pouvons ajouter ce test dans p pour s’assurer qu’on ne retrouve pas la même structure de
syntagme nominal comme sujet et comme complément du verbe. Pour refuser une phrase
comme “La pomme mange le garçon”. Il faut vérifier que celui qui est mangé par un autre est
bien une proie potentielle... On ajoutera donc de l'information sémantique à notre programme et
on le vérifiera dans la clause sv. Notre nouvelle grammaire devient donc :
sv(svb(vb(Mot)),L0,L) :- v(vb(Mot,_),_,L0,L).
sv(svb(vb(Mot),SN_Struct),L0,L) :-
v(vb(Mot,Comp),transitif,L0,L1), sn(SN_Struct,L1,L),
% verifier que le complement est semantiquement
acceptable
SN_Struct = snm(_,nm(Nom)), % extrait le nom
T =.. [Comp,Nom],
% construit le predicat de verification semantique
call(T). % on l’appelle
det(dt(le),masculin,L0,L) :- terminal(le,L0,L).
det(dt(la),feminin,L0,L) :- terminal(la,L0,L).
n(nm(pomme),feminin,L0,L) :- terminal(pomme,L0,L).
n(nm(garçon),masculin,L0,L) :- terminal(garçon,L0,L).
v(vb(mange,proie),transitif,L0,L) :-terminal(mange,L0,L).
v(vb(aller,_),intransitif,L0,L):-terminal(aller,L0,L).
terminal(Mot,[Mot|L],L).
% la semantique
proie(pomme).
Dans cet exemple, le programme est simple et on peut le faire à la main mais dans le cas
des programmes avec un niveau de complexité plus élevée, Prolog offre la possibilité
d’utiliser une notation DCG (Definite Clause Grammars)
où la clause s(L1, L2) :- sn(L1, L3), sv(L3, L2). peut s’écrire sous la
forme : s --> sn, sv.
Exemple de la transformation du code normale en utilisant le grammaire DCG :
sn(snm(Det_Struct,N_Struct)) -->
det(Det_Struct,Genre), n(N_Struct,Genre).
sv(svb(vb(Mot))) --> v(vb(Mot,_),_).
sv(svb(vb(Mot),SN_Struct)) -->
v(vb(Mot,Comp),transitif), sn(SN_Struct),
% verifier que le compl´ement est s´emantiquement
acceptable
{SN_Struct = snm(_,nm(Nom)), (T =.. [Comp,Nom]),
call(T)}.
Les grammaires DCG sont alors des moyens pratiques de représenter les relations grammaticales
pour diverses applications d'analyse. Ils peuvent être utilisés pour le travail en langage naturel,
pour créer des langages de commande et de programmation formels.
Prolog est un outil très puissant pour implémenter des analyseurs et des compilateurs. La
notation Definite Clause Grammar (DCG) fournit un moyen pratique d'exploiter cette puissance
en traduisant automatiquement les règles de grammaire en clauses Prolog.