22

始める前に、私は (Python から) Linux シェルを使用しておりusing subprocess.call()、openFST を使用していることに注意してください。

openFST に関する文書や質問を調べてみましたが、この質問に対する答えが見つからないようです。出力はどこに行きますか?「fstproject」を実行するだけですか? もしそうなら、どのように変換する文字列を与え、最終状態に達したときにさまざまな変換を出力しますか?

この質問が明白に思われる場合は、お詫び申し上げます。私はまだ openFST にあまり詳しくありません。

4

3 に答える 3

24

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
于 2012-03-10T07:30:45.163 に答える