重み付き有限状態トランスデューサ(WFST)の簡単なサンプルを作って描画してみる。
なお、WFSTの説明は他サイトに譲る。 参考:http://www.openfst.org
以下のような、入力シンボル、出力シンボル、そしてWFSTを定義しよう。
cat sample.ins <eps> 0 あ 1 b 2 c 3 cat sample.ous <eps> 0 x 1 y 2 z 3 cat sample.text.fst 0 1 あ x .5 0 1 b y 1.5 1 2 c z 2.5 2 3.5
次のコマンドで、WFSTがバイナリ形式にコンパイルされる。
fstcompile --isymbols=sample.ins --osymbols=sample.ous sample.text.fst sample.fst
さらに次のコマンドで、コンパイルしたWFSTのグラフ構造を可視化できる。
fstdraw --isymbols=sample.ins --osymbols=sample.ous sample.fst sample.dot && cat sample.dot | perl -pe 's/ \[label = / \[fontname="MS UI Gothic", label = /g' > _ && mv _ sample.dot && dot -Gdpi=1000 -Tpng sample.dot > sample.png && mogrify -rotate 90 sample.png
実行にはgraphvizとimage magickが必要。以下のようにしてインストールしていただきたい。
sudo apt-get install graphviz sudo apt-get install imagemagick
さて、上述の長いコマンドの中で何が行われているのかを紐解こう。
最初の&&までを取り出すと、以下のようになっている。
fstdraw --isymbols=sample.ins --osymbols=sample.ous sample.fst sample.dot
これは、fstdrawというOpenFSTのコマンドを使って、WFSTをdot形式に変換している。dotというのはグラフ構造を記述するための言語のひとつで、graphvizで描画することができる。
次の&&までの区間は以下のようになっている。
cat sample.dot | perl -pe 's/ \[label = / \[fontname="MS UI Gothic", label = /g' > _
ここでは、先程説明したdotファイルの中身をいじって、fontname="MS UI Gothic"という記述を随所に挿入している。デフォルトの状態ではフォントに日本語が含まれていないので文字化けしてしまう。そこで、日本語フォントを使うことを明示することで、きちんと日本語も表示できるようにするのである。
次の
dot -Gdpi=1000 -Tpng sample.dot > sample.png
では、解像度を指定(ここでは1000)して、png形式の画像として保存している。
最後の
mogrify -rotate 90 sample.png
で、画像を90度回転している。デフォルトのままでは、画像が90度傾いた状態になってしまっているので、このような回転補正が必要なのだ。
さて、この長いコマンドを打つのは面倒なので以下のように関数化してみた。
~/.bashrc
に以下を追記した。
fstdraw2() { # Usage: fstdraw2 sample.ins sample.ous sample.fst 1000 fstdraw --isymbols=$1 --osymbols=$2 $3 $3.dot && cat $3.dot | perl -pe 's/ \[label = / \[fontname="MS UI Gothic", label = /g' > _ && mv _ $3.dot && dot -Gdpi=$4 -Tpng $3.dot > $3.png && mogrify -rotate 90 $3.png }
~/.bashrc
を再読込みすると、fstdraw2コマンドが使えるようになる。
試しに使ってみた。引数には、入力シンボル、出力シンボル、コンパイル済WFST、解像度を与える。
fstdraw2 sample.ins sample.ous sample.fst 100
同じ出力を得ることができた。