Пример с Полом Диксоном великолепен.Поскольку OP использует Python, я подумал, что я бы добавил небольшой пример того, как вы можете «запускать» преобразователи с Открытой оболочкой Python FST .Обидно, что вы не можете создать «линейные автоматы с цепями» с помощью Open FST, но это просто автоматизировать, как показано ниже:
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
Давайте определим простой преобразователь, который заглавными буквами «a»:
f_ST = fst.SymbolTable()
f_ST.add_symbol("<eps>", 0)
f_ST.add_symbol("A", 1)
f_ST.add_symbol("a", 2)
f_ST.add_symbol("b", 3)
compiler = fst.Compiler(isymbols=f_ST, osymbols=f_ST, keep_isymbols=True, keep_osymbols=True)
print >> compiler, "0 0 a A"
print >> compiler, "0 0 b b"
print >> compiler, "0"
caps_A = compiler.compile()
caps_A
![enter image description here](https://i.stack.imgur.com/wOBcO.png)
Теперь мы можем просто применить преобразователь, используя:
apply_fst(list("abab"), caps_A)
Выход: ![enter image description here](https://i.stack.imgur.com/ahgHF.png)
Чтобы увидеть, как использовать его для акцептора, посмотрите на мой другой ответ