2012-02-22 16 views
13

Prima di iniziare, si noti che sto usando la shell di linux (via using subprocess.call() da Python) e sto usando openFST.Come si dà anche un input FST (aperto con FST)? Dove va l'uscita?

Sto setacciando documenti e domande su openFST, ma non riesco a trovare una risposta a questa domanda: come si può effettivamente dare un input a un FST definito, compilato e composto openFST? Dove va l'uscita? Eseguo semplicemente 'fstproject'? In tal caso, come potrei, ad esempio, dargli una stringa per trasdurre e stampare le varie trasduzioni quando gli stati finali sono stati raggiunti?

Mi scuso se questa domanda sembra ovvia. Non ho ancora molta familiarità con openFST.

risposta

18

Un modo è quello di creare la macchina che esegue la trasformazione. Un esempio molto semplice sarebbe una stringa in maiuscolo.

M.wfst

0 0 a A 
0 0 b B 
0 0 c C 
0 

Il file di simboli di accompagnamento contiene una riga per per ogni simboli dell'alfabeto. Nota 0 è riservata alle transizioni null (epsilon) e ha un significato speciale in molte delle operazioni.

M.syms

<epsilon> 0 
a 1 
b 2 
c 3 
A 4 
B 5 
C 6 

Poi compila la macchina

fstcompile --isymbols=M.syms --osymbols=M.syms M.wfst > M.ofst 

Per una stringa di input "abc" creare un automa a catena lineare, questa è una catena da sinistra a destra con un arco per ogni personaggio. Si tratta di un accettore, pertanto è necessaria una colonna per i simboli di input .

I.wfst

0 1 a 
1 2 b 
2 3 c 
3 

Compilare come accettore

fstcompile --isymbols=M.syms --acceptor I.wfst > I.ofst 

Poi compongono le macchine e stampare

fstcompose I.ofst M.ofst | fstprint --isymbols=M.syms --osymbols=M.syms 

Questo darà l'uscita

0 1 a A 
1 2 b B 
2 3 c C 
3 

L'output di fstcompose è un reticolo di tutte le trasduzioni della stringa di input. (In questo caso ce n'è solo uno). Se M.ofst è più complicato, è possibile utilizzare fstshortestpath per estrarre stringhe di n usando i flag --unique -nshortest = n. Questo output è di nuovo un trasduttore, è possibile eliminare l'output di fstprint oppure utilizzare il codice C++ e la libreria OpenFst per eseguire la prima ricerca di profondità per estrarre le stringhe.

L'inserimento di fstproject --project_output converte l'output in un accettore contenente solo le etichette di uscita.

fstcompose I.ofst M.ofst | fstproject --project_output | fstprint --isymbols=M.syms --osymbols=M.syms 

pronunciato la seguente

0 1 A A 
1 2 B B 
2 3 C C 
3 

Questo è un accettore perché le etichette di ingresso e uscita sono uguali, le opzioni --acceptor possono essere usate per generare output più succinta.

fstcompose I.ofst M.ofst | fstproject --project_output | fstprint --isymbols=M.syms --acceptor 
+0

Questa è un'ottima risposta e gli esempi sono molto utili! Grazie! –

+0

https://stackoverflow.com/questions/47235658/openfst-fstcompose-for-transducing –