Eric LaporteInstitut Gaspard-Monge
Université de Marne-la-ValléeFrance
http://www-igm.univ-mlv.fr/~laporte/
Analyse syntaxiqueRéseaux sémantiques
Analyse syntaxiqueRéseaux sémantiques
Analyse syntaxique ascendanteAnalyse syntaxique descendanteRéseaux sémantiquesRelations sémantiquesWordNetParcours d'un réseau sémantiqueLevée d'ambiguïtésCooccurrence
Têtes des constituants
Le mot le plus important de chaque constituant est appelé sa tête P
(préfère)
GN(Luc)
préfère
GN(compagnie)
N(compagnie)
Det(cette)
cetteLuc compagnie
Grammaires de dépendanceOn remplace chaque symbole non terminal par
la tête correspondante, puis on supprime le noeud redondant
Arbre de dépendancepréfère
Luccompagnie
cette
préfère
Luc
préfère
compagnie
compagniecette
cetteLuc
compagnie
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
Luccompagnie
cette
sujetobjet
déterminant
LexicalisationLorsqu'un mot a des compléments, la forme des
compléments dépend du motP --> GN <préférer> GN à GN
Luc préfère cette compagnie à la concurrenceP --> GN <quitter> GN Luc quitte ParisP --> GN <partir> Prép GN Luc part pour Toulouse
Nombre de complémentsPrépositions devant les complémentsGrammaire lexicaliséeChaque 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éesOn regroupe tous les mots qui entrent dans une
même constructionOn fait une règle commune
P --> GN V GN à GN{ V.N1àN2 = "+" ; }Luc préfère cette compagnie à la
concurrenceP --> GN V GN { V.N1 = "+" ; }
Luc quitte ParisLuc préfère cette compagnie
P --> GN V Prép GN {V.PrépN1 = "+" ; V.Prép = Prép ; }Luc part pour Toulouse
Analyse syntaxiqueParsingEntrées : une phrase étiquetée et une grammaire
algébriqueSorties : le ou les arbres de dérivation de la phrase
AlgorithmesAscendantsDescendantsProgrammation dynamiqueCascade de transducteurs
TransducteursUn transducteur fini est un automate fini dont les
transitions sont étiquetées par des couples de séquences : une séquence d'entrée, une séquence de sortie
Entrée : brrr ! Sortie : pfff !Etats : 0 1 2 3 4Transitions : 0b/p1 1r/f2 2r/f3 3/2 3!/!4Etats initiaux : 0Etats finaux : 4
0 1 2 3 4b/p r/f r/f !/!
/
TransducteursLes règles d'une grammaire algébrique peuvent
être représentées par des transducteursExemple : GN --> Det N
@/@ : l'ensemble des couples a/a pour tout symbole a
Entrée : Det N V GN à GN Sortie : GN V GN à GN
0 1 2 3
@/@Det/ N/ /GN
@/@
@/@
Cascade de transducteursMode d'application d'un ensemble de transducteurs à un
ensemble de séquences S0
Entrée : S0 i = 0 ;tant que (condition)
appliquer un transducteurTi aux séquences de Si, obtenir Si+1
i = i+1Sortie : Si
Variantes- on a n transducteurs T1, T2... Tn et on les applique dans
l'ordre- on a un seul transducteur et on l'applique itérativement
jusqu'à ce que Si+1 = Si
Analyse syntaxique par cascade de transducteurs
Entrées : une phrase étiquetée S0 et les transducteurs des règles
i = 0 ;faire
appliquer des transducteurs aux séquences de Si, obtenir Si+1
i = i+1jusqu'à Si-1 = Si
Sortie : Si
Si Si contient l'axiome, S0 est conforme à la grammairePour construire l'arbre de dérivation, il faut marquer les
relations entre les séquences de Si et celles de Si+1
Exemple de grammaire algébrique
P --> GN <disparaître>P --> GN <empirer>P --> GN <orchestrer>
GNP --> GN <aimer> GNGN --> Det NGN --> NprDet --> <le>Det --> <ce>Det --> <un>
Det --> tous les
Det --> toutes les
N --> <mélodie>
N --> <corruption>
N --> <orchestre>
N --> <empire>
Npr --> Luc
Npr --> Anne
Algorithme (1/2)ensSeqArbres = un ensemble de séquences d'arbres videpour chaque combinaison de non-terminaux compatible avec
phraseensSeqArbres.ajouterSeqArbres(combinaison)
tant que ensSeqArbres n'est pas vide nouvEnsSeqArbres = un ensemble de séquences d'arbres videpour chaque seqArbres dans ensSeqArbres seqRacines = seqArbres.seqRacines() pour chaque facteur de seqRacines
pour chaque règle dont le membre droit corresp. à facteur
copieSeqArbres = seqArbres.copier() copieSeqArbres.ajouter(facteur, règle) nouvEnsSeqArbres.ajouter(copieSeqArbres)
Algorithme (2/2)pour chaque seqArbres dans nouvEnsSeqArbres
si seqArbres est un arbre et si sa racine est l'axiome
seqArbres.écrire() nouvEnsSeqArbres.supprimer(seqArbres)
ensSeqArbres = nouvEnsSeqArbres
InconvénientsOn utilise peu la grammaireAvec Les orchestres aiment cette mélodie, toutes
les séquences qui contiennent <orchestrer> suivi de <aimer> sont incompatibles avec la grammaire
Analyse syntaxique descendante
P
GN <disparaître>
P
P
GN <disparaître>
Det NP
GN <disparaître>
Det N
<le>
Les orchestres aiment cette mélodie
Analyse descendante
P
GN <disparaître>
Det N
<le>
P
GN <disparaître>
Det N
<le> <corruption>
P
GN <disparaître>
Det N
<le> <mélodie>
<orchestre>
P
GN <disparaître>
Det N
<le> <empire>
explorationarborescente :on essayeautre chose
Analyse descendante
P
GN <empirer>
P
GN <orchestrer> GN
P
GN <aimer>GN
P
GN <disparaître>
Npr
etc.
Arbre produit
P
GN
<aimer>
GN
Det N Det N
<le> <orchestre><ce> <mélodie>
Analyse descendantephrase.desc(arbre, feuilleCourante, tokenCourant) :
pour chaque feuille1 à partir de feuilleCourantesymbole = feuille1.étiquettesi symbole est terminal
si symbole est compatible avec tokentoken = phrase.suivant(token)
sinon détruire arbre ; sortir de la fonctionsinon si symbole est une variable
pour chaque règle dont le membre gauche est symbole
copieArbre = arbre.copier()feuille2 = équivalent de feuille1 dans
copieArbre copieArbre.ajouter(règle, feuille2)feuille3 = copieArbre.premierFils(feuille2)phrase.desc(copieArbre, feuille3, token)
sortir de la fonctionarbre.écrire()
InconvénientsOn utilise peu le texteAvec Les orchestres aiment cette mélodie, les 10
premiers arbres contiennent disparaître, qui ne figure pas dans la phrase
On construit plusieurs fois les mêmes sous-arbres
Le sous-arbre pour Les orchestres est construit 4 fois et détruit 3 fois
Boucle en cas de récursivité gaucheUne règle comme GN --> GN Adj lance
l'algorithme dans une boucle infinie
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-arbresUn 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 --> GN <aimer> . GN
0-3
<le> <orchestre> <aimer> <ce> <mélodie>
Det N Det N
GN GN
P
0 1 2 3 4 5
Les sous-arbresExemple 2
GN --> Det N .
0-2
Exemple 3
GN --> . Det N
3-3
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
<le> <orchestre> <aimer> <ce> <mélodie>
Det N Det N
GN GN
P
0 1 2 3 4 5
L'algorithmeOn 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)
AmbiguïtésQuand un mot est ambigu, ses utilisations correspondent à des sens
différentsLuc a perdu la première mancheLa chemise a perdu sa manche gaucheLa pioche a perdu son mancheChaque utilisation correspond à un sens précisVienne est la capitale de l'AutricheVienne est près de ValenceLa Vienne fait partie de la région Poitou-CharentesLa Vienne se jette dans la LoireIl faut absolument qu'il vienne
Synonymes
C'est un gros avion C'est un grand avion
C'est un gros achat ?C'est un grand achat
Luc est trop gros 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émantiqueComme un lexique mais- plusieurs entrées différentes pour un mot ambigu- une seule entrée pour plusieurs synonymes
Exemples d'entrées1. couillon - gogo - naïf - pigeon2. bar - loup - loup de mer - perche de mer3. bar - bistro - brasserie - café - estaminetUne 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émantiquesRelations entre synsets
X est une sorte de Ybar - loup - loup de mer - perche de mer X
poisson - poiscaille Yanimal - bête Z
Y est une sorte de Xbar - bistro - brasserie - café - estaminet X
bar à vins Y
Hyponyme - hyperonyme
Relations sémantiquesX 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 V/V exhale/breathe; inhale/breathe
est un N/N cat/feline
instance N/N Eiffel Tower/tower
partie N/N France/Europe
membre N/N France/European Union
similaire A/A dying/moribund
WordNet
Principales relations entre lemmes
contraire A/A good/bad
appartenance A/N academic/academia
appartenance Adv/A boastfully/boastful
dérivé N/V killing/kill
dérivé A/N 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
clock
sandglasssundial
timer
watch/ticker
ammonia clock
caesium clock
alarm clock/alarmegg timer
hourglass
chronograph
parking meter
stopwatch/stopo watch
...
...
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
Parcours d'un réseau sémantique
Entrée : un synset
Sorties : des ensembles de lemmes "associés" au synset d'entrée
synset.assoc(1) = les hyponymes de synset
synset.assoc(2) = les hyperonymes de synset
synset.assoc(3) = les coordonnés de synset
synset.assoc(4) = les hyponymes des éléments de synset.assoc(3)
pour i de 1 à 4
synset.assocLemmas(i) = union des éléments de synset.assoc(i)
ExempleEntrée : sandglass
synset.assoc(1) = egg timer, hourglasssynset.assoc(2) = timepiece/timekeeper/horologesynset.assoc(3) = atomic clock, clock, sundial, timer, watch/tickersynset.assoc(4) = ammonia clock, caesium clock, alarm clock/alarm,
chronograph, parking meter, stopwatch/stopo watch...
synset.assocLemmas(1) = egg timer, hourglasssynset.assocLemmas(2) = timepiece, timekeeper, horologesynset.assocLemmas(3) = atomic clock, clock, sundial, timer, watch,
tickersynset.assocLemmas(4) = ammonia clock, caesium clock, alarm clock,
alarm, chronograph, parking meter, stopwatch, stopo watch...
Levée d'ambiguïtés
Pour chaque mot ambigu, pour chaque occurrence, déterminer le sens précis
ObjectifsRecherche d'informations, traduction...Le sens précis sera représenté par un synsetHypothèseBeaucoup de voisins d'un mot sont des hyponymes, des
hyperonymes ou des coordonnésMéthodePour chaque synset contenant le mot ambigu, compter les
hyponymes, hyperonymes et coordonnés dans le voisinage
Cooccurrence
Cooccurrence du premier ordre
Deux mots sont cooccurrents du premier ordre s'ils sont souvent voisins
Exemple : vendre/produit
Cooccurrence du second ordre
Deux mots sont cooccurrents du second ordre s'ils ont souvent les mêmes voisins
Exemple : vendre/acheter
Voisins communs : produit, prix, fournisseur, client...
Cooccurrence du premier ordre
On utilise un corpus de référence qui peut être lemmatisé
Deux mots m1 et m2
On calcule nb_occ(m1), nb_occ(m2)
nb_occ(m1, m2) : nombre d'occurrences de m1 et m2 dans le même paragraphe ou dans le même document ou à une distance inférieure à un seuil (5 à 10 tokens)
nb_occ(m1, m2)/nb_occ(m1) x nb_occ(m2)
valeur comprise entre 0 et 1
Plus m1 et m2 apparaissent souvent ensemble, plus cette valeur se rapproche de 1
Cooccurrence du second ordre
On utilise un corpus de référence qui peut être lemmatisé
Deux mots m1 et m2
On calcule voisins(m1) et voisins(m2), sacs de motsCritères :
- paragraphe ou distance
- différents de m1 ou m2
- catégorie nom ou pertinence D/d(v)On calcule la similarité entre les deux vecteurs (cosinus de l'angle)
Plus m1 et m2 apparaissent avec les mêmes voisins, plus cette valeur est élevée
Levée d'ambiguïtés avec WordNetEntrée : un texte étiqueté et lemmatisé ; WordNet ; un corpus de référence
Sortie : pour chaque mot ambigu du texte, un synset
pour chaque mot du texte
si mot appartient à plusieurs synsets
sélectionner des voisins v de mot dans le texte (critères :
- paragraphe ou distance
- différents de mot
- catégorie nom ou pertinence D/d(v))
pour chaque synset
synset.assoc = union synset.assoc(i) pour i de 1 à 4
synset.score = nombre de v dans synset.assoc
mot.synset = le synset dont synset.score est maximal
Apprentissage supervisé de la levée d'ambiguïtés
On utilise un corpus d'apprentissage dans lequel on a indiqué à la main pour chaque mot ambigu le synset pertinent
Après l'apprentissage, le système appliqué à un nouveau texte choisit pour chaque mot ambigu un des synsets correspondants
Informations utilisées par le système pour choisir
- les nombres d'occurrences de certains mots dans le voisinage (les mots les plus fréquents et pertinents proches du mot ambigu dans le corpus)
- le lemme et la catégorie grammaticale de 2 mots avant et après le mot ambigu
Pour chaque mot ambigu, on recueille les informations o ci-dessus
P(s|o) : probabilité que le synset pertinent soit s connaissant o
Rappel : la formule de Bayes
P(s|o)valeur : entre 0 et 1
argmaxsS P(s|o)la valeur de sS pour laquelle P(s|o) est maximal
P(s|o) P(o) = P(o|s) P(s)formule de Bayes
argmaxsS P(s|o) = argmaxsS P(o|s) P(s) /P(o)
= argmaxsS P(o|s) P(s)car P(o) ne dépend pas de s
Application
o est un vecteur à n composantes o1 ... on
argmaxsS P(s|o) = argmaxsS P(o|s) P(s)
argmaxsS P(s) 1inP(oi|s)
On estime ces valeurs à l'aide du corpus d'apprentissage :P(s) = nb_occ(s, mot)/nb_occ(mot)nb_occ(s, mot) : nombre d'occurrences de mot avec le sens s
P(oi|s) = nb_occ(oi, s)/nb_occ(s)
nb_occ(oi, s) : nombre d'occurrences du sens s où la ie composante du vecteur vaut oi
Apprentissage non supervisé
On n'utilise pas de réseau sémantique
Apprentissage
On associe à chaque occurrence du mot dans un corpus d'apprentissage un vecteur qui représente ses voisins (critères :
- paragraphe ou distance
- différents du mot
- catégorie nom ou pertinence D/d(v))
On met chaque vecteur dans un groupe-singleton
Itérativement, on fusionne les deux groupes les plus proches si leur similarité (cosinus de l'angle entre les vecteurs) est supérieure à un seuil
On s'arrête quand toutes les similarités sont inférieures au seuil
Apprentissage non supervisé
Chaque groupe représente un sens
Levée d'ambiguïtés
Pour une occurrence du mot dans un nouveau texte
- on représente ses voisins par un vecteur (comme pour l'apprentissage)
- on compare le vecteur à chacun des groupes
On choisit le sens correspondant au groupe le plus similaire au vecteur
Apprentissage non supervisé et WordNet
Graphe de similarité
Noeuds : les mots
Arcs : relient les paires de mots dont la similarité (cooccurrence du second ordre dans le corpus de référence) est supérieure à un seuil
Les arcs sont étiquetés par ces similarités
Classes dans le texte
Sélectionner des mots du texte à traiter (catégorie nom, ou fréquence, ou pertinence)
Relier ces mots par les mêmes arcs que dans le graphe de similarité
Chaque composante connexe du graphe obtenu définit un groupe
Apprentissage non supervisé et WordNet
Comparaison à WordNet
Pour chaque groupe, sélectionner les synsets dont la similarité avec la classe (similarité des vecteurs) est supérieure à un seuil
Si un seul synset est sélectionné, on associe au synset tous les mots qui appartiennent à la fois au groupe et au synset