2012-02-22 24 views
13

Trước khi tôi bắt đầu, lưu ý rằng tôi đang sử dụng vỏ linux (thông qua using subprocess.call() từ Python) và tôi đang sử dụng openFST.Làm thế nào để bạn thậm chí có thể cung cấp đầu vào FST (openFST)? Đầu ra ở đâu?

Tôi đã chọn lọc tài liệu và câu hỏi về openFST, nhưng dường như tôi không tìm được câu trả lời cho câu hỏi này: làm thế nào để thực sự cung cấp đầu vào cho FST được xác định, biên soạn và soạn thảo? Đầu ra ở đâu? Tôi chỉ cần thực hiện 'fstproject'? Nếu vậy, làm thế nào tôi có thể cho nó một chuỗi để chuyển tải, và in ra nhiều sự truyền tải khác nhau khi đã đạt được trạng thái kết thúc?

Tôi xin lỗi nếu câu hỏi này có vẻ hiển nhiên. Tôi chưa quen với openFST.

Trả lời

18

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 
+0

Đâ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! –

+0

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

Các vấn đề liên quan