まひろ量子のハックログ

プログラミングや機械学習などの知識を記録・共有します

OpenFSTを使ってWFSTを作成・描画してみる (日本語対応)

重み付き有限状態トランスデューサ(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

f:id:twx:20180811160442p:plain

実行には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

同じ出力を得ることができた。 f:id:twx:20180811160442p:plain

Kozuko Mahiro's Hacklog ―― Copyright © 2018 Mahiro Kazuko