【openfst樣例1】Tokenization

安安爸Chris發表於2020-10-10

Execise Data files

樣例中需要的資料來源:
http://www.openfst.org/twiki/bin/view/FST/FstExamples

如果無法訪問,可以在這裡下載

Execise 1 Tokenization

第一個示例將ASCII字元序列轉換為帶有標點符號和去除空格的單詞標記序列。 為此,我們將需要一個詞典換能器,該詞典換能器將從字母對映到其對應的單詞標記。 一種簡單的生成方式是使用OpenFst文字格式。 例如,“Mars”一詞的格式為:

fstcompile --isymbols=ascii.syms --osymbols=wotw.syms >Mars.fst <<EOF
0 1 M Mars
1 2 a <epsilon>
2 3 r <epsilon>
3 4 s <epsilon>
4
EOF

如果出現錯誤提示file = ascii.syms, line = 1Bad non-negative integer "0,可能的原因是ascii.syms檔案和wotw.syms檔案的格式是dos格式的。需要執行
set ff=unix

Mars.fst是二進位制檔案,是不可以直接閱讀的。一般可以通過工具轉成影像來看。

fstdraw --isymbols=ascii.syms --osymbols=wotw.syms -portrait Mars.fst | dot -Tjpg >Mars.jpg

官網上的dot可以直接轉jpg,但是我的版本不是最新的,只能轉ps格式。如果你也不能轉jpg格式的,可以換成ps格式的試一下。

轉成的fst圖片如下,
Execise1

再來兩個例子

“Martian”和“Man”按照上面的方法構建fst檔案

Martian.fst

fstcompile --isymbols=ascii.syms --osymbols=wotw.syms >Martian.fst <<EOF
0 1 M Martian
1 2 a <epsilon>
2 3 r <epsilon>
3 4 t <epsilon>
4 5 i <epsilon>
5 6 a <epsilon>
6 7 n <epsilon>
7
EOF

Man.fst

fstcompile --isymbols=ascii.syms --osymbols=wotw.syms >Man.fst <<EOF
0 1 M Man
1 2 a <epsilon>
2 3 n <epsilon>
3
EOF

合併這三個fst,並生成lexicon.fst

fstunion man.fst Mars.fst | fstunion - Martian.fst | fstclosure >lexicon.fst

fstdraw --isymbols=ascii.syms --osymbols=wotw.syms -portrait lexicon.fst | dot -Tps >lexicon.ps

生成的影像如下,
lexicon.ps
去除epsilon的Arc

fstrmepsilon lexicon.fst | fstdeterminize | fstminimize >lexicon_opt.fst

fstdraw --isymbols=ascii.syms --osymbols=wotw.syms -portrait lexicon_opt.fst | dot -Tps >lexicon_opt.ps

生成等效的,確定的和最小的狀態轉換圖
lexicon_opt.fst

相關文章