:: Enseignements :: Licence :: L3 :: 2007-2008 :: Introduction à l'informatique linguistique ::
[LOGO]

Analyse syntaxique par grammaires algébriques


Ce TP est noté. Il est consacré à l'analyse syntaxique par grammaires algébriques.

Instructions

Ce TP noté dure 2h. Vous devez répondre aux questions ci-dessous sous la forme de scripts python. Les réponses à des questions non implémentables devront être mises en commentaire dans les scripts. Une fois que vous avez répondu à une question, levez la main et le chargé de TD viendra valider votre réponse. A la fin du sujet, il y a une question de réflexion (exercice 4) à laquelle vous devrez répondre après le TP noté. La réponse sera à envoyer à Matthieu Constant avant le vendredi 4 avril à 14h.

Exercice 1 - Grammaires algébriques et arbres syntaxiques

  1. Afficher les arbres syntaxiques associés aux deux phrases suivantes:
    • Luc prévient le facteur de son arrivée.
    • Lea prévient le facteur de son village.
    Vous utiliserez un script ressemblant à celui-là :
    		tree = nltk.bracket_parse('(NP (Adj old) (NP (N men) (Conj and) (N women)))')
    		tree.draw()
    				
  2. Le script ci-dessous permet de définir une petite grammaire algébrique pour l'anglais:
    			import nltk
    			grammar=nltk.parse_cfg("""
    			  S -> NP V NP | NP V PP 
    			  PP -> P NP
    			  NP -> Det N | NP PP
    			  Det -> 'a' | 'the'
    			  N -> 'dog' | 'cat'
    			  V -> 'chased' | 'sat'
    			  P -> 'on' | 'in'
    """)
    			sent = "the dog chased a cat".split()
    			cp = nltk.ChartParser(grammar, nltk.parse.TD_STRATEGY)
    			for p in cp.nbest_parse(sent):
    			  p.draw()
    				
    Adapter cette grammaire pour qu'elle reconnaisse la phrase :

    le petit chien court dans le pré vert

    Afficher l'arbre syntaxique de la phrase en lui appliquant cette grammaire.
  3. Modifier la grammaire précédente pour qu'elle reconnaisse la phrase suivante:

    Lea a malheureusement oublié son sac à la piscine.
Pour plus de détails, vous pouvez lire la documentation de NLTK sur l'analyse syntaxique et sur l'analyse syntaxique avancée.

Exercice 2 - Analyse syntaxique par grammaires algébriques

  1. Ecrire une grammaire la plus générale possible permettant d'analyser les différentes phrases du texte text-tpnote.txt. Pour cette question, vous préciserez les terminaux (tokens) en ne gardant que leur analyse dans le texte (même si ce token est potentiellement ambigu). Par exemple, pour le token la, on n'a qu'une seule production:
    					Det -> la
    				
    ATTENTION : Pour simplifier la visualisation des résultats, appliquer l'analyseur phrase par phrase (une phrase par ligne dans le fichier).
  2. Dans un deuxième temps, vous préciserez les terminaux de la grammaire en tenant compte de l'ambiguïté potentielle. Pour chacune des ambiguïtés, vous donnerez un exemple d'emploi. Pour le token la, il existe trois analyses possibles :
    					Det -> la  // "La carte de Luc est belle"
    					Pro -> la  // "Je la donne à Paul"
    					Nom -> la // Ambiguïté un peu trop artificielle "le la sonne faux sur ton piano."
    				
    Que constatez vous?

Exercice 3 - Analyse syntaxique par grammaires alégébriques avec contraintes

Il est possible de rajouter des contraintes dans les grammaires algébriques comme dans l'exemple ci-dessous:
				
## Natural Language Toolkit: feat0.fcfg
##
## First example of a feature-based grammar for English, illustrating
## value-sharing of NUM and TENSE features.
## Used in Feature-Based Grammars chapter.
## 
## Author: Ewan Klein <ewan@inf.ed.ac.uk> 
## URL: <http://nltk.sourceforge.net>
## For license information, see LICENSE.TXT
##
## $Id: feat0.cfg 4674 2007-06-14 08:55:32Z ehk $

% start S
# ############################
# Grammar Rules
# ############################

# S expansion rules
S -> NP[NUM=?n] V[NUM=?n] NP

# NP expansion rules
NP[NUM=?n] -> Npr[NUM=?n] 
NP[NUM=?n] -> Det[NUM=?n] N[NUM=?n]


# ############################
# Lexical Rules
# ############################

Det[NUM=sg] -> 'this' | 'every'
Det[NUM=pl] -> 'these' | 'all'
Det -> 'the' | 'some'

Npr[NUM=sg]-> 'Mary' | 'John'

N[NUM=sg] -> 'dog' | 'girl' | 'car' | 'child'
N[NUM=pl] -> 'dogs' | 'girls' | 'cars' | 'children' 

V[TENSE=pres,  NUM=sg] -> 'disappears' | 'walks'
V[TENSE=pres, NUM=sg] -> 'sees' | 'likes'

V[TENSE=pres,  NUM=pl] -> 'disappear' | 'walk'
V[TENSE=pres, NUM=pl] -> 'see' | 'like'					
				
				fichier grammar.fcfg
			
Pour appliquer cette grammaire à un texte, il suffit d'adapter le script ci-dessous:
cp = load_earley('grammar.fcfg')
sent = "John sees Mary".split()
for tree in cp.parse(sent):
  tree.draw()
				

Vous pouvez trouver de plus amples informations dans la documentation de NLTK sur les grammaires à traits.
ATTENTION : avant de lancer ce script, il faut rajouter votre répertoire de travail dans la liste des chemins de la variable d'environnement NLTK_DATA:
export NLTK_DATA=$NLTK_DATA:<votre_repertoire_de_travail>

Reprendre la grammaire de l'exercice précédente et lui ajouter des contraintes d'accord en genre, en nombre et en personne de manière pertinente.

Exercice 4 - Question de réflexion

Dans cet exercice, on cherche à lexicaliser les grammaires à l'aide de contraintes sur les traits. On suppose que l'on dispose d'un lexique de verbes contenant des informations syntaxiques. Par exemple,
  • manger accepte un complément d'objet direct (ex. GN mange GN)
  • donner accepte un complément d'objet direct et indirect (ex. NP donne NP à NP)
Comment traduire toutes ces informations dans une grammaire algébrique avec contraintes ? Vous donnerez un exemple de grammaire traduisant les informations d'un lexique avec 5 types de constructions.