• Aucun résultat trouvé

7.3 L’interface wfst.pl

7.3.3 L’interface

} else { [$type, $children]; } }

Les nœuds de l’arbre sont des op´erateurs (premier param`etre de la fonction) et les feuilles de l’arbre sont des arcs, construits au fur et `a mesure de l’analyse des symboles et des poids de l’expression. La fonction tree permet d’obtenir un arbre compact tout en maintenant une description simple de la grammaire.

On a vu dans la section 7.1 que les poids aussi bien que les items pouvaient ˆetre red´efinis ; et leur syntaxe dans une expression r´eguli`ere d´epend de leur nature exacte. C’est pourquoi les classes WFST::Weightet WFST::Item d´efinissent leur propre r`egle de grammaire weight et item, qui est utilis´ee par la suite pour remplacer le moignon laiss´e dans la grammaire principale. Ainsi, si l’on utilise des poids du demi-anneau tropical et les items par d´efaut (les seuls disponibles actuellement), ce qui est la situation vue dans le chapitre 5, on a les r`egles de grammaire suivantes :

item : "0" {new WFST::Item::Epsilon}

| "." {new WFST::Item::Default} | /([1-9a-zA-Z\x80-\xff]|\\\\u[\da-f]{1,4}|\\\\.)+/i {$item[1] =~ s/\\\\u([\da-f]{1,4})/ WFST::Regex::ucs2utf8(hex $1)/gexi; $item[1] =~ s/\\\\(.)/$1/g; new WFST::Item($item[1])} | /\"((?:[^\\\\\"]|(?:\\\\.))+)\"/ {(my$str=$1) =~ s/\\\\(.)/$1/g; new WFST::Item($str)} weight : /\-?\d*\.?\d+/ {$WFST::wref->new(0+$item[1])}

7.3.3 L’interface

Il reste un dernier « moignon » dans la grammaire d’expressions r´eguli`eres : la r`egle net. Celle-ci indique la syntaxe permettant de faire r´ef´erence `a un transducteur pr´ec´edemment d´efini. Dans wfst.pl, une expression r´eguli`ere peut ˆetre affect´ee `a une variable (de la forme $var) ; cette variable fait ensuite r´ef´erence au transducteur compil´e pour cette expression r´eguli`ere. La partie de la grammaire correspondante est alors :

net: var { ::fetch_var($item[1]) }

var: ’$’ <skip:""> id { $item[3] } id : /[^\W\d][\w]*/

L’utilisation premi`ere de l’interface est la construction de transducteurs en les d´ecrivant par des expressions r´eguli`eres pond´er´ees en suivant la syntaxe du chapitre 5. Les transducteurs ainsi cr´e´es peuvent ˆetre enregistr´es dans un fichier pour ˆetre lus et ult´erieurement par l’interface ou par un programme d’analyse qui s’en servira comme donn´ee. Une autre utilisation est l’application de ces transducteurs `a d’autres transducteurs ou `a des chaˆınes de caract`eres pour l’analyse ou la g´en´eration. L’interface est interactive et se pr´esente comme un shell de commandes classique. On peut ainsi exp´erimenter, corriger des erreurs, faire des tests, etc. comme dans l’exemple de session suivant :

[wfst] $romain_1 = regex i/1 | i i 0/2 | i i i 0/3 | i v 0/4 | v/5 "net0", 4 ´etats, 5 arcs, 5 chemins.

[wfst] $romain_2 = read "romain2.wfst" "net1", 6 ´etats, 7 arcs, 5 chemins.

7.3 L’interface wfst.pl 159

"net2", 6 ´etats, 9 arcs, 10 chemins. [wfst] name $romain "Chiffres romains"

"Chiffres romains", 6 ´etats, 9 arcs, 10 chemins. [wfst] save $romain "romain.wfst"

"Chiffres romains", 6 ´etats, 9 arcs, 10 chemins. [wfst] lookup "iv" in $romain

iv/4

[wfst] lookup $romain

look up "Chiffres romains" > viii viii/8

look up "Chiffres romains" > /0

look up "Chiffres romains" > xix look up "Chiffres romains" > ^D [wfst] quit

Chaque commande est pr´ec´ed´ee d’une invite, qui est par d´efaut [wfst]. La premi`ere commande cr´ee un nouveau transducteur pour les chiffres 1 `a 5 ; le r´esultat produit est un transducteur nomm´e net0 ayant 4 ´etats, 5 arcs et 5 chemins. On n’affiche que la « signature » du transducteur r´esultat, qui permet de se rendre compte rapidement si le r´esultat obtenu semble conforme `a ce que l’on attend. La suite de la construction se fait en lisant un transducteur pr´ealablement enregistr´e, contenant les nombres 6 `a 10, puis on construit l’automate final en faisant l’union des deux, on donne un nom `a cet automate et on l’enregistre dans un fichier.

La suite consiste `a tester cet automate en le consultant (lookup). On peut consulter une chaˆıne `a la fois, ou entrer dans une boucle de reconnaissance. L’invite change alors pour indiquer un mode d’interaction diff´erent. Pour chaque chaˆıne de caract`eres, les chemins trouv´es sont affich´es suivis de leur poids.

wfst.placcepte un argument optionnel --script, qui lit un fichier et non l’entr´ee standard pour ses commandes. On peut ainsi automatiser certaines tˆaches comme la construction d’un transducteur. Une fois le script enti`erement lu, le contrˆole repasse `a l’utilisateur, `a moins que le script comporte un commande quit qui termine l’application.

Les commandes de l’interface sont r´esum´ees dans la table 7.1.

On revient bri`evement sur les commandes regex et regex. La commande regex compile un transducteur et le minimise, le nettoie et renum´erote les ´etats. Cependant, tous les transducteurs pond´er´es ne sont pas minimisables (car non d´eterminisables), et pour l’instant, cette propri´et´e n’est pas test´ee a priori : la cr´eation du transducteur peut ne pas terminer. Une commande qui se contente de compiler le transducteur est n´ecessaire, c’est la commande regex.

Une fois le transducteur ainsi compil´e, on peut ´etudier l’effet des diff´erentes op´erations sur le transducteur, normalement effectu´ees automatiquement : suppression des epsilon-transitions, re-num´erotation des ´etats, suppression des ´etats et transitions non connexes, etc.

Conclusion

Au total, la programmation de cette biblioth`eque en Perl est divis´ee en une dizaine de fichiers pour un total de 3600 lignes, y compris l’interface wfst.pl. La compilation des transducteurs peut ˆetre assez lente `a partir d’une certaine taille (de l’ordre de plusieurs secondes pour quelques milliers de lignes), mais l’ex´ecution est relativement rapide.

Un inconv´enient de l’utilisation de Perl est que la taille m´emoire utilis´ee pour stocker un trans-ducteur sous forme compil´ee est environ dix fois plus importante que pour l’impl´ementation d’AT&T

160 Une biblioth`eque exp´erimentale de calcul `a ´etats finis pond´er´es

Commande Effets

vars liste toutes les variables d´efinies

delete supprime les variables donn´ees en argument

weights rappelle le type de poids des transducteurs

= affecte une valeur `a une variable (chaˆıne de caract`eres ou transducteur)

load charge un transducteur depuis un fichier

import wfsa importe un automate au format AT&T

import wfst importe un transducteur au format AT&T

export exporte un transducteur au format AT&T (poids « tropicaux »)

save enregistre un transducteur

draw enregistre un transducteur au format dot

dump affiche le transducteur au format textuel vu dans la section 7.1.3

regex compile une expression r´eguli`ere et renvoie un transducteur minimal

regex compile une expression r´eguli`ere et renvoir un transducteur « brut »

trim nettoie un transducteur pour qu’il soit connect´e

determinize d´eterminise un transducteur

minimize minimise un transducteur

reverse renverse un transducteur (un seul ´etat initial)

preverse renverse un transducteur (plusieurs ´etats initiaux)

epsilon supprime les epsilon-transitions dans un transducteur

renum renum´erote les ´etats dans un transducteur

name donne un nom `a un transducteur

lookup applique le transducteur de bas en haut (analyse)

lookdown applique le transducteur de haut en bas (g´en´eration)

random g´en`ere des chemins al´eatoires

quit quitte l’interface

7.3 L’interface wfst.pl 161

du fait de la repr´esentation des variables en Perl. Un bon exemple est le format de sauvegarde des transducteurs compil´es. En utilisant le module de s´erialisation Storable (disponible sur CPAN, et en standard depuis la version 5.8 du langage), on peut sauver un objet de la classe WFST::Network dans un fichier binaire. La taille d’un tel fichier est plus de dix fois plus importante que le mˆeme fichier sauv´e par XFST ou FSM. Ce n’est pas r´edhibitoire pour un prototype de test mais on perd tout de mˆeme l’avantage de la compacit´e des ressources linguistiques exprim´ees sous cette forme.

Par contre, un avantage est la facilit´e de d´evelopper une interface dans le mˆeme langage et d’ajouter dynamiquement de nouvelles classes d’objets et de poids.

Chapitre 8

Exp´erimentation avec les transducteurs d’´etats finis pond´er´es

Introduction

Pour illustrer l’utilisation du prototype vu dans le chapitre pr´ec´edent, on donne ici deux exemples de reconnaissance de langages : un langage de parenth`eses et un langage d’expressions r´eguli`eres.

8.1 Expressions parenth´es´ees

Note : dans ce premier exemple, on a omis les poids des transitions et des ´etats finals dans les figures.