一種方法是創建執行轉換的機器。 一個非常簡單的例子是大寫字符串。
M.wfst
0 0 a A
0 0 b B
0 0 c C
0
所附符號文件包含爲字母表中的每個符號的線。注0保留爲空(epsilon)轉換,並且在許多操作中具有特殊含義。
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的輸出是輸入字符串的所有轉換的格。 (在這種情況下只有一個)。如果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
這是一個很好的答案,這些例子非常有用!謝謝! – 2016-08-04 06:25:00
https://stackoverflow.com/questions/47235658/openfst-fstcompose-for-transducing – 2017-11-23 08:03:53