2012-02-22 12 views
13

Antes de comenzar, tenga en cuenta que estoy usando el shell de Linux (a través de using subprocess.call() de Python), y estoy usando openFST.¿Cómo se da una entrada FST (openFST-made)? ¿A dónde va la salida?

He estado revisando documentos y preguntas sobre openFST, pero parece que no puedo encontrar una respuesta a esta pregunta: ¿cómo se puede ingresar una FST abierta, compilada y compilada? ¿A dónde va la salida? ¿Simplemente ejecuto 'fstproject'? Si es así, ¿cómo podría, por ejemplo, darle una cuerda para transducir, e imprimir las diversas transducciones cuando se ha alcanzado el (los) estado (s) final (es)?

Disculpe si esta pregunta parece obvia. No estoy muy familiarizado con openFST hasta el momento.

Respuesta

18

Una forma es crear su máquina que realiza la transformación. Un ejemplo muy simple sería una cadena en mayúscula.

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

El archivo de símbolos de acompañamiento M.wfst Contiene una línea para cada uno de los símbolos del alfabeto. La nota 0 está reservada para transiciones nulas (épsilon) y tiene un significado especial en muchas de las operaciones.

M.syms

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

a continuación, compilar la máquina

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

Para una cadena de entrada "abc" crear una autómatas cadena lineal, esto es una cadena de izquierda a derecha con un arco para cada personaje Este es un aceptador, por lo que solo necesitamos una columna para los símbolos de entrada .

I.wfst

0 1 a 
1 2 b 
2 3 c 
3 

los datos como un aceptor

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

continuación prepare las máquinas de impresión y

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

Esto le dará a la salida

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

La salida de fstcompose es un enrejado de todas las transducciones de la cadena de entrada. (En este caso solo hay uno). Si M.ofst es más complicado, se puede usar fstsestpath para extraer n-strings usando las marcas --unique -nshortest = n. Esta salida es de nuevo un transductor, puede eliminar la salida de fstprint o utilizar el código C++ y la biblioteca OpenFst para ejecutar la primera búsqueda de profundidad para extraer las cadenas.

Insertar fstproject --project_output convertirá la salida en un aceptador que solo contenga las etiquetas de salida.

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

dicta la siguiente

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

Este es un aceptor porque las etiquetas de entrada y salida son los mismos, las opciones --acceptor se pueden utilizar para generar una salida más sucinta.

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

¡Esta es una gran respuesta y los ejemplos son muy útiles! ¡Gracias! –

+0

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

Cuestiones relacionadas