ΠΟΛΥΤΕΧΝΕΙΟ ΚΡΗΤΗΣ Τμήμα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Τομέας Τηλεπικοινωνιών Αναπληρωτής Καθηγητής: Αλέξανδρος Ποταμιάνος Ονοματεπώνυμο: Α. Μ. : ΗΜΕΡΟΜΗΝΙΑ: ΤΗΛ 413 : Συστήματα Επικοινωνίας Φυσικής Γλώσσας Εαρινό Εξάμηνο 2007 3 η Εργαστηριακή Άσκηση
ΜΕΡΟΣ Α ΟΔΗΓΙΕΣ HTK LANGUAGE MODELS EXERCISES Από το HTK Toolkit θα χρειαστείτε το φάκελο htk_cygwin.tar.gz. Εκτελέστε τα ακόλουθα: gunzip d htk_cygwin.tar.gz tar xf htk_cygwin.tar Δημιουργείται ο φάκελος htk. Μπείτε στο htk/hlmtools. Εκτελέστε: make all Δημιουργείται ο φάκελος bin.win32 που περιέχει κάποια εκτελέσιμα αρχεία. Αυτά τα αρχεία είναι τα εργαλεία που θα χρειαστείτε. Προσθέστε τα στο PATH ή αντιγράψτε τα στο bin του Cygwin. Στη συνέχεια κατεβάσετε από το site του μαθήματος το απαιτούμενο υλικό: (α) δυο φακέλους train και test (β) το αρχείο 5k.wlist (γ) το αρχείο generate_random_sentence.pl, το οποίο είναι ένα Perl script Για την συγκεκριμένη εργαστηριακή άσκηση καλείστε να εκπαιδεύσετε δημιουργήσετε unigram, bigram, και trigram language models. Για την εκπαίδευση των μοντέλων δίνονται 49 training αρχεία τα οποία βρίσκονται στο φάκελο train. Για σκοπούς δοκιμής δίνεται 1 αρχείο τα οποίο βρίσκεται στο φάκελο test. Δημιουργήστε ένα φάκελο για την άσκηση αυτή και αντιγράψτε σε αυτόν τους φακέλους test και train καθώς και τα αρχεία 5k.wlist και generate_random_sentence.pl. ΕΠΙΣΚΟΠΗΣΗ ΤΗΣ ΔΙΑΔΙΚΑΣΙΑΣ ΤΗΣ ΔΗΜΙΟΥΡΓΙΑΣ ΜΟΝΤΕΛΩΝ N-GRAM Η διαδικασία για την δημιουργία n-gram language models με την χρήση των HTK Tools περιγράφετε παρακάτω και περιλαμβάνει τρία στάδια. Αρχικά σκανάρετε το training text και η απαρίθμηση των διαφόρων n-gram αποθηκεύετε σε ένα σετ από gram αρχεία. Στο επόμενο στάδιο το οποίο είναι προαιρετικό οι αριθμήσεις στα αρχεία αυτά αλλάζουν για την δημιουργία vocabulary kai class mapping. Τέλος με τα τελικά αυτά gram αρχεία χτίζουμε το LM. Δεδομένου κάποιου text κειμένου η συνάρτηση LGPrep σκανάρει την ακολουθία του κειμένου και υπολογίζει τις απαριθμήσεις των διαφόρων
unigram, bigram, trigram μοντέλων δηλαδή κάθε ένα από αυτά πόσες φορές το συνάντησε. Αυτές οι απαριθμήσεις αποθηκεύονται στα διάφορα gram files. Όλες οι λέξεις και τα σύμβολα γενικά αναπαρίστανται στο ΗΤΚ με μοναδικά id s. Αυτή η αντιστοίχηση ανάμεσα σε λέξεις και id s καταγράφετε σε ένα αρχείο word map. Όταν ξεκινάει η LGPrep παίρνει σαν είσοδο ένα word map αρχείο και κάθε νέα λέξη που συναντά στο κείμενο εισόδου της δίνει ένα νέο id και την προσθέτει στο word map. Προσοχή τα αρχεία gram που υπάρχει η απαρίθμηση των διαφόρων εκφράσεων που συναντήθηκαν στο κείμενο παρουσιάζουν κάποια επικάλυψη δηλαδή έχουν κάποιες κοινές εισαγωγές. Πιο συγκεκριμένα για να δημιουργήσουμε ένα LM όλες οι απαριθμήσεις των n-grams θα πρέπει να εισαχθούν με αύξουσα σειρά έτσι ώστε λέξεις με παρόμοια ιστορία να ομαδοποιούνται. Για το λόγο αυτό δημιουργούμε ένα νέο αντίγραφο αυτών των gram files μέσω της συνάρτησης LGCopy έτσι ώστε τα περιεχόμενά τους να είναι τοποθετημένα διαδοχικά και να μην παρουσιάζουν επικάλυψη με αποτέλεσμα να μπορούν να διαβαστούν σαν ένα stream. Στο επόμενο στάδιο της διαδικασίας δημιουργίας του LM είναι να οριστεί το vocabulary (λεξιλόγιο) του μοντέλου και να μετατραπούν όλα τα n-grams τα οποία περιέχουν OOV λέξεις (out of vocabulary words) έτσι ώστε κάθε λέξη που δεν περιέχεται στο λεξιλόγιο να αντικατασταθεί από κάποιο σύμβολο που αναπαριστά την άγνωστη κλάση. Η διαδικασία αυτή γίνεται ξανά με την χρήση της LGCopy
ΜΕΡΟΣ Β Άσκηση Για την άσκηση αυτή θα πρέπει να εκπαιδεύσετε ένα unigram, ένα bigram και ένα trigram μοντέλο μέσω κάποιου training set και στη συνέχεια για να ελέγξετε πόσο καλό είναι το εκάστοτε μοντέλο σας θα υπολογίσετε το perplexity πάνω στο ίδιο test text για το κάθε μοντέλο. Για την δημιουργία του Language Model ακολουθούμε τα εξής βήματα: Αρχικά δημιουργούμε ένα φάκελο με την εντολή mkdir holmes.0 Η LGPrep αναμένει πάντα να της δοθεί σαν όρισμα κάποιος χάρτης λέξης (word map ). Έτσι για να προετοιμάσετε το πρώτο αρχείο n-gram πρέπει να περάσετε ένα κενό αρχείο word map. Μπορείτε να προετοιμάσετε ένα αρχικό, word map με την χρήση της συνάρτησης LNewMap. Πρέπει να περαστεί το όνομα που χρησιμοποιείτε εσωτερικά στο word map καθώς επίσης και ένα όνομα αρχείων για να το γράψει. Εκτελέστε το ακόλουθο : LNewMap -f WFC Holmes empty.wmap Το switch f WFC λέει στην LNewMap στο αρχείο που θα δημιουργήσει εκτός από την αντιστοίχηση λέξης σε id να έχει και ένα count field για κάθε λέξη που να δείχνει πόσες φορές την συναντήσαμε στο corpus. Θα επεξεργαστούμε τώρα τα κείμενα εκπαίδευσης με την ακόλουθη εντολή: LGPrep -T 1 -a 100000 -b 200000 -d holmes.0 -n 4 -s "Sherlock Holmes" empty.wmap train/*.txt Όταν τελειώσει η διαδικασία ο φάκελος holmes.0 θα πρέπει να περιέχει τα ακόλουθα αρχεία : gram.0, gram.1, gram.2, wmap Τα περιεχόμενα των gram αρχείων μπορούμε να τα δούμε με την εντολή: LGList holmes.0/wmap holmes.0/gram.2 more Για να δημιουργήσουμε gram αρχεία χωρίς επικάλυψη (να μην υπάρχουν δηλαδή κοινά n-grams σε διαφορετικά αρχεία) χρησιμοποιούμε την LGCopy Αρχικά δημιουργήστε έναν νέα φάκελο: mkdir holmes.1 Στην συνέχεια εκτελέστε την εντολή : LGCopy -T 1 -b 200000 -d holmes.1 holmes.0/wmap holmes.0/gram.* Όταν τελειώσει η διαδικασία ο φάκελος holmes.0 θα πρέπει να περιέχει τα ακόλουθα αρχεία : data.0, data1, data.2.
Αντιστοιχίζοντας OOV (out of vocabulary words) λέξεις. Αρχικά δημιουργήστε τον φάκελο lm_5k με την εντολή: mkdir lm_5k Μόλις ορισθεί το λεξιλόγιο του συστήματος, το εργαλείο LGCopy πρέπει να χρησιμοποιηθεί για να φιλτράρει όλες τις λέξεις (OOV). Εκτελέστε την LGCopy ξανά : LGCopy -T 1 -o -m lm_5k/5k.wmap -b 200000 -d lm_5k -w 5k.wlist holmes.0/wmap holmes.1/data.* Επειδή χρησιμοποιήσαμε την επιλογή -ο, όλα τα n-grams που περιέχουν OOVs θα εξαχθούν από τα αρχεία εισαγωγής και οι λέξεις OOV χαρτογραφούνται στο άγνωστο σύμβολο και τα αποτελέσματα αποθηκεύονται στα αρχείαlm 5k/data.*. Ένα νέο word map που περιέχει τα νέα σύμβολα κατηγορίας (!!UNK σε αυτήν την περίπτωση) και τις λέξεις του λεξιλογίου θα δημιουργηθεί στο lm 5k/5k.wmap.
Δημιουργία Language Model Τα Language models χτίζονται χρησιμοποιώντας την εντολή LBuild. Η παρακάτω εντολή θα δημιουργήσει ένα unigram μοντέλο: LBuild -T 1 -n 1 lm_5k/5k.wmap lm_5k/ug holmes.1/data.* lm_5k/data.* Στο φάκελο lm_5k δημιουργείται το αρχείο ug. Τώρα θα δημιουργήσουμε ένα bigram μοντέλο με cut-off 1. Εκτελέστε την εντολή: LBuild -T 1 -c 2 1 -n 2 k 7 lm_5k/5k.wmap lm_5k/bg1 holmes.1/data.* lm_5k/data.* Στο φάκελο lm_5k δημιουργείται το αρχείο bg1. Τελικά το trigram μοντέλο δημιουργείται εκτελώντας την εντολή : LBuild -T 1 -c 3 1 -n 3 k 7 lm_5k/5k.wmap lm_5k/trigram holmes.1/data.* lm_5k/data.* Στο φάκελο lm_5k δημιουργείται το αρχείο trigram. (Εναλλακτικά, προκειμένου να δημιουργήσουμε το trigram μοντέλο, θα μπορούσαμε τα τρία παραπάνω στάδια να τα κάνουμε σε ένα με την εντολή : LBuild -T 1 -c 2 1 -c 3 1 -n 3 k 7 lm_5k/5k.wmap lm_5k/tg2-1_1 holmes.1/data.* lm_5k/data.* Στο φάκελο lm_5k δημιουργείται το αρχείο tg2-1_1.) Αξίζει να αναφερθούμε στο option c το οποίο: «-c n c Set cutoff for n-gram to c» Testing the LM perplexity Αφού δημιουργηθεί το γλωσσικό μοντέλο η ποιότητά του μπορεί αξιολογηθεί μετρώντας το perplexity κειμένου που είναι άγνωστο στο μοντέλο μας. Το perplexity μπορεί να θεωρηθεί ως ένα μέσο μέτρο του πόσες διαφορετικές και με ίση πιθανότητα λέξεις μπορεί να ακολουθήσουν μία λέξη. Ορίζεται ως όπου
Ο φάκελος test περιέχει ένα κείμενο το οποίο έχει δημιουργηθεί για σκοπούς αξιολόγησης. Η αξιολόγηση του perplexity γίνεται με την εντολή LPLex. Εκτελέστε την εντολή: LPlex -n 2 -n 3 -t lm_5k/tg1_1 test/red-headed_league.txt Τα πολλαπλά n swithes δηλώνουν στην LPlex να κάνει δύο ξεχωριστά τεστ. Το πρώτο (-n 2) θα χρησιμοποιήσει μόνο το bigram κομμάτι του μοντέλου μας ενώ το (-n 3) θα χρησιμοποιήσει το trigram. ΜΕΡΟΣ Γ ΠΑΡΑΔΟΤΕΑ Α. Υπολογίστε το perplexity για unigram, bigram, trigram γλωσσικά μοντέλα για το ένα training text και όλα τα test texts (LPlex -n 2 -n 3 -t lm_5k/tg1_1 train/*.txt). TRAIN TEXT Unigram Perplexity Bigram Trigram TEST TEXT Unigram Perplexity Bigram Trigram Συμπληρώστε τον παραπάνω πίνακα. Ερμηνεύστε τις διάφορες του perplexity ως προς τα χρησιμοποιούμενα μοντέλα αλλά και ως προς τα δεδομένα train και test. Β. CREATE RANDOM SENTENCES
Εκτελέστε το script : perl generate_random_sentence.pl grammar.arpa [1 2 3] για να δημιουργήσετε μία random πρόταση χρησιμοποιώντας unigram, bigram, trigram. Ορίζετε το μοντέλο που θα χρησιμοποιήσετε ανάλογα με το όρισμα 1 ή 2 ή 3 που θα δώσετε σαν είσοδο στο script. Για παράδειγμα η εντολή perl generate_random_sentence.pl lm_5k/bg1 2 δημιουργεί μία τυχαία πρόταση με βάση το bigram μοντέλο που φτιάξαμε, χρησιμοποιώντας το αντίστοιχο αρχείο lm_5k/bg1. Δώστε για κάθε μοντέλο 5 παραδείγματα προτάσεων. Τι παρατηρείτε;