On peut spécifier directement un automate en OpenFST au moyen d'un fichier texte donnant les transitions et les états finals de l'automate. L'état initial est le premier état mentionné dans le fichier. Reproduisez le calcul décrit ici en faisant un copier-coller des fichiers et des commandes.
Voici un premier exemple.
1 2 1 1 1 1 1 2 3 2 3 1 3 3 4 3 3 4 4 4
La première ligne dit qu'il y a une transition de l'état 1 à l'état 2 avec le symbole 1. La deuxième ligne nous dit que l'état 1 est un état final.
Supposons que notre fichier texte s'appelle exemple-1.txt
. Il
faut d'abord compiler ce fichier, ce qui produit un fichier binaire au
format interne FSM, que nous allons appeler exemple-1.fst
. La
compilation s'écrit:
fstcompile --acceptor exemple-1.txt > exemple-1.fst
L'option --acceptor
spécifie qu'il s'agit d'un automate et non d'un
transducteur.
On peut obtenir un dessin représentant l'automate avec la commande
suivante (à condition d'avoir installé la librairie graphviz
qui fournit la commande dot
):
fstdraw --portrait --acceptor exemple-1.fst > exemple-1.dot dot -Tpng exemple-1.dot > exemple-1.png
Pour visualiser le résultat, on puet utiliser la commande suivante:
display exemple-1.png
Remarquez que les états ont changé de nom par rapport au fichier: ils on été renumérotés à partir de 0.
On peut voir que cet automate est non-déterministe: il existe deux transitions
avec le symbole 1 depuis l'état initial et il y a deux transition avec le
symbole 3 depuis l'état 3 (renuméroté 2). Si on essaye de minimiser cet
automate (commande fstminimize
), il y a un message d'erreur qui nous
dit que seul un automate déterministe peut être minimisé.
> fstminimize exemple-1.fst > exemple-1-min.fst FATAL: FST is not deterministic
Il faut donc commencer par déterminiser, puis minimiser. Il aurait fallut éliminer les epsilons-transitions en premier, s'il y en vait eu.
fstdeterminize exemple-1.fst > exemple-1-det.fst fstminimize exemple-1-det.fst > exemple-1-min.fst
On peut calculer et visualiser les formes graphiques de ces automates.
fstdraw --acceptor --portrait exemple-1-det.fst > exemple-1-det.dot dot -Tpng exemple-1-det.dot > exemple-1-det.png fstdraw --acceptor --portrait exemple-1-min.fst > exemple-1-min.dot dot -Tpng exemple-1-min.dot > exemple-1-min.png
On peut avoir de l'information sur les automates en utilisant la commande
fstinfo
.
> fstinfo exemple-1.fst fst type vector arc type standard input symbol table none output symbol table none # of states 4 # of arcs 6 initial state 0 # of final states 2 # of input/output epsilons 0 # of input epsilons 0 # of output epsilons 0 # of accessible states 4 # of coaccessible states 4 # of connected states 4 # of connected components 1 # of strongly conn components 2 input matcher y output matcher y input lookahead n output lookahead n expanded y mutable y error n acceptor y input deterministic n output deterministic n input/output epsilons n input epsilons n output epsilons n input label sorted y output label sorted y weighted n cyclic y cyclic at initial state y top sorted n accessible y coaccessible y string n > fstinfo exemple-1-min.fst fst type vector arc type standard input symbol table none output symbol table none # of states 4 # of arcs 5 initial state 2 # of final states 3 # of input/output epsilons 0 # of input epsilons 0 # of output epsilons 0 # of accessible states 4 # of coaccessible states 4 # of connected states 4 # of connected components 1 # of strongly conn components 2 input matcher y output matcher y input lookahead n output lookahead n expanded y mutable y error n acceptor y input deterministic y output deterministic y input/output epsilons n input epsilons n output epsilons n input label sorted y output label sorted y weighted n cyclic y cyclic at initial state y top sorted n accessible y coaccessible y string n
On peut produire la représentation en texte de l'automate avec la commande
fstprint
.
> fstprint --acceptor exemple-1-min.fst 2 0 1 2 0 0 1 0 1 2 0 1 2 3 1 3 4 3