Cours 6 Paires attribut-valeur Structures de traits Unification
Paires attribut-valeur Étiquettes lexicales viendrai [catgram="verbe" lemme="venir" temps="futur" personne="1" nombre="singulier" ] je [catgram="pronom" personne="1" nombre="singulier" ] Contraintes Je viendrai*Tu viendrai*Il viendrai *Je viendrasTu viendras*Il viendras *Je viendras*Tu viendraIl viendra token1.personne = token2.personne token1.nombre = token2.nombre
Paires attribut-valeur avec variables Étiquettes lexicales viendrai [catgram="verbe" lemme="venir" temps="futur" personne=personneVerbe nombre=nombreVerbe ] je [catgram="pronom" personne=personnePronom nombre=nombrePronom ] Les valeurs d'un attribut peuvent être des constantes ou des variables Équations exprimant les contraintes d'accord : token1.personneVerbe = token2.personnePronom token1.nombreVerbe = token2.nombrePronom
Paires attribut-valeur avec structures viendrai [catgram="verbe" lemme="venir" temps="futur" accord= [ personne=personneVerbe nombre=nombreVerbe ] ] je [catgram="pronom" accord= [ personne=personnePronom nombre=nombrePronom ] ] La valeur d'un attribut peut être un ensemble de paires attribut- valeur (récursif) token1.accord = token2.accord
Structures de traits Une structure de traits (feature structure) peut être : - un ensemble de paires attribut-valeur, dans les quelles chaque valeur est une structure de traits - une constante simple ("singulier") - vide (dans le cas d'une valeur inconnue) - un pointeur sur structure de traits Les pointeurs permettent à deux structures de traits d'avoir une partie commune
Exemple avec valeurs inconnues viendrai [catgram="verbe" lemme="venir" temps="futur" personne=(vide) nombre=(vide) ] Utilisation - quand on ne connaît pas les valeurs de la personne et du nombre - exprimer des contraintes indépendantes de ces valeurs
Exemple avec partie partagée viendrai [catgram="verbe" lemme="venir" temps="futur" accord= [personne="1" nombre="singulier" ] ] je [catgram="pronom" accord=(pointeur) ] Le partage entre la structure viendrai et la structure je est équivalent à l'équation token1.accord = token2.accord Pour chaque valeur d'attribut, on aura un contenu (constante ou structure ou vide) et un pointeur (éventuellement nul)
Structures de traits Représentation par un graphe acyclique catgram lemme temps accord contenu : "verbe" pointeur : contenu : "venir" pointeur : contenu : "futur" pointeur : personne temps contenu : "1" pointeur : contenu : "singulier" pointeur : contenu : pointeur : contenu : pointeur :
Structures de traits Chaque noeud du graphe est soit une constante simple, soit un ensemble de traits attribut-valeur Pour chaque valeur d'attribut, on a un contenu et un pointeur Le contenu peut être vide Le pointeur peut être nul Si le contenu n'est pas vide et le pointeur n'est pas nul, c'est le pointeur qui représente la valeur de l'attribut Si S est une structure de traits, deref(S) est le noeud du graphe acyclique trouvé dans le champ pointeur ou dans le champ contenu deref(feature-structure S) if (S.pointer is null) return S.content else return * S.pointer
Unification Unifier deux structures de traits s1 et s2, c'est construire une structure qui contient l'union des informations de s1 et de s2 en supposant qu'elles décrivent la même chose Comparaison d'informations [ nombre="singulier"] = [ nombre="singulier"] [ nombre="singulier"] [ nombre="pluriel"] --> échec [ nombre="singulier"] [ nombre=(vide)] = [ nombre="singulier"]
Exemples Combinaison d'informations [ personne="1"] [ nombre="singulier"] = [personne="1" nombre="singulier"] [ nombre="singulier"] [ (vide) ] = [ nombre="singulier"]
Exemple avec partie partagée dans la même structure [sujet= [catgram="pronom" accord=(pointeur) ] verbe= [catgram="verbe" lemme="venir" temps="futur" accord= [personne="1" nombre="singulier" ] ] ] Représente Je viendrai avec un sujet et un verbe
Exemple d'unification avec pointeurs [ sujet=[ accord=(pointeur) ] verbe=[ catgram="verbe" accord=[ personne="1" nombre="singulier" ] ] ] [ sujet=[ accord=[ personne="1" nombre="singulier" ] ] ] = [ sujet=[ accord=(pointeur) ] verbe=[ catgram="verbe" accord=[ personne="1" nombre="singulier" ] ] ]
Exemple d'unification avec pointeurs [ sujet=[ accord=(pointeur) ] verbe=[ catgram="verbe" accord=[ (vide) ] ] ] [ sujet=[ accord=[ personne="3" nombre="singulier" ] ] ] = [ sujet=[ accord=(pointeur) ] verbe=[ catgram="verbe" accord=[ personne="3" nombre="singulier" ] ] ]
Exemple d'unification sans pointeurs [ sujet=[ accord=[ nombre="singulier" ] ] verbe=[ catgram="verbe" accord=[ nombre="singulier" ] ] ] [ sujet=[ accord=[ personne="3" nombre="singulier" ] ] ] = [ sujet=[ accord=[ personne="3" nombre="singulier" ] ] verbe=[ catgram="verbe" accord=[ nombre="singulier" ] ] ]
Exemple d'échec d'unification [ sujet=[ accord=(pointeur) ] verbe=[ catgram="verbe" accord=[ personne="1" nombre="singulier" ] ] ] [ sujet=[ accord=[ personne="3" nombre="singulier" ] ] verbe=[ catgram="verbe" accord=[ personne="1" nombre="singulier" ] ] ] --> échec
Subsomption S 1 S 2 (S 1 subsume S 2 ) veut dire que S 1 est plus générale que S 2 : - pour tout attribut a de S 1, S 1 (a) S 2 (a) - pour tous chemins c et d de S 1 tels que S 1 (c)=S 1 (d), S 2 (c)=S 2 (d) Toutes les informations présentes dans S 1 sont présentes aussi dans S 2 sans contradictions [ personne="1"] [ personne="1" nombre="singulier"] [ (vide) ] [ nombre="singulier"]
Exemple [ sujet=[ accord=(pointeur) ] verbe=[ catgram="verbe" accord=[ (vide) ] ] ] [ sujet=[ accord=(pointeur) ] verbe=[ catgram="verbe" accord=[ personne="1" nombre="singulier" ] ] ]
Subsomption et unification S 1 S 2 est la structure de traits la plus générale S 3 telle que S 1 S 3 et S 2 S 3 S 1 S 2 contient toutes les informations de S 1 et de S 2
Algorithme d'unification Un algorithme d'unification entre S 1 et S 2 destructif (dans le cas général, il modifie S 1 et S 2 ) Après l'unification, S 1 et S 2 contiennent chacun le résultat de l'unification L'algorithme ajoute des pointeurs entre S 1 et S 2
nombre contenu : "singulier" pointeur : personnecontenu : "1" pointeur : nombre contenu : "singulier" pointeur : données contenu : pointeur : contenu : pointeur : contenu : pointeur : personne contenu : "1" pointeur : personne pointeur : contenu : résultat pointeur : contenu :
Algorithme d'unification unify(featureStructure f1, featureStructure f2) { /* renvoie soit une structure de traits soit "failure" */ f1Node = deref(f1) f2Node = deref(f2) if (f1Node is null) { f1.pointer = f2 ; return f2 ; } else if (f2Node is null) { f2.pointer = f1 ; return f1 ; } else if (f1Node == f2Node) { f1.pointer = f2 ; return f2 ; } else if (both f1Node and f2Node contain feature-value pairs) { for each feature2 in f2Node { feature1 = find or create in f1Node a feature corresponding to feature2 if (unify(feature2.value,feature1.value)=="failure") { return "failure" } } f2.pointer = f1 return f1 } else return "failure" }
données contenu : pointeur : personne contenu : "1" pointeur : personne pointeur : contenu : résultat pointeur : contenu : pointeur : personne contenu : "1" pointeur : personne pointeur : contenu : pointeur : contenu :
données contenu : "1" pointeur : contenu : résultat contenu : "1" pointeur : contenu :
nombre contenu : "singulier" pointeur : données contenu : pointeur : personne contenu : "1" pointeur : personne pointeur : contenu : résultat pointeur : contenu : nombre contenu : "singulier" pointeur : contenu : pointeur : personne contenu : "1" pointeur : personne pointeur : contenu : pointeur : contenu :
nombre contenu : "singulier" pointeur : données contenu : pointeur : personne contenu : "1" pointeur : personne pointeur : contenu : résultat pointeur : contenu : nombre contenu : "singulier" pointeur : contenu : pointeur : personne contenu : "1" pointeur : personne pointeur : contenu : pointeur : contenu : accord pointeur : contenu : accord pointeur : contenu : accord pointeur : contenu : accord pointeur : contenu :
Utilisation pratique viens [catgram="verbe" lemme="venir" temps="futur" accord= [ personne="1" nombre="singulier" ] ] je [catgram="pronom" accord= [ personne="1" nombre="singulier" ] ] On peut représenter une contrainte d'accord par une équation : token1.accord = token2.accord Pour voir si l'équation est vérifiée, on unifie les deux structures de traits Dans ce cas, succès
Utilisation pratique viens [catgram="verbe" lemme="venir" temps="futur" accord= [ personne="2" nombre="singulier" ] ] je [catgram="pronom" accord= [ personne="1" nombre="singulier" ] ] token1.accord = token2.accord Dans ce cas, échec de l'unification Si je est le sujet de viens, viens n'est pas à la 2e personne viens,V:P1sviens,V:P2son lève une ambiguïté