ΠΟΛΥΤΕΧΝΕΙΟ ΚΡΗΤΗΣ Τμήμα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Τομέας Τηλεπικοινωνιών Αναπληρωτής Καθηγητής: Αλέξανδρος Ποταμιάνος Ονοματεπώνυμο: Α. Μ. : ΗΜΕΡΟΜΗΝΙΑ: ΤΗΛ 413 : Συστήματα Επικοινωνίας Φυσικής Γλώσσας Εαρινό Εξάμηνο 2007 2 η Εργαστηριακή Άσκηση FSM Toolkit Exercises Part II The following problems are designed to familiarize you with the FSM tools and methods. You should use the tools throughout to solve these problems and to test your solutions. Exercise 1. Given the alphabet {a, b,c z, <space>}, (a) Create a transducer that implements the rot13 cipher a n, b o,, m z, n a, o b,, z m. (b) Encode and decode the message my_secret_message (assume <space> <space>). Exercise 2. Given the alphabet {0, 1,, 9}, (a) Create an automaton that accepts numbers in the range 0 999 (b) Create a transducer that maps numbers (in the range 0 999) represented as strings of digits to their English read form, e.g., 1 one 11 eleven 111 one hundred eleven Exercise 3. Consider the following words and their pronunciations (in ARPABET):
any eh n iy e. iy many m eh n iy men m eh n per p er persons p er s uh n z sons s uh n z suns s uh n z to t uw tomb t uw m too t u two t uw (a) Create a pronunciation lexicon L for these words i.e., the closure of the pronunciation to - word transducer. (b) Using L, find all possible word parsing of the t uw m eh n iy p er s uh n z. Give the result as a graph and as a list of strings. (c) Consider the (improbable) bigram language model that gives the cost of word β being followed by word α as: Cost( a b) = a - b, Where γ is the number of phonemes in the pronunciation of the word γ. Create a weighted acceptor that implements this LM. Find the best parsing of the string in (b) when constrained by this language model. (d) Repeat the last two steps (b) and (c) with the word p er s uh n z HAND OUT Άσκηση 1. (a) Αρχικά πρέπει να δημιουργήσουμε το λεξικό μας το αρχείο δηλαδή που κάνει αντιστοίχηση ανάμεσα στα γράμματα και στις καταστάσεις της μηχανής που θέλουμε να δημιουργήσουμε. Για τον λόγο αυτό αρχικά φτιάχνουμε το αρχείο create_dictionary.pl το οποίο είναι ένα perl script που δημιουργεί το λεξικό μας dictionary.lab. Στη συνέχεια φτιάχνουμε το create_rot13_tranducer.pl για να δημιουργήσουμε και να σχεδιάσουμε τον transducer rot13.fst, rot13.ps. (b) Δημιουργούμε ένα αρχείο με όνομα example το οποίο περιέχει την έκφραση my_secret_message
Στη συνέχεια φτιάχνουμε το αρχείο script1.pl το οποίο διαβάζει το αρχείο example, κάνει extract ένα προς ένα τα γράμματα και δημιουργεί μία fsa μηχανή την test.fsa. Για να κρυπτογραφήσετε το μήνυμα θα πρέπει να κάνετε compose τις δύο μηχανές την test.fsa και την rot13.fst και ονομάστε το αποτέλεσμα encrypt.fst. Τέλος καλέστε την fsmproject -2 και δώστε της είσοδο το παραπάνω αποτέλεσμα του composition. fsmproject -2 encrypt.fsa fsmdraw i dictionary.def dot Tps>encrypt.ps Γράψτε την encrypted λέξη που παρήχθηκε. Για να κάνουμε την ανάποδη διαδικασία το πρώτο που πρέπει να κάνουμε είναι invert τον transducer που δημιουργήσαμε στο πρώτο ερώτημα. Εκτελούμε την εντολή: fsminvert rot13.fst > decrypter.fst; Στη συνέχεια φτιάχνουμε το script2.pl το οποίο διαβάζει το αρχείο encr_example που περιέχει την encrypted εκφραση και δημιουργεί μία fsa μηχανή την ecrypted.fsa. Ακολούθως παίρνουμε το composition της μηχανής αυτής με τον transducer decrypter.fst ή εναλλακτικά το composition του encrypt.fst με την encrypted.fsa> decrypted_ex.fst και τέλος με fsmproject -2 decrypted_ex.fst fsmdraw i dictionary.def dot Tps > decrypted.ex.ps παίρνουμε την έκφραση αποκρυπτογραφημένη. Άσκηση 2. (α) Αρχικά δημιουργούμε ένα FSA το οποίο δέχεται τους αριθμούς 0-9 (0-9.fsa). Στη συνέχεια δημιουργούμε 2 μηχανές όπου η κάθε μία είναι το concatenation της 1-9.fsa μηχανής με την 0-9.fsa αντίστοιχες φορές δηλαδή η πρώτη είναι το concatenation δύο μηχανών της 1-9.fsa με την 0-9.fsa η δεύτερη το concatenation 3 μηχανών της 1-9.fsa με δύο μηχανές στη σειρά 0-9.fsa και ούτω καθεξής. Τέλος παίρνουμε το union και των τριών παραπάνω μηχανών. Γράψτε αναλυτικά την παραπάνω έκφραση που υλοποιήσατε δηλώνοντας το concatenation με. και το union με U χρησιμοποιώντας παρενθέσεις όπου κρίνετε αναγκαίο. (b)
1 st Step: Support zero-99 Αρχικά πρέπει να δημιουργήσουμε τους transducers δέχονται και μετατρέπουν τους παρακάτω αριθμούς. 0.fst, 1-9.fst, 10-19.fst, 20-90.fst, 100-900.fst,, zero.fst Για να δημιουργήσετε τους παραπάνω transducers εκτελέστε το script.pl Στο επόμενο βήμα δημιουργούμε έναν transducer που υποστηρίζει όλους του διψήφιους αριθμούς. Για να το πετύχουμε αυτό εκτελούμε τα παρακάτω βήματα: Παίρνουμε το union των μηχανών zero.fst και 1-9.fst και δημιουργούμε τη μηχανή zero-9.fst Στη συνέχεια κάνουμε το union της 0.fst με την 1-9.fst > 0-9.fst Μετά παίρνουμε το concatenation της 20-90.fst με την 0-9.fst > 20-99.fst Στη συνέχεια παίρνουμε το union των μηχανων zero-9.fst και 10-19.fst και δημιουργούμε τη μηχανή zero-19.fst Στη συνεχεία παίρνουμε το union της zero-19.fst με 20-99.fst > zero- 99.fst κάνοντας πρώτα fsmrmepsilon 2 nd Step: Support 100-999 Αρχικά κάνουμε το concatenation των μηχανών 0.fst με την 1-9.fst > 01-09.fst Στη συνέχεια παίρνουμε το concatenation της 0.fst με τον εαυτό της και δημιουργούμε τη μηχανή 00.fst Μετά παίρνουμε το union της 00.fst με την 01-09.fst > 00-09.fst Μετά παίρνουμε το union της 10-19.fst με την 20-99.fst > 10-99.fst Στο επόμενο βήμα παίρνουμε το union της 00-09.fst μρ την 10-99.fst > 00-99.fst Τέλος παίρνουμε το concatenation της 100-900.fst με την 00-99.fst > 100-999.fst 3 rd Step: Support zero-999 Παίρνουμε το union της zero-99.fst με την 100-999.fst > zero-999.fst Στη συνέχεια δημιουργούμε ένα example αρχείο το οποίο περιέχει τον αριθμό που θέλουμε να μετατρέψουμε σε προφορικό λόγο. Στη συνέχεια τρέχουμε το script2.pl το οποίο διαβάζει το αρχείο example και δημιουργεί τις κατάλληλες μηχανές οι οποίες είναι οι 1def.fsa, 12def.fsa, 123def.fsa
Στο επόμενο βήμα παίρνουμε την σύνθεση των παραπάνω μηχανών με την μηχανή zero-999.fst και στη συνέχεια κάνουμε fsmproject -2 fsmrmepsilon fsmdeterminize fmsminimize και τέλος με την fsmdraw σχεδιάζουμε το αποτέλεσμα. Άσκηση 3. (α) (b) Για να δημιουργήσουμε ένα λεξικό προφοράς θα πρέπει να δημιουργήσουμε ένα transducer για κάθε λέξη με τις προφορές τους και μάλιστα να είναι της μορφής pronunciation to word. Για να δημιουργηθούν οι παραπάνω transducers τρέχουμε το script1.pl. Το script αυτό δημιουργεί τους transducers για κάθε λέξη. Τα ονόματα των transducers είναι όνομα λέξης.fst. Μπορείτε να σχεδιάσετε έναν transducer που κάνει αντιστοίχηση από φωνήματα σε λέξη για να δείτε την μορφή του. Δημιουργήσετε το union των παραπάνω transducers και δημιουργήστε έναν transducer με όνομα tmp.fst καλώντας την fsmunion Στη συνέχεια δημιουργήστε το closure του tmp.fst και δημιουργήστε έναν transducer με όνομα lexicon.fst μέσω της fsmclosure Για το ερώτημα αυτό αρχικά δημιουργούμε ένα fsa το οποίο δέχεται τα συγκεκριμένα φωνήματα. Για την δημιουργία της μηχανής αυτής εκτελούμε το script2.pl το οποίο δημιουργεί την μηχανή με όνομα example.fsa. Στη συνέχεια παίρνουμε το composition της μηχανής αυτής με τον transducer lexicon.fst και δημιουργούμε μία μηχανή με όνομα tempresultb.fst Ακολούθως παίρνουμε το fsmproject -2 tempresultb.fst fsmrmepsilon fsmdeterminize fsmminimize > resultb.fst Τέλος σχεδιάζουμε την μηχανή με την fsmdraw (c) Στο ερώτημα αυτό δημιουργούμε έναν acceptor σε επίπεδο λέξεων. Αντιστοιχεί μία κατάσταση σε κάθε λέξη και, μία κατάσταση για αρχική κατάσταση και μεταβάσεις με κόστη από κάθε σε κάθε λέξη. Τα κόστη υπολογίζονται με βάση τον τύπο που δίνεται στην εκφώνηση της
άσκησης. Για να δημιουργήσουμε την μηχανή αυτή εκτελούμε το script3.pl. H μηχανή που δημιουργείται ονομάζεται bigram.fsa. Στη συνέχεια παίρνουμε το compose των τριών μηχανών με την εξής σειρά: Της μηχανής example.fsa που δημιουργήσαμε στο προηγούμενο ερώτημα με τον transducer που είχαμε δημιουργήσει στο πρώτο ερώτημα και τέλος με την μηχανή bigram.fsa που δημιουργήσαμε στο αμέσως προηγούμενο ερώτημα και δημιουργούμε μία μηχανή την final.fst. Τέλος κάνουμε την διαδικασία fsmproject -2 final.fst fsmrmepsilon fsmbestpath > result.fsa και την σχεδιάζουμε με την fsmdraw. Έτσι παίρνουμε γραφικά όλες τις πιθανές λέξεις (d) Για το ερώτημα αυτό θα πρέπει να δημιουργήσετε αρχικά ένα text αρχείο που να περιέχει την κρυπτογραφημένη λέξη και στη συνέχεια να αλλάξετε κατάλληλα το perl script ( script2.pl ) το οποίο δημιουργεί την fsa μηχανή. Στην συνέχεια συνεχίστε όπως στα δύο τελευταία βήματα του προηγούμενου ερωτήματος.