2012-02-22 11 views
13

Zanim zacznę, zauważ, że używam powłoki linuksa (przez using subprocess.call() z Python) i używam openFST.Jak można podać dane wejściowe FST (openFST)? Gdzie idzie wyjście?

Przeszukałem dokumenty i pytania dotyczące openFST, ale nie mogę znaleźć odpowiedzi na to pytanie: w jaki sposób można podać dane wejściowe do zdefiniowanego przez FST, skompilowanego i skomponowanego FST? Gdzie idzie wyjście? Czy po prostu wykonuję "fstproject"? Jeśli tak, to jak, na przykład, dałbym ciąg do transducji i drukowania różnych transdukcji po osiągnięciu stanu końcowego?

Przepraszam, jeśli to pytanie wydaje się oczywiste. Nie jestem jeszcze zaznajomiony z openFST.

Odpowiedz

18

Jednym ze sposobów jest stworzenie maszyny, która wykonuje transformację. Bardzo prostym przykładem może być na przykład wielka litera.

M.wfst

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

Plik symbole towarzyszący zawiera linię dla dla każdego symboli alfabetu. Uwaga 0 jest zarezerwowana dla przejść zerowych (epsilon) i ma specjalne znaczenie w wielu operacjach.

M.syms

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

Następnie skompilować maszynę

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

Dla ciągu wejściowego „abc” stworzyć automaty łańcuch liniowy, to jest od lewej do prawej łańcuch z łuku dla każdej postaci. To jest akceptor, więc potrzebujemy tylko kolumny dla symboli wejściowych .

I.wfst

0 1 a 
1 2 b 
2 3 c 
3 

kompilacji jako akceptora

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

następnie skomponuj maszyn i wydrukować

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

To da wyświetlamy

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

Dane wyjściowe fstcompose są siecią wszystkich transdukcji ciągu wejściowego. (W tym przypadku jest tylko jeden). Jeśli M.ofst jest bardziej skomplikowany, fstshortestpath może być użyty do wyodrębnienia n-strun za pomocą flag --unique -nshortest = n. To wyjście jest ponownie przetwornikiem, możesz albo zepsuć dane wyjściowe fstprint, albo użyć kodu C++ i biblioteki OpenFst, aby uruchomić pierwsze wyszukiwanie w celu wyodrębnienia ciągów.

Wstawienie fstproject --project_output zamieni dane wyjściowe na akceptor zawierający tylko etykiety wyjściowe.

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

daje następujące

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

to akceptora ponieważ etykiety wejściowe i wyjściowe są takie same, te opcje --acceptor mogą być wykorzystywane do generowania wyjścia bardziej zwięzły.

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

To jest świetna odpowiedź, a przykłady są bardzo przydatne! Dziękuję Ci! –

+0

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

Powiązane problemy