Một cách là tạo máy của bạn thực hiện phép chuyển đổi. Một ví dụ rất đơn giản sẽ là trường hợp trên một chuỗi.
M.wfst
0 0 a A
0 0 b B
0 0 c C
0
Các biểu tượng tập tin đính kèm có chứa một đường thẳng cho cho mỗi ký tự của bảng chữ cái. Chú thích 0 được dành riêng cho quá trình chuyển đổi null (epsilon) và có ý nghĩa đặc biệt trong nhiều thao tác.
M.syms
<epsilon> 0
a 1
b 2
c 3
A 4
B 5
C 6
Sau đó biên dịch máy
fstcompile --isymbols=M.syms --osymbols=M.syms M.wfst > M.ofst
Đối với một chuỗi đầu vào "abc" tạo ra một automata chuỗi tuyến tính, đây là một chuỗi trái sang phải với một hồ quang cho mỗi nhân vật. Đây là người chấp nhận vì vậy chúng tôi chỉ cần một cột cho các ký hiệu đầu vào .
I.wfst
0 1 a
1 2 b
2 3 c
3
Compile như một chất nhận
fstcompile --isymbols=M.syms --acceptor I.wfst > I.ofst
Sau đó soạn các máy và in
fstcompose I.ofst M.ofst | fstprint --isymbols=M.syms --osymbols=M.syms
này sẽ cung cấp sản lượng
0 1 a A
1 2 b B
2 3 c C
3
Đầu ra của fstcompose là một mạng lưới của tất cả các transductions của chuỗi đầu vào. (Trong trường hợp này chỉ có một). Nếu M.ofst là fstshortestpath phức tạp hơn có thể được sử dụng để trích xuất các chuỗi n bằng cách sử dụng các cờ --unique -nshortest = n. Đầu ra này lại là một bộ chuyển đổi, bạn có thể loại bỏ đầu ra của fstprint, hoặc sử dụng mã C++ và thư viện OpenFst để chạy tìm kiếm chiều sâu đầu tiên để trích xuất các chuỗi.
Chèn fstproject --project_output sẽ chuyển đổi đầu ra thành một người chấp nhận chỉ chứa các nhãn đầu ra.
fstcompose I.ofst M.ofst | fstproject --project_output | fstprint --isymbols=M.syms --osymbols=M.syms
Cung cấp sau
0 1 A A
1 2 B B
2 3 C C
3
Đây là một chấp nhận vì đầu vào và đầu ra nhãn đều giống nhau, các tùy chọn --acceptor có thể được sử dụng để tạo ra gọn gàng hơn.
fstcompose I.ofst M.ofst | fstproject --project_output | fstprint --isymbols=M.syms --acceptor
Đây là câu trả lời tuyệt vời và các ví dụ rất hữu ích! Cảm ơn bạn! –
https://stackoverflow.com/questions/47235658/openfst-fstcompose-for-transducing –