¿Por qué OpenFST no parece tener el comando ‘ejecutar’ o ‘aceptar’ o ‘transducir’?

He escuchado muchas cosas buenas sobre OpenFST, pero lucho para que funcione. Estoy construyendo un autómata FST (fstcompile) que quiero usar como aceptador para verificar si un conjunto de cadenas coinciden (muy parecidas a expresiones regulares pero con las ventajas proporcionadas por las optimizaciones de los autómatas proporcionadas por OpenFST). Y aquí está la cosa:
¿Cómo comprobar si el autómata resultante acepta una cadena?
Encontré una sugerencia de que la cadena de entrada se convierta en un autómata simple y se componga con el autómata de aceptación para obtener un resultado. Lo encontré muy engorroso y extraño. ¿Hay una forma más fácil (ya sea a través de la línea cmd o Python / C ++)?

Este es un ejemplo rápido de cómo puede probar si un autómata acepta una cadena usando el envoltorio de Python de Open FST . De hecho, tiene que convertir su entrada en un autómata, y Open FST ni siquiera crea este “autómata de cadena lineal” para usted. Afortunadamente, es sencillo automatizar este proceso como se ve a continuación:

def linear_fst(elements, automata_op, keep_isymbols=True, **kwargs): """Produce a linear automata.""" compiler = fst.Compiler(isymbols=automata_op.input_symbols().copy(), acceptor=keep_isymbols, keep_isymbols=keep_isymbols, **kwargs) for i, el in enumerate(elements): print >> compiler, "{} {} {}".format(i, i+1, el) print >> compiler, str(i+1) return compiler.compile() def apply_fst(elements, automata_op, is_project=True, **kwargs): """Compose a linear automata generated from `elements` with `automata_op`. Args: elements (list): ordered list of edge symbols for a linear automata. automata_op (Fst): automata that will be applied. is_project (bool, optional): whether to keep only the output labels. kwargs: Additional arguments to the compiler of the linear automata . """ linear_automata = linear_fst(elements, automata_op, **kwargs) out = fst.compose(linear_automata, automata_op) if is_project: out.project(project_output=True) return out def accepted(output_apply): """Given the output of `apply_fst` for acceptor, return True is sting was accepted.""" return output_apply.num_states() != 0 

Vamos a definir un simple aceptador que solo acepta series de “ab”:

 f_ST = fst.SymbolTable() f_ST.add_symbol("", 0) f_ST.add_symbol("a", 1) f_ST.add_symbol("b", 2) compiler = fst.Compiler(isymbols=f_ST, osymbols=f_ST, keep_isymbols=True, keep_osymbols=True, acceptor=True) print >> compiler, "0 1 a" print >> compiler, "1 2 b" print >> compiler, "2 0 " print >> compiler, "2" fsa_abs = compiler.compile() fsa_abs 

introduzca la descripción de la imagen aquí

Ahora podemos simplemente aplicar el Aceptador usando:

 accepted(apply_fst(list("abab"), fsa_abs)) # True accepted(apply_fst(list("ba"), fsa_abs)) # False 

Para ver cómo usar el transductor, mira mi otra respuesta.