2012-02-22 77 views
13

在我開始之前,請注意我正在使用linux shell(通過Python的using subprocess.call()),並且我正在使用openFST。你甚至可以給一個(openFST製造的)FST輸入?產出在哪裏?

我一直在瀏覽關於openFST的文檔和問題,但我似乎無法找到這個問題的答案:一個實際如何給openFST定義的,編譯和組合的FST提供輸入?產出在哪裏?我只是執行'fstproject'嗎?如果是這樣,我將如何給它一串轉換,並在達到最終狀態時打印各種轉換?

我很抱歉,如果這個問題似乎很明顯。至今我還不太瞭解openFST。

回答

18

一種方法是創建執行轉換的機器。 一個非常簡單的例子是大寫字符串。

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 
+0

這是一個很好的答案,這些例子非常有用!謝謝! – 2016-08-04 06:25:00

+0

https://stackoverflow.com/questions/47235658/openfst-fstcompose-for-transducing – 2017-11-23 08:03:53

相關問題