ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΜΑΘΗΜΑ: ΕΡΓΑΣΤΗΡΙΟ ΤΕΧΝΗΤΗΣ ΝΟΗΜΟΣΥΝΗΣ (Prolog) ΕΞΑΜΗΝΟ: Δ - Εαρινό 2013-14 ΚΑΘΗΓΗΤΕΣ: Δ.ΣΤΑΜΑΤΗΣ, Κ.ΔΙΑΜΑΝΤΑΡΑΣ ΑΣΚΗΣΗ 11: ΕΠΕΞΕΡΓΑΣΙΑ ΦΥΣΙΚΗΣ ΓΛΩΣΣΑΣ - ΣΥΝΤΑΚΤΙΚΗ ΑΝΑΛΥΣΗ (PARSING) Η συντακτική ανάλυση είναι το πρώτο βήμα για την κατανόηση μιας γλώσσας φυσικής ή μη-φυσικής. Φυσικές γλώσσες είναι αυτές που ομιλούνται από ανθρώπους όπως πχ. τα Ελληνικά ή τα Αγγλικά, ενώ μη-φυσικές είναι αυτές που χρησιμοποιούνται πχ. για τον προγραμματισμό των υπολογιστών (Java, C/C++, Prolog, κλπ). Η συντακτική ανάλυση συνίσταται σε δύο λειτουργίες (α) στην αναγνώριση της συντακτικής ορθότητας μιας πρότασης (είναι δηλαδή η πρόταση συντακτικά ορθή ή όχι;) και (β) στην ανάθεση του σωστού ρόλου σε κάθε όρο (λέξη) της πρότασης στην περίπτωση που αυτή είναι όντως συντακτικά ορθή. Για παράδειγμα, στην Ελληνική γλώσσα η συντακτική ανάλυση της πρότασης Ο Γιάννης είδε τη Μαρία (α) αποφαίνεται ότι η πρόταση είναι συντακτικά ορθή, και (β) κάνει την ακόλουθη αντιστοίχηση των λέξεων με το συντακτικό τους ρόλο: Ο Γιάννης είδε τη Μαρία (όνομα) (ρήμα) (όνομα) Αντίστοιχα, η συντακτική ανάλυση για την παρακάτω πρόταση Είδες τον Γιάννη η Μαρία Υποκείμενο Αντικείμενο θα μας έλεγε ότι αυτή είναι συντακτικά λανθασμένη και επομένως δεν είναι δυνατή η αντιστοίχηση των λέξεων με κάποιο συντακτικό ρόλο. Κανόνες Γραμματικής Η ορθή συντακτική δομή μιας γλώσσας ορίζεται από κανόνες όπως οι παρακάτω (δείτε τις αντίστοιχες επεξηγήσεις): Πρόταση (Sentence) είναι ένα NounPhrase (φράση με ουσιαστικό) ένα VerbPhrase (φράση με ρήμα) Sentence NounPhrase VerbPhrase (Γραμματικός Κανόνας 1) NounPhrase είναι ένα Article ένα Noun (ουσιαστικό) NounPhrase Article Noun (Γραμματικός Κανόνας 2) Name είτε ένα Name (Κύριο όνομα) VerbPhrase είναι ένα tverb (μεταβατικό ρήμα) ένα NounPhrase 1
VerbPhrase tverb NounPhrase (Γραμματικός Κανόνας 3) iverb είτε ένα iverb (αμετάβατο ρήμα) Article "a" Article "the" Noun "ball" Noun "car" Name "John" Name "Mary" iverb "runs" iverb "dances" tverb "sees" tverb "likes" tverb "drinks" Λεξικό (απλοί κανόνες ή αλλιώς "γεγονότα") Τα παραπάνω αποτελούν μια απλή γραμματική της Αγγλικής γλώσσας (χωρίς επίθετα, επιρρήματα, αναφορικές προτάσεις, κλπ, και μόνο σε τρίτο ενικό του ενεστώτα). Η γραμματική αυτή αποτελείται από τρεις κανόνες και από μια πληθώρα δεδομένων (ή γεγονότων facts) που αποτελούν το λεξικό μας. Η καρδιά της γραμματικής είναι οι κανόνες οι οποίοι μας λένε από τι αποτελείται μια πρόταση και από τι αποτελούνται τα επί μέρους κομμάτια μιας πρότασης. Παρ' όλη την απλότητά της η παραπάνω γραμματική μπορεί να αναγνωρίσει προτάσεις όπως John sees the ball και να αναθέσει συντακτικούς ρόλους στις λέξεις: John = Name = NounPhrase.. sees = tverb. the = Article ball = Noun Επίσης μπορεί να βρει ότι προτάσεις όπως The John sees ball είναι συντακτικά εσφαλμένες. = NounPhrase = VerbPhrase = Sentence Γραμματικοί κανόνες στην Prolog Παρατηρήστε ότι οι κανόνες της παραπάνω γραμματικής μοιάζουν πάρα πολύ με κανόνες Prolog ενώ οι απλοί κανόνες που αποτελούν το λεξικό μοιάζουν με γεγονότα στην Prolog. Πράγματι, αν υποθέσουμε ότι οι λέξεις μιας πρότασης μας δίνονται σε μια λίστα, μπορούμε εύκολα να μετατρέψουμε την παραπάνω γραμματική σε πρόγραμμα Prolog: sentence(wordlist) :- append(np,vp,wordlist), nounphrase(np), verbphrase(vp). nounphrase(wordlist) :- append(a,n,wordlist), article(a), noun(n). Υλοποιεί τον Γραμματικό κανόνα 1 Υλοποιούν τον Γραμματικό κανόνα 2 2
nounphrase(wordlist) :- name(wordlist). verbphrase(wordlist) :- append(tv,np,wordlist), tverb(tv), nounphrase(np). verbphrase(wordlist) :- iverb(wordlist). Υλοποιούν τον Γραμματικό κανόνα 3 article([a]). article([the]). noun([ball]). noun([car]). name([john]). name([mary]). iverb([runs]). iverb([dances]). tverb([sees]). tverb([likes]). tverb([drinks]). Λεξικό (σειρά από γεγονότα) Παράδειγμα εκτέλεσης?- sentence([john,sees,the,ball]). Yes Συνήθως δε μας αρκεί μια απλή απάντηση Yes ή No για την γραμματικότητα μιας πρότασης, αν είναι δηλαδή αυτή συντακτικά ορθή ή όχι. Ο ουσιαστικός σκοπός της συντακτικής ανάλυσης είναι η εύρεση του συντακτικού ρόλου κάθε λέξης της πρότασης. Θέλουμε λοιπόν να τυπώνεται στην οθόνη αυτή η επί πλέον πληροφορία. Το παρακάτω πρόγραμμα διαμορφώνει το προηγούμενο πρόγραμμα προσθέτοντας αυτή ακριβώς την πληροφορία υπό μορφή strings. Η εντολή string_concat(a,b,c) λειτουργεί όπως ακριβώς η εντολή append με τη διαφορά ότι εφαρμόζεται σε strings και όχι σε λίστες, δηλαδή ενώνει τα strings Α, Β με αποτέλεσμα το string C. Η λίστα Wordlist είναι sentence με συντακτική δομή που περιγράφεται στο string Syntax, εαν sentence(wordlist,syntax) :- append(np,vp,wordlist), nounphrase(np,syntax1), verbphrase(vp,syntax2), string_concat('sentence:{ ', Syntax1, Temp1), string_concat(temp1, Syntax2, Temp2), Χωρίζεται στις λίστες NP, VP και Οι λίστες NP, VP έχουν συντακτική δομή που περιγράφεται από τα strings Syntax1, Syntax2, και nounphrase(wordlist,syntax) :- append(a,n,wordlist), article(a,syntax1), noun(n,syntax2), string_concat('noun-phrase:{ ', Syntax1, Temp1), string_concat(temp1, Syntax2, Temp2), Το string Syntax προέρχεται από την ένωση των strings Syntax1, Syntax2. nounphrase(wordlist,syntax) :- name(wordlist,syntax1), string_concat('noun-phrase:{ ', Syntax1, Temp1), string_concat(temp1,'} ',Syntax). 3
verbphrase(wordlist,syntax) :- append(tv,np,wordlist), tverb(tv,syntax1), nounphrase(np,syntax2), string_concat('verb-phrase:{ ', Syntax1, Temp1), string_concat(temp1,syntax2,temp2), verbphrase(wordlist,syntax) :- iverb(wordlist,syntax1), string_concat('verb-phrase:{ ', Syntax1, Temp1), string_concat(temp1,'} ',Syntax). article([a], 'article:{a} '). article([the], 'article:{the} '). noun([ball], 'noun:{ball} '). noun([car], 'noun:{car} '). name([john], 'name:{john} '). name([mary], 'name:{mary} '). iverb([runs], 'iverb:{runs} '). iverb([dances], 'iverb:{dances} '). tverb([sees], 'tverb:{sees} '). tverb([likes], 'tverb:{likes} '). tverb([drinks], 'tverb:{drinks} '). Παράδειγμα εκτέλεσης:?- sentence([john,sees,a,car],syntax). Syntax = "sentence:{ noun-phrase:{ name:{john} } verb-phrase:{ tverb:{sees} nounphrase:{ article:{a} noun:{car} } } }." Μια απλή Ελληνική γραμματική Η συντακτική δυσκολία της Ελληνικής γλώσσας έγκειται στην κλίση των ονομάτων, των ουσιαστικών, των άρθρων, των ρημάτων, κλπ. Έτσι, για παράδειγμα, κάθε ουσιαστικό προσδιορίζεται από κάποιες ιδιότητες (attributes) όπως γένος, πτώση, και αριθμό (ενικό/πληθυντικό). Ομοίως κάθε ρήμα έχει ιδιότητες όπως ο χρόνος (ενεστώτας, αόριστος, κλπ), το πρόσωπο (1 ο, 2 ο, 3 ο ), ο αριθμός, κ.ο.κ. Μια πολύ απλή γραμματική της Ελληνικής υλοποιείται από τους εξής κανόνες: Πρόταση ΟνοματικήΦράση(πτώση=ονομαστική, γένος=χ) ΡηματικήΦράση(πτώση=αιτιατική) ΟνοματικήΦράση(πτώση=Χ, γένος=υ) ΡηματικήΦράση(πτώση=Χ) Άρθρο(πτώση=Χ, γένος=υ) Ουσιαστικό(πτώση=Χ, γένος=υ) Άρθρο(πτώση=Χ, γένος=υ) Όνομα(πτώση=Χ, γένος=υ) ΜεταβατικόΡήμα ΟνοματικήΦράση(πτώση=Χ, γένος=υ) ΑμετάβατοΡήμα Στην παραπάνω γραμματική μπορούμε να "παίξουμε" μόνο με το γένος και την πτώση των ουσιαστικών και των ονομάτων. Ο αριθμός τω ουσιαστικών και των ονομάτων θεωρείται σταθερός (πχ. ο ενικός), όπως επίσης και ο χρόνος και το πρόσωπο του ρήματος (πχ. ενεστώτας, 3 ο πρόσωπο). Επίσης στο λεξικό πρέπει να προσδιορίσουμε τις ιδιότητες της κάθε λέξης, πχ. Άρθρο(πτώση=ονομαστική, γένος=αρσενικό) "ο" Άρθρο(πτώση=αιτιατική, γένος=αρσενικό) "τον" Άρθρο(πτώση=ονομαστική, γένος=θηλυκό) "η" Άρθρο(πτώση=αιτιατική, γένος=θηλυκό) "την" Άρθρο(πτώση=ονομαστική, γένος=ουδέτερο) "το" Άρθρο(πτώση=αιτιατική, γένος=ουδέτερο) "το" Όνομα(πτώση=ονομαστική, γένος=αρσενικό) "Ανδρέας" Όνομα (πτώση=αιτιατική, γένος=αρσενικό) "Ανδρέα" Όνομα (πτώση=ονομαστική, γένος=θηλυκό) "Ελένη" Όνομα (πτώση=αιτιατική, γένος=θηλυκό) "Ελένη" Ουσιαστικό(πτώση=ονομαστική, γένος=αρσενικό) "άνθρωπος" Ουσιαστικό (πτώση=αιτιατική, γένος=αρσενικό) "άνθρωπο" 4
Ουσιαστικό (πτώση=ονομαστική, γένος=θηλυκό) "καρέκλα" Ουσιαστικό (πτώση=αιτιατική, γένος=θηλυκό) "καρέκλα" Ουσιαστικό (πτώση=ονομαστική, γένος=ουδέτερο) "μολύβι" Ουσιαστικό (πτώση=αιτιατική, γένος=ουδέτερο) "μολύβι" ΜεταβατικόΡήμα "παίρνει" ΜεταβατικόΡήμα "βάφει" ΑμετάβατοΡήμα "τρέχει" ΑμετάβατοΡήμα "χορεύει" Έτσι προτάσεις όπως Η Ελένη παίρνει το μολύβι αναλύονται συντακτικά ως εξής Η = Άρθρο(πτώση=ονομαστική,γένος=θηλυκό) Ελένη = Άρθρο(πτώση=ονομαστική,γένος=θηλυκό) παίρνει = ΜεταβατικόΡήμα το = Άρθρο(πτώση=αιτιατική,γένος=ουδέτερο) μολύβι = Ουσιαστικό(πτώση=αιτιατική,γένος=ουδέτερο) ΟνοματικήΦράση. (πτώση=ονομαστική, γένος=θηλυκό) ΟνοματικήΦράση (πτώση=αιτιατική, γένος=θηλυκό) ΡηματικήΦράση (πτώση=αιτιατική) Πρόταση ΤΙ ΠΡΕΠΕΙ ΝΑ ΚΑΝΕΤΕ Υλοποιήστε την παραπάνω γραμματική της Ελληνικής σε Prolog. Έτσι, για παράδειγμα, η πρόταση "Ο Ανδρέας βάφει την καρέκλα" αναλύεται συντακτικά εκτελώντας την ερώτηση?- protasi([o, andreas, bafei, thn, karekla], Syntax). Syntax = "protasi:{ onomatikhfrash[onomastikh,arseniko]:{ arthro[onomastikh,arseniko]:{o} onoma[onomastikh,arseniko]:{andreas} } rhmatikhfrash:{ metabatikorhma:{bafei} onomatikhfrash[aitiatikh,thhlyko]:{ arthro[aitiatikh,thhlyko]:{thn} oysiastiko[aitiatikh,thhlyko]:{karekla} } } } 5