• Aucun résultat trouvé

Automates lexicaux

2.5 Opérations ensemblistes sur les masques lexi- lexi-cauxlexi-caux

2.5.3 Calcul de la différence

Nous avons également implémenté le calcul de la différence de deux masques lexicaux, qui est présenté en pseudo-code dans l’algorithme 2. Le résultat de cette opération a la forme générale d’une union de masques lexicaux deux à deux disjoints.

entrée: a et b, deux masques lexicaux

sortie: S, une union de masques lexicaux deux à deux disjoints tels que

l’ensemble décrit par S est exactement l’ensemble décrit par a privé de l’ensemble décrit par b.

1: sicat(a) 6= cat(b) alors

2: retourner {a}

3: fin si

4: S ← ∅

5: m ← a

6: pour tout i, 1 ≤ i ≤ n faire

7: mi ← ai∧ bi 8: simi 6= ∅ alors 9: S ← S ∪ m 10: fin si 11: mi ← ai∧ bi 12: fin pour 13: retourner S

Algorithme 2: Calcul de la différence de deux masques lexicaux

Si la catégorie grammaticale de a est différente de celle de b, alors les deux ensembles qu’ils décrivent sont disjoints et nous retournons la masque a

(ligne 2). Sinon, on initialise le masque m avec la valeur de a (ligne 5). Ce masque m servira à construire de façon incrémentale les masques qui consti-tueront l’ensemble S résultat. On parcourt ensuite l’ensemble des attributs

de a et b ; à la iemeitération, on assigne à mi la valeur représentant l’ensemble

décrit par ai privé de l’ensemble décrit par bi (ligne 7). Si mi est non vide,

alors on rajoute m à l’ensemble S résultat. Puis, on assigne à mi, la valeur

représentant l’intersection des deux ensembles décrits par ai et bi (ligne 11)

et on continue sur la prochaine itération.

Ainsi, l’ensemble S retourné par notre algorithme peut être traduit en nota-tion ensembliste par la disjoncnota-tion suivante :

S = ((a1∧ b1) ∧ a2∧ · · · ∧ an)

∨ ((a1∧ b1) ∧ (a2∧ b2) ∧ · · · ∧ an)

...

∨ ((a1∧ b1) ∧ (a2∧ b2) ∧ · · · ∧ (an∧ bn))

où chaque élément de la disjonction (chaque ligne de l’équation) correspond à un masque de l’ensemble S. Ces masques sont bien disjoints deux à deux. preuve

Pour tout i, j tel que 1 ≤ i < j ≤ n, on a les égalités :

Si = (a1∧ b1) ∧ · · · ∧ (ai ∧ bi) ∧ ... ∧ aj ∧ · · · ∧ an Sj = (a1∧ b1) ∧ · · · ∧ (ai ∧ bi) ∧ ... ∧ (aj ∧ bj) ∧ · · · ∧ an et donc Si ⊆ ai∧ bibi Sj ⊆ ai∧ bi ⊆ bi et donc mi ∧ mj = ∅

D’autre part, nous montrons dans les équations suivantes, que l’ensemble S ainsi calculé décrit bien l’ensemble des mots étiquetés décrits par le masque

amais non par le masque b, ce qui termine la preuve de la correction de notre algorithme.

preuve

L’ensemble S peut être réécrit sous la forme suivante :

S = (a1∧ a2 ∧ · · · ∧ an) ∧ b1

= ∨ (a1∧ a2∧ · · · ∧ an) ∧ b1∧ b2

...

= ∨ (a1∧ a2∧ · · · ∧ an) ∧ b1∧ b2∧ · · · ∧ bn

En factorisant par la conjonction (a1 ∧ a2 ∧ · · · ∧ an) nous obtenons

l’égalité :

S= (a1∧ a2∧ · · · ∧ an) ∧ (b1∨ (b1∧ b2) ∨ ... ∨ (b1∧ · · · ∧ bn−1∧ bn))

= a ∧ (b1 ∨ (b1∧ b2) ∨ ... ∨ (b1∧ · · · ∧ bn−1∧ bn))

= a ∧ (b1 ∨ (b1∧ (b2∨ (b2∧ · · · bn))))

Puisque pour tous prédicats x et y, on a l’égalité :

x∨ (x ∧ y) = x ∨ y

nous pouvons réécrire S sous la forme suivante :

S= a ∧ (b1 ∨ b2∨ · · · ∨ bn)

= a ∧ (b1 ∧ b2∧ · · · ∧ bn)

= a ∧ b

Les lignes suivantes présentent quelques exemples du calcul de la différence d’un masque par rapport à un autre :

(1) <!noir.noun> - <rouge.noun> = < !noir !rouge.noun> (2) <!noir.noun> - <!rouge.noun> = <rouge.noun>

(3) <verb+P> - <verb+1+s> = <verb+P+2> ∨ <verb+P+3> ∨ <verb+P+1+p> (4) <verb+P> - <verb+1+s> = <verb+P+p> ∨ <verb+P+2+s> ∨ <verb+P+3+s> On remarque que les exemples (3) et (4) donnent deux résultats différents

pour la même opération. Cette différence est due au fait que le contenu de l’ensemble S construit dépend de l’ordre choisi par notre algorithme pour parcourir les attributs. Dans la ligne (3), le résultat a été construit en trai-tant d’abord l’attribut de personne, puis l’attribut de nombre. En (4), l’ordre a été inversé. Notons qui si ces résultats sont différents, les ensembles de mots étiquetés qu’ils décrivent sont bien identiques : l’ensemble des verbes conju-gués au présent de l’indicatif, mais non à la première personne du singulier.

2.6 Opérations sur les automates lexicaux

Grâce à cette représentation structurée des masques lexicaux permettant d’implémenter des opérations ensemblistes sur ces objets, nous sommes main-tenant en mesure d’adapter les algorithmes classiques sur les automates finis (tels que définis dans [Hopcroft et Ullman, 1979] par exemple) de manière à ce qu’ils aient un comportement correct sur les automates lexicaux. Les mo-difications apportées à ces algorithmes consistent essentiellement à découper les transitions afin que les ensembles décrits dans leurs étiquettes soient deux à deux soit disjoints, soit égaux. Nous procédons à ce découpage sur les tran-sitions sortantes des états considérés à chaque étape du calcul de manière à ce que deux masques distincts susceptibles d’être comparés ont toujours une intersection vide. Cette propriété est suffisante à la correction de la plupart des algorithmes et nous avons pu ainsi implémenter le calcul de la détermi-nisation, la minimisation ou de l’intersection pour les automates lexicaux. La figure 2.10, par exemple, présente l’automate de la figure 2.2 (page 15) correctement déterminisé.

0 1,2 <avoir.V+P+I+J+F> <être.V+P+I+J+F> 1 <!avoir!être.V+P+I+J+F> <V+K>

Fig. 2.10 – Automate lexical déterministe

Le calcul de la complémentation d’un automate lexical est différent puisqu’il consiste à inverser la terminalité des états de l’automate après l’avoir rendu complet. Pour ce faire nous rajoutons, pour chaque état, de nouvelles tran-sitions sortantes dirigées vers un état puits et étiquetées par l’ensemble du lexique qui n’est pas décrit par les transitions déjà existantes, ensemble qu’il nous est maintenant possible de calculer.

Notons que le calcul de l’union ou de la concaténation de deux automates lexicaux ou encore le calcul de l’étoile de Kleen d’un automate lexical ne nécessitent pas de manipulation particulière sur les transitions.

Dans cette section, après avoir donné une définition formelle des automates que nous manipulons, nous présentons notre algorithme de découpage des transitions, qui prend en entrée un ensemble de transitions et produit en sor-tie un ensemble équivalent tel que les masques qui étiquettent ces transitions soient deux à deux disjoints ou égaux. Nous illustrons ensuite l’intérêt d’un tel découpage en détaillant notre algorithme qui implémente la détermini-sation d’un automate lexical. Nous avons implémenté sur le même principe l’opération d’intersection de deux automates lexicaux.