Prolog

TD n°6

But du TD

Les automates finis ne suffisent pas à analyser l'ensemble des constructions d'une langue naturelle (cf. le chapitre sur la Modélisation informatique de la syntaxe (surtout 2.2) dans mon poly sur le traitement automatique des langues naturelles (TALN). L'objectif de ce TD est de réaliser une analyse syntaxique de portions du langage naturel à l'aide d'une grammaire formelle algébrique (ou context-free), en intégrant progressivement plusieurs propriétés :
  1. la définitions de règles récursives pouvant donner lieu à plusieurs analyses différentes
  2. la construction de l'arbre correspondant à une analyse sous la forme d'un terme
  3. les accords en genre et en nombre entre certains groupes de mots
Prolog intègre des fonctionnalités pour réaliser cela très simplement.

Préliminaires

Préliminaires linguistiques

Pour comprendre comment on peut associer un arbre à l'analyse linguistique de phrases, commencer par lire le chapitre Structures syntaxiques (en 1.3). Le rappel de quelques modèles informatiques (automates, grammaires formelles) est, lui, donné dans le chapitre Grammaires formelles (en 2.4).

Préliminaires sur l'écriture de règles syntaxiques en Prolog

Pour traduire en Prolog une règle du genre : S --> GN GV, on ne peut pas se contenter d'écrire :
s :- gn,gv.
car la virgule est une conjonction, pas une relation de précédence. Mais Prolog dispose d'une gestion des listes qui permet d'écrire :
s(X,Y) :- gn(X,X1),gv(X1,Y).
qui peut s'interpréter comme : la liste qui est la concaténation des listes X et Y est syntaxiquement correcte (est générée à partir de s) si elle peut se décomposer en une sous-liste qui est un groupe nomimal (générée par gn), suivie d'une sous-liste qui est un groupe verbal (générée par gv). Prolog autorise d'écrire la même chose de la façon suivante :
s --> gn,gv.
Cette fois, la virgule signifie la précédence ! Si on ajoute à cette première règle les "règles terminales" suivantes :
gn --> det,nom.
det --> [le].
nom --> [chat].
gv --> [dort].
alors on peut déjà interroger cette grammaire rudimentaire en demandant :
?- s([le,chat,dort],[]).
ou alors :
?- s(X,[]).

Ecriture d'une grammaire

Grammaire de base

Ecrire une grammaire un peu plus conséquente que la précédente, permettant d'analyser un nombre infini des phrases différentes et autorisant plusieurs décompositions syntaxiques possibles.
Attention, dans l'écriture de vos règles il peut y avoir de la récursivité, mais il faut éviter la "récursivité gauche" comme dans gn --> gn gp qui entraine l'analyseur dans des boucles infinies. Pour assurer la terminaison de l'analyse, chaque règle doit amener à "consommer" un symbole terminal à gauche.

L'écriture de l'arbre syntaxique sous la forme d'un terme

On souhaite bien sûr non seulement avoir le diagnostic de grammaticalité de la phrase (oui ou non est-elle générée par la grammaire ?) mais aussi une représentation de son arbre d'analyse syntaxique. Or un arbre est représentable dans un terme, il suffit donc pour l'obtenir d'ajouter un argument à nos prédicats et de décrire comment chaque règle contribue à le construire, par exemple :
s(s(GN,GV))--> gn(GN),gv(GV).
gn(gn(DET,NOM)) --> det(DET),nom(NOM).
det(det([le]))--> [le].
nom(nom([chat])) --> [chat].
gv(gv([dort]))--> [dort].
Si maintenant on interroge notre analyseur en lui fournissant une variable à la place du terme :
?- s(A,[le,chat,dort],[]).
On obtient comme réponse :
A = s(gn(det([le]),n(nom([chat]))),gv(gv([dort]))) 
Modifier les autres règles de votre grammaire pour associer un terme à chaque analyse.

Accords en genre et en nombre

En français, on impose un certains nombre d'accords entre différents constituants d'une phrase : accords en genre et en nombre entre un déterminant et le nom qui le suit (et ses éventuels adjectifs), accord en nombre entre le sujet et le verbe, etc. Il est simple de modifier les règles de notre grammaire pour intégrer cette contrainte, par exemple de la forme :
s(s(GN,GV))--> gn(GN,Nb),gv(GV,Nb).
gn(gn(DET,NOM),Nb)--> det(DET,Nb),nom(NOM,Nb).
det(det([le]),sing) --> [le].
det(det([les]),pl) --> [les].
nom(nom([chat]),sing) --> [chat].
nom(nom([chats]),pl) --> [chats].
gv(gv([dort]),sing)--> [dort].
gv(gv([dorment]),pl)--> [dorment].
Avec cet exemple,
?- s(A,[le,chat,dort],[]).
est accepté, ainsi que
?- s(A,[les,chats,dorment],[]).
mais pas
?- s(A,[le,chat,dorment],[]).
est refusé. Ajouter les contraintes d'accords partout où c'est nécessaire dans les règles de votre grammaire.

Dernière modification : 9/9/2011
Valid HTML 4.01! Valid CSS!