Cours de Traitement Automatique du Langage

TP: Analyse Syntaxique hors-contexte

Note : l'outil "anagram" utilisé dans ce TP a été développé au Laboratoire d'Intelligence Artificielle de l'Ecole Polytechnique de Lausanne, essentiellement par Jean-Cedric Chappelier. La librairie C sur laquelle repose cet outil, nommée SlpToolkit, est disponible à l'adresse : http://slptk.sourceforge.net/.

Jouer avec les grammaires hors contexte

Avant de commencer, tapez :

source /export/home/users/Enseignants/rozenknop/Cours/Syntaxe/TP1/environnement.sh

Le but de ce TP est de vous faire développer une grammaire valable pour des exemples de phrases.

Comme une telle tâche peut prendre beaucoup de temps (peut-être parfois une vie entière), essayez de vous arrêter après un laps de temps raisonnable !

1 - Outils

La première étape est de savoir comment écrire et utiliser une grammaire hosrs-contexte. Commençons avec la grammaire suivante :


P   -> SN SV 
SN  -> Det N 
SV  -> V SN  
Det -> le   
N   -> chat
N   -> chien
V   -> chasse
 
où l'ensemble des symboles non-terminaux est {P, SN, SV, Det, N, V} (S étant le symbole de plus haut niveau (axiome)), et l'ensemble des symboles terminaux est {mange, chat, chien, le}. Det, N et V sont les "catégories morphosyntaxiques", ou "préterminaux".


Cette grammaire extrêmement simple peut produire des phrases :
 
     le chat chasse le chien
     le chien chasse le chat
     le chat chasse le chat
     le chien chasse le chat

En pratique, en TAL, le lexique (qui contient les informations sur les mots et leurs catégories morphosyntaxiques) est souvent séparé du coeur de la grammaire. Dans notre cas, les informations

Det -> le   
N   -> chat  
N   -> chien 
V   -> chasse  
seront placées dans un lexique (contenant 4 entrées); et l'information grammaticale
P   -> SN SV 
SN  -> Det N 
SV  -> V SN  
sera placée dans un fichier que nous appelons maintenant "la grammaire".

Pour pouvoir effectivement faire de l'analyse syntaxique automatique avec cet exemple de grammaire hors-contexte, il faut créer un fichier contenant le lexique, comme par exemple celui-ci (examplelexicon.txt), et un autre fhichier contenant la grammaire, comme celui-là (examplegrammar.txt).
Copiez (i.e. sauver: Shift+ButtonGauche avec Netscape) ces fichiers sur votre compte.

Maintenant, pour utiliser l'analyseur syntaxique anagram, vous devez créer une version "compilée" du lexique, avec la commande :

traduit_lex.py examplelexicon
Cette commande produit tous les fichiers dont anagram a besoin pour fonctionner.
Vérifiez le contenu du lexique compilé avec la commande :
listlexique examplelexicon.slplex
Vous remarquez que les catégories morphosyntaxiques sont représentées par des numéros, et non plus par leurs symboles d'origine. Cela est dû au fait qu'anagram a besoin de cette représentation pour fonctionner correctement. La table des correspondances entre les catégories morphosyntaxiques et leurs index a été enregistrée dans le fichier examplelexicon.tagset lors de la compilation du lexique. Pour afficher le lexique de façon plus lisible, essayez :
listlexique -map examplelexicon.tagset examplelexicon.slplex
Pour rendre la grammaire compatible avec anagram, les catégories morphosyntaxiques doivent également être transformées dans le fichier grammaire :
wraptag.py -r examplelexicon.tagset < examplegrammar.txt > examplegrammar.num

Maintenant, vous pouvez enfin tester la grammaire :

anagram -P -i p -notcg examplelexicon.slplex examplegrammar.num
et tapez la phrase (le chien chasse le chat).

Vous devriez obtenir le résultat sous forme parenthésée :

[ P [ SN [ :3 le ] [ :2 chien ] ] [ SV [ :1 chasse ] [ SN [ :3 le ] [ :2 chat ] ] ] ]

Vous pouvez ensuite entrer une autre phrase, ou quitter le programme en tapant ^D (Ctrl + D).

Pour vérifier que vous maîtrisez l'outil d'analyse, transformez la grammaire précédente en ajoutant une règle comme :

SN -> Det Adj N
et ajoutez les adjectifs petit et gros dans le lexique, ainsi qu'un déterminant un.
Testez avec la phrase : le petit chat chasse un gros chien

Enfin, voyons ce qui se passe dans un cas ambigu. On considère cette grammaire-là avec ce lexique-ci, à appliquer à la phrase :
time flies like an arrow
Essayez d'obtenir toutes les analyses possibles pour cette phrase !

Pour vous aider à lire les arbres d'analyse, vous pouvez utiliser la commande voir_arbre, qui prend un corpus d'arbres sous forme parenthésée en entrée. Techniquement, récupérez le fichier time-sentence.txt (qui contient simplement la phrase à analyser) et faites :

anagram -P -s -i p -notcg time-lex.slplex time-gram.num < time-sentence.txt |\
wraptag.py time-lex.tagset | cut -d'(' -f1 > time-parsing.txt
(l'option -s signifie "mode silencieux"), puis tapez :
voir_arbres time-parsing.txt
Cliquez sur les boutons gauche ou droite de la souris pour faire défiler les différents arbres.

Lorsque l'on dispose d'une grammaire probabiliste hors-contexte (SCFG) il est également possible de ne faire afficher que l'arbre de plus grande probabilité, en utilisant l'option -best d'anagram au lieu de l'option -i:

anagram -P -best p -notcg time-lex.slplex time-gram.num

2 - A vous !

2.1 - Grammaires ambiguës

Complétez la première grammaire (celle de "le chat chasse le chien") de manière à ce qu'elle soit capable d'analyser "la petite brise la glace" selon les deux interprétations possibles. Faites de même pour "la belle ferme le voile". Introduisez également les déterminants indéfinis un, une, des et vérifiez que la phrase "la belle ferme un voile" obtient une seule analyse.

2.2 - Accord dans le syntagme nominal

Introduisez dans le lexique les variations en genre et en nombre des mots qui y figurent, et retouchez la grammaire pour forcer les accords à l'intérieur des syntagmes nominaux : les déterminant, adjectif épithète et nom doivent être de même genre et de même nombre. Au final, les phrases suivantes doivent être reconnues par la grammaire (c'est-à-dire obtenir au moins une analyse) :
les petites brises la glace
la petite brise les glacent
les beaux chats mange le chien
Les phrases suivantes ne doivent pas être reconnues par la grammaire :
les belle chatte chasse le chien
les beaux chiennes la glace
le belle chat chasse le chien

2.2 - Accords sujet-verbe

Introduisez dans le lexique les pronoms personnels nominatifs (je, tu, il, elle, nous, vous, ils, elles), ainsi que les conjugaisons au présent de l'indicatif des verbes qui y figurent. Modifiez la grammaire pour forcer l'accord du sujet avec le verbe. Au final, les phrases suivantes doivent être reconnues par la grammaire :
les belles chassent les chats
nous brisons la glace
elle les glace
les petites brises les glacent
une petite brise les glaces
Les phrases suivantes ne doivent pas être reconnues par la grammaire :
les belles chasse le chat
ils la glace
vous chassons le chat

2.3 - Verbe d'état : être

Introduisez dans le lexique la conjugaison du verbe être au présent de l'indicatif. Modifiez la grammaire pour que ce verbe se construise avec un attribut du sujet, de type adjectival ou nominal, et que cet attribut s'accorde avec le sujet. Attention, cela ne doit pas modifier le comportement des autres verbes de la grammaire. Au final, les phrases suivantes doivent être reconnues par la grammaire :
je suis le chat
il est beau
les glaces sont belles
vous êtes belles
le chien est une chienne
Les phrases suivantes ne doivent pas être reconnues par la grammaire :
le chien est belle
les chiens sont un chien
Remarquez que l'on veut imposer l'accord en genre et en nombre pour un attribut adjectival, mais que, pour un attribut nominal, on ne veut imposer que l'accord en nombre.

Créé par Antoine Rozenknop (Antoine.Rozenknop@lipn.univ-paris13.fr), d'après Jean-Cédric Chappelier (Jean-Cedric.Chappelier@epfl.ch)
Dernière modification le 14/10/2008.