1 つの方法は、変換を実行するマシンを作成することです。非常に単純な例は、文字列を大文字にすることです。
M.wfst
0 0 a A
0 0 b B
0 0 c C
0
付属のシンボル ファイルには、アルファベットの各シンボルの行が含まれています。注 0 はヌル (イプシロン) 遷移用に予約されており、多くの操作で特別な意味を持ちます。
M.syms
<epsilon> 0
a 1
b 2
c 3
A 4
B 5
C 6
次に、マシンをコンパイルします
fstcompile --isymbols=M.syms --osymbols=M.syms M.wfst > M.ofst
入力文字列 "abc" に対して、線形チェーン オートマトンを作成します。これは、各文字の円弧を持つ左から右へのチェーンです。これはアクセプターであるため、入力シンボルの列のみが必要です。
I.wfst
0 1 a
1 2 b
2 3 c
3
アクセプターとしてコンパイルする
fstcompile --isymbols=M.syms --acceptor I.wfst > I.ofst
次に、マシンを構成して印刷します
fstcompose I.ofst M.ofst | fstprint --isymbols=M.syms --osymbols=M.syms
これにより、出力が得られます
0 1 a A
1 2 b B
2 3 c C
3
fstcompose の出力は、入力文字列のすべての変換のラティスです。(この場合は 1 つしかありません)。M.ofst がより複雑な場合、fstshortestpath を使用して、フラグ --unique -nshortest=n を使用して n 文字列を抽出できます。この出力もトランスデューサです。fstprint の出力を破棄するか、C++ コードと OpenFst ライブラリを使用して深さ優先検索を実行し、文字列を抽出することができます。
fstproject --project_output を挿入すると、出力が出力ラベルのみを含むアクセプターに変換されます。
fstcompose I.ofst M.ofst | fstproject --project_output | fstprint --isymbols=M.syms --osymbols=M.syms
以下を与える
0 1 A A
1 2 B B
2 3 C C
3
入力ラベルと出力ラベルが同じであるため、これはアクセプターです。 --acceptor オプションを使用して、より簡潔な出力を生成できます。
fstcompose I.ofst M.ofst | fstproject --project_output | fstprint --isymbols=M.syms --acceptor