P --> GN - Institut d`électronique et d`informatique Gaspard

publicité
Syntaxe et analyse syntaxique
Réseaux sémantiques
Eric Laporte
Institut Gaspard-Monge
Université Paris-Est Marne-la-Vallée
France
http://igm.univ-mlv.fr/~laporte/
Syntaxe et analyse syntaxique
Réseaux sémantiques
Unification
Analyse syntaxique par l'algorithme d'Earley
Réseaux sémantiques
Relations sémantiques
WordNet
Accord grammatical (1/4)
P --> GN attend
Le public attend
Le GN est obligatoirement au singulier :
* Les spectateurs attend
P --> GN attendent Les spectateurs attendent
Le GN est obligatoirement au pluriel :
* Le public attendent
On veut éviter d'avoir deux symboles distincts pour les
GN au singulier et les GN au pluriel
Accord grammatical (2/4)
P
P
--> GN attend
--> GN attendent
{ GN.nombre = "singulier" }
{ GN.nombre = "pluriel" }
On considère les traits du GN comme des attributs du
symbole GN
On ajoute des attributs aux symboles et des équations
aux règles
On veut éviter d'avoir deux règles distinctes
Accord grammatical (3/4)
P
--> GN <attendre> {
GN.nombre = <attendre>.nombre ;
GN.personne = <attendre>.personne ; }
Le public attend - Les spectateurs attendent - Vous
attendez
On considère les traits de attendre comme des attributs
aussi
Accord grammatical (4/4)
Vérification des équations
P --> GN <attendre> {
GN.nombre = <attendre>.nombre ;
GN.personne = <attendre>.personne ; }
On ne sait pas si on connaîtra la valeur de GN.nombre
avant celle de<attendre>.nombre ou le contraire
On veut pouvoir vérifier l'équation avant de connaître
aucun des deux attributs
On vérifie les équations par unification
Unification (1/7)
Unification entre GN.nombre et<attendre>.nombre
Avant :
GN.nombre = x
<attendre>.nombre = "singulier"
Après :
GN.nombre = "singulier"
<attendre>.nombre = "singulier"
Les valeurs à unifier peuvent être des constantes ou des
variables
Unification (2/7)
Avant :
Après :
GN.nombre = x
<attendre>.nombre = y
GN.nombre = x
<attendre>.nombre = x
En fait, après unification, les deux valeurs sont
représentées par des objets distincts mais
équivalents
Plus tard, si une autre unification précise l'une des deux,
cela changera automatiquement l'autre aussi
Unification (3/7)
Formalisation de l'équivalence
Chaque valeur a un champ "ensemble" qui contient un
pointeur
GN.nombre.ensemble := 0
<attendre>.nombre.ensemble := GN.nombre
Dans chaque classe d'équivalence, une des valeurs sert
d'élément canonique
Pour la valeur canonique, le champ ensemble est le
pointeur nul
Pour toutes les autres valeurs, le champ ensemble pointe
directement ou indirectement sur la valeur canonique
Unification (4/7)
Unification entre GN.nombre et<attendre>.nombre
Avant :
GN.nombre = "pluriel"
<attendre>.nombre = "singulier"
Après :
GN.nombre = "pluriel"
<attendre>.nombre = "singulier"
L'unification peut échouer
L'algorithme d'unification renvoie un booléen
L'unification est destructrice : elle peut changer les deux
valeurs à unifier, même si l'unification échoue
Unification (5/7)
Unifier deux valeurs a et b, c'est construire une valeur
qui contient toutes les contraintes spécifiées dans a
et dans b en vérifiant qu'elles sont compatibles
Unification (version 1)
booléen unifier(valeur a, valeur b) {
A := trouver-canonique(a) ;
B := trouver-canonique(b) ;
si (A = B) { renvoyer vrai ; }
sinon si (A et B sont la même constante) { renvoyer vrai ; }
sinon si (A ou B est une variable) { unir(A, B) ; renvoyer vrai ; }
sinon { renvoyer faux ; }
}
unir(valeur A, valeur B) {
si A est une variable { A.ensemble := B ; }
sinon { B.ensemble := A ; }
}
Unification (7/7)
trouver-canonique(valeur a)
Renvoie l'élément canonique de la classe d'équivalence de a
unir(valeur A, valeur B)
Fusionne les classes d'équivalence de A et B
Préconditions :
- A et B sont les éléments canoniques de leurs classes d'équivalence
- L'unification entre A et B réussit
Si l'une des deux valeurs est une constante, c'est elle qui doit être
devenir l'élément canonique de l'autre
Cela fait pointer la variable vers la constante
Accord grammatical (1/2)
P
--> GN <attendre> {
GN.nombre = <attendre>.nombre ;
GN.personne = <attendre>.personne ; }
si (unifier(GN.nombre, <attendre>.nombre)
et unifier (GN.personne, <attendre>.personne)) {
l'analyse syntaxique peut continuer }
Accord grammatical (2/2)
GN --> Dét N
{
Dét.nombre = N.nombre ;
GN.nombre = N.nombre ;
GN.personne = "3" ; }
si (unifier(Dét.nombre, N.nombre)
et unifier(GN.nombre, N.nombre)
et unifier(GN.personne, "3")) {
l'analyse syntaxique peut continuer }
GN.personne = "3" n'est pas une simple affectation
Si on connaît GN.personne par une autre équation
avant de traiter cette règle, c'est bien une équation à
vérifier
Avec des RTN
On attache les attributs
- à des noeuds du graphe : $$.nombre
- au graphe : nombre, personne
Fonctionnalité disponible avec Outilex, pas encore avec
Unitex
Unification d'arbres (1/3)
P
--> GN <attendre> {
GN.nombre = <attendre>.nombre ;
GN.personne = <attendre>.personne ; }
On veut regrouper les deux attributs en un seul
P
--> GN <attendre> {
GN.accord = <attendre>.accord ; }
La valeur de l'attribut est maintenant un arbre
Unification d'arbres (2/3)
P
--> GN <attendre> {
GN.accord = <attendre>.accord ; }
GN.accord=
<attendre>.accord=
structure de traits
structure de traits
nombre=
personne=
nombre=
personne=
x
"3"
"singulier"
y
Unification d'arbres (3/3)
GN.accord=
Avant
structure de traits
nombre=
x
personne=
"3"
GN.accord=
Après
structure de traits
nombre=
"singulier"
personne=
"3"
<attendre>.accord=
structure de traits
nombre= personne=
"singulier"
y
<attendre>.accord=
structure de traits
nombre= personne=
"singulier"
"3"
Formalisation des arbres
Un noeud peut être :
- une constante ("singulier")
- une variable
- une structure de traits (feature structure) qui a 0, 1 ou
plusieurs attributs dont les valeurs sont des noeuds
GN.accord=
structure de traits
nombre=
x
personne=
"3"
Unification (version 2)
booléen unifier(noeud a, noeud b) {
A := trouver-canonique(a) ;
B := trouver-canonique(b) ;
si (A = B) { renvoyer vrai ; }
sinon si (A et B sont la même constante) { renvoyer vrai ; }
sinon si (A ou B est une variable) { unir(A, B) ; renvoyer vrai ; }
sinon si (A et B sont des structures de traits) {
unir(A, B) ;
/* B.ensemble := A */
pour chaque trait t de A ou de B {
si (unifier(A.t, B.t) = faux) { renvoyer faux ; } }
renvoyer vrai ; }
sinon { renvoyer faux ; }
}
Résultat de l'unification
Les pointillés représentent les équivalences et pointent
vers le membre canonique
GN.accord=
<attendre>.accord=
structure de traits
structure de traits
nombre=
personne=
nombre=
personne=
x
"3"
"singulier"
y
Subsomption (1/2)
x  "singulier"
"3"  "3"
x subsume "singulier"
"3" subsume "3"
Le cas général subsume le cas particulier
La notation "" s'explique si on considère qu'un
symbole "contient" des spécifications de contraintes
GN.accord=
GN.accord=
structure de traits
structure de traits
nombre=
x
personne=
"3"

nombre=
"singulier"
personne=
"3"
Subsomption (2/2)
Si S1 est une constante :
S1  S2 si et seulement si S1 = S2
Si S1 est une variable : S2 S1  S2
Si S1 est une structure de traits :
S1  S2 si et seulement si pour tout trait t de S1 ou
de S2, S1.t  S2.t
Les contraintes précisées dans S1 doivent être précisées
aussi dans S2 sans contradiction
S2 peut préciser des contraintes supplémentaires
Subsomption et unification
S1  S2 est l'arbre le plus général S3
tel que S1  S3 et S2  S3
S1  S2 spécifie toutes les
contraintes de S1 et de S2
Têtes des constituants
Le mot le plus important de chaque constituant est
appelé sa tête
P
(préfère)
GN
GN
(compagnie)
(Luc)
Det
Luc
préfère
N
(cette)
(compagnie)
cette
compagnie
Grammaires de dépendance
On remplace chaque symbole non terminal par la tête
correspondante, puis on supprime le noeud
redondant
Arbre de dépendance
préfère
préfère
Luc
Luc préfère
compagnie
Luc
cette
compagnie
cette
compagnie
compagnie
cette
Grammaires de dépendance
Informations perdues
- étiquettes des constituants (on compense en
ajoutant des étiquettes aux arêtes)
- ordre des mots (on compense si nécessaire en
ajoutant des contraintes sur l'ordre des mots)
préfère
objet
sujet
compagnie
Luc
déterminant
cette
Lexicalisation
Lorsqu'un mot a des compléments, la forme des
compléments dépend du mot
P
P
P
--> GN <préférer> GN à GN
Luc préfère cette compagnie à la concurrence
--> GN <quitter> GN
Luc quitte Paris
--> GN <partir> Prép GN Luc part pour Toulouse
Nombre de compléments
Prépositions devant les compléments
Grammaire lexicalisée
Chaque règle comporte au moins un mot du lexique (la
tête en général)
Nombre de règles = nombre de mots x nombre de
constructions
Grammaires non lexicalisées
On regroupe tous les mots qui entrent dans une même
construction
On fait une règle commune
P --> GN V GN à GN { V.N1àN2 = "+" ; }
P
P
Luc préfère cette compagnie à la concurrence
--> GN V GN { V.N1 = "+" ; }
Luc quitte Paris
Luc préfère cette compagnie
--> GN V Prép GN {
V.PrépN1 = "+" ; V.Prép = Prép ; }
Luc part pour Toulouse
Analyse 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
Ascendants
Descendants
Programmation dynamique
Cascade de transducteurs
L'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
Les 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
P --> GN <aimer> . GN
0-3
GN
GN
0
Det
N
<le>
<orchestre>
1
Det
<aimer>
2
N
<ce> <mélodie>
3
4
5
Les sous-arbres
Exemple 2
P
GN --> Det N .
0-2
Det
N
<le>
<orchestre>
Exemple 3
GN --> . Det N
3-3
GN
GN
0
1
Det
<aimer>
2
N
<ce> <mélodie>
3
4
5
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
L'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 --> P
Début P0 --> . P
0-0
Fin
P0 --> 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
L'algorithme
analyseur.table[0].enfiler(P0 --> . P, 0, 0)
pour i de 0 à n
pour chaque sousArbre dans table[i]
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.table[n].contient(P0 --> P ., 0, n)
analyseur.construireArbres(n)
L'algorithme
compléter(B --> w ., j, k) :
pour chaque (A --> u . B v, i, j) dans table[j]
table[k].enfiler(A --> u B . v, i, k)
vérifier(A --> u . t v, i, j) :
si t correspond à token[j]
table[j + 1].enfiler(A --> u t . v, i, j + 1)
prédire(A --> u . B v, i, j) :
pour chaque (B --> w) dans règles(B)
table[j].enfiler(B --> . w, j, j)
Algorithme d'Earley et RTN
Woods (1969) a adapté l'algorithme d'Earley aux RTN
Synonymes
C'est un gros avion
C'est un gros achat
Luc est trop gros 
C'est un grand avion
?C'est un grand achat
Luc est trop grand
Critère
Possibilité de remplacer un mot par l'autre dans au
moins un contexte sans "trop" changer le sens
Réseau sémantique
Comme un lexique mais
- plusieurs entrées différentes pour un mot ambigu
- une seule entrée pour plusieurs synonymes
Exemples d'entrées
1. couillon - gogo - naïf - pigeon
2. bar - loup - loup de mer - perche de mer
3. bar - bistro - brasserie - café - estaminet
Une entrée = un ensemble de synonymes (synset)
Membres d'un synset
- lemmes et non formes fléchies
- mots et non tokens (loup de mer : mot composé)
Relations sémantiques
Relations entre synsets
X est une sorte de Y
bar - loup - loup de mer - perche de mer
poisson - poiscaille
animal - bête
Z
Y est une sorte de X
bar - bistro - brasserie - café - estaminet X
bar à vins
Y
Hyponyme - hyperonyme
X
Y
Relations sémantiques
X est une partie de Y
mets - plat
repas
Y est une partie de X
poiscaille - poisson
écaille
nageoire
ligne latérale
ouïe
Méronyme - holonyme
Relations sémantiques
contraire
gagnant - vainqueur
perdant
Antonyme
WordNet
Anglais
Version 3.0 : 120 000 synsets
Miller, 1995 - Fellbaum, 1998
Le réseau sémantique le plus utilisé au monde
Développement à partir de 1985 - Première version
1991
4 sous-réseaux : noms, verbes, adjectifs, adverbes
WordNet
Principales relations entre synsets
est un
est un
instance
partie
membre
similaire
V/V
N/N
N/N
N/N
N/N
A/A
exhale/breathe; inhale/breathe
cat/feline
Eiffel Tower/tower
France/Europe
France/European Union
dying/moribund
WordNet
Principales relations entre lemmes
contraire
A/A
appartenance
appartenance
dérivé
N/V
dérivé
A/N
good/bad
A/N academic/academia
Adv/A boastfully/boastful
killing/kill
dark/darkness
Hyperonymes
Le synset de breathe est un hyperonyme de ceux de exhale
et inhale
Le synset de feline est un hyperonyme de celui de cat
Un synset a souvent un seul synset hyperonyme, mais peut
en avoir plusieurs
Exemple
eat "manger" a deux hyperonymes :
eat "prendre un repas" (contestable)
et
consume/ingest/take in/take/have
Le synset de cat est un hyponyme de celui de feline
Hyperonymes
timepiece/timekeeper/horologe
atomic clock
watch/ticker
ammonia clock
sandglass
sundial
caesium clock
timer
clock
alarm clock/alarm
hourglass
egg timer
chronograph
...
...
stopwatch/stopo watch
parking meter
Coordonnés
Coordonnés d'un synset : les synsets qui ont un même
hyperonyme
Coordonnés de watch/ticker
atomic clock
clock
sandglass
sundial
timer
Les coordonnés d'un synset ne sont pas directement
accessibles par les fonctions NLTK d'accès à WordNet
Rechercher les hyperonymes puis les hyponymes
Autres WordNets
• EuroWordNet
Français (23 000 synsets), anglais, néerlandais, italien,
espagnol, allemand, tchèque, estonien
Liens entre langues et avec l'anglais
• BalkaNet
Tchèque, roumain, grec, turc, bulgare, serbe
Téléchargement