Как визуализировать преобразователи Pyfst с помощью точечных файлов

Я учусь создавать датчики с помощью Pyfst и пытаюсь визуализировать те, которые я создаю. Конечная цель состоит в том, чтобы иметь возможность записывать преобразователи в точечные файлы и видеть их в Graphviz.

Я взял пример кода, чтобы увидеть, как визуализировать следующий акцептор.

a = fst.Acceptor()
a.add_arc(0, 1, 'x', 0.1)
a[1].final = -1
a.draw()

Когда я использую функцию draw(), которая входит в состав пакета, я получаю сообщение об ошибке:

File "/Users/.../tests.py", line 42, in <module>
a.draw()

File "_fst.pyx", line 816, in fst._fst.StdVectorFst.draw
(fst/_fst.cpp:15487)

File "/Users/.../venv-3.6/lib/python3.6/re.py", line 191, in sub
return _compile(pattern, flags).sub(repl, string, count)

TypeError: cannot use a string pattern on a bytes-like object

Если я попытаюсь написать вышеупомянутый акцептор в .dot через это:

def fst_dot(dot_object, filename):
path, file = split(filename)
new_path = join(dot_files_folder_path, path)
if not os.path.exists(new_path):
    os.makedirs(new_path)
if hasattr(dot_object, 'dotFormat'):
    draw_string = dot_object.dotFormat()
else:
    draw_string = dot_object.draw()
open(join(dot_files_folder_path, filename + ".dot"), "w").write(draw_string)

то также я получаю следующую ошибку:

File "/Users/...tests.py", line 43, in <module>
fst_dot(a, 'acceptor')

File "/Users/...tests.py", line 22, in fst_dot
draw_string = dot_object.draw()

File "_fst.pyx", line 816, in fst._fst.StdVectorFst.draw
(fst/_fst.cpp:15487)

File "/Users/.../venv-3.6/lib/python3.6/re.py", line 191, in sub
return _compile(pattern, flags).sub(repl, string, count)

TypeError: cannot use a string pattern on a bytes-like object

Итак, обе ошибки выглядят одинаково — проблема с draw(). На сайте pyfst говорится, что отрисовка используется для представления датчика в точечном формате.

Не могу понять как исправить ошибку. Любая помощь будет принята с благодарностью.

Я использую OSX и PyCharm.


person nanachan    schedule 19.01.2017    source источник


Ответы (2)


Вы можете попробовать использовать Python2, чтобы увидеть, поможет ли это вообще.

Однако я думаю, что вам будет лучше использовать привязки Python, которые включены в OpenFST 1.5+. Эта библиотека также имеет возможность записи в файлы GraphViz .dot. Документация доступна здесь:

http://www.openfst.org/twiki/bin/view/FST/PythonExtension

person blambert    schedule 20.01.2017
comment
Спасибо, я попробую, однако мой проект должен быть написан на Python 3. Я все еще пытаюсь найти обходной путь для этой проблемы. - person nanachan; 20.01.2017

Я рекомендую вам команду fstdraw из openfst.

после a.write('tmp.fst') в питоне. $ fstdraw tmp.fst > tmp.dot в скорлупе.

ИЗМЕНИТЬ:

Наконец, я обнаружил, что разветвленный pyfst UFAL отлично работает с python3. https://github.com/UFAL-DSG/pyfst

person skarita    schedule 11.04.2017