Σελίδες

Κυριακή 2 Ιουνίου 2013

Ο συλλαβισμός στην Πομακική

réčkovo delénye ή rečkodelénye

 

Την παραπάνω σύνθετη πομακική λέξη δε θα τη βρείτε σε κανένα λεξικό της Πομακικής, συμπεριλαμβανομένου του Δ’ Σώματος Στρατού, όσο και να ψάξετε.  Απλά δεν υπήρχε, μέχρι που να αρχίσω να γράφω αυτές εδώ τις γραμμές.  Το ξέρω ότι είναι πολύ πιθανό να κατηγορηθώ για γλωσσοπλασία.  Δεν θα με πείραζε όμως καθόλου αυτό, διότι είναι η ίδια η ζωή και οι ανάγκες τις, εν τέλει, η πραγματική δημιουργός δύναμη και κάπως έτσι θαρρώ πως δημιουργήθηκαν πολλές, αν όχι οι περισσότερες, λέξεις όλων των γλωσσών του κόσμου.  Αυτά σαν παρένθεση.

Με τη σημερινή ραγδαία ανάπτυξη και εξέλιξη της επιστήμης των υπολογιστών δεν είναι καθόλου απίθανο σε λίγα χρόνια να εκλείψει παντελώς η ανάγκη του συλλαβισμού των κειμένων και η ίδια η λέξη «συλλαβισμός» να καταργηθεί από το λεξιλόγιό μας.  Ρίξτε μια ματιά εδώ κι εδώ για του λόγου το αληθές.  Μέχρι τότε όμως, για να μπορούμε να χρησιμοποιούμε την πλήρη στοίχιση στα μονόστηλα, δίστηλα ή πολύστηλα κείμενά μας με το καλύτερο δυνατό αισθητικό, λειτουργικό και πρακτικό αποτέλεσμα, θα είμαστε αναγκασμένοι να χρησιμοποιούμε τον συλλαβισμό με το κατάλληλο «σπάσιμο» των λέξεων σύμφωνα με ορισμένους κανόνες.

Οι κανόνες συλλαβισμού της Πομακικής δε θα μπορούσε παρά να είναι κάποιοι πολύ απλοί και βασικοί κανόνες σαν τους παρακάτω, οι οποίοι ενυπάρχουν και σε πολλές άλλες γλώσσες, με κάποιες μικρές διαφορές, ίσως, και ορισμένες εξαιρέσεις.  Είναι μετρημένοι στα δάχτυλα του ενός χεριού και είναι οι εξής:

1. Ένα σύμφωνο ανάμεσα σε δύο φωνήεντα συλλαβίζεται με το δεύτερο φωνήεν
π.χ.  va-dá, ža-ná, dé-te, ko-rá, pé-pel, na-gá, ra-ká κλπ.

2.  Δύο σύμφωνα ανάμεσα σε δύο φωνήεντα συλλαβίζονται με το δεύτερο φωνήεν, εάν απ’ αυτά τα σύμφωνα αρχίζει λέξη της Πομακικής (ανεξαρτήτου προέλευσης).  Διαφορετικά, χωρίζονται και το πρώτο σύμφωνο πάει με το προηγούμενο φωνήεν, το δεύτερο με το ακόλουθο.
π.χ.
α) ko-prı́va (prı́lıka), a-gledálo (glavá), má-slo (slónce), pa-trı́šom (trahá, trendráfel), patá-vra (vrána) κλπ.
β) per-perúda, úr-da, yúr-va, pór-ta, sól-za, fúr-ka, vór-ga, bór-no, bán-ga κλπ.

3.  Τρία σύμφωνα ανάμεσα σε δύο φωνήεντα συλλαβίζονται με το ακόλουθο φωνήεν, όταν απ’ αυτά τα σύμφωνα αρχίζει λέξη της Πομακικής.  Σε διαφορετική περίπτωση, χωρίζονται και το πρώτο σύμφωνο πάει με το προηγούμενο φωνήεν, το τρίτο (τελευταίο) σύμφωνο με το ακόλουθο φωνήεων και το δεύτερο (ενδιάμεσο) σύμφωνο υπάγεται στον δεύτερο κανόνα συλλαβισμού.  Εάν, δηλαδή, από το δεύτερο και τρίτο σύμφωνο αρχίζει λέξη της Πομακικής, τότε αυτό ακολουθεί το τρίτο σύμφωνο και πάει με το επόμενο φωνήεν, αλλιώς, μένει πίσω με το πρώτο σύμφωνο και το προηγούμενο φωνήεν.
π.χ.
α) pa-smračáva so (smračáva so), pa-strašávom (strašávom, strah, strášan), pa-splatnä́vom (splatnä́vom), pa-skrapä́vom (skrapä́vom, skram, skramcá), pad-skrafı́savom (skrafı́som) κλπ.
β) amar-tvä́vom, skı̈rč-yásavom, borč-yásavom κλπ.

Αυτή τη στιγμή δεν μπορώ να σκεφτώ κάποια λέξη που να περιέχει τέσσερα σύμφωνα στη σειρά.  Αυτό, αναμφίβολα, έχει να κάνει και με το αλφάβητο.  Εάν όμως προκύψει κάτι τέτοιο στην πορεία, νομίζω ότι αυτό θα μπορούσε χωρίς κανένα πρόβλημα να υπαχθεί στον τρίτο κανόνα συλλαβισμού.

Από τους παραπάνω κανόνες εξαιρούνται οι εξής περιπτώσεις:
α) Τα προθήματα (πρώτα συνθετικά) ab, ad, ız, nad, pad, raz, vaz δεν χωρίζονται.
β) Τα συμπλέγματα ck και čk στις καταλήξεις -ckı̈y, -cka, -cko, -ckı, -ckı̈ και -čkı̈y, -čka, -čko, -čkı, -čkı̈ ορισμένων επιθέτων με ή χωρίς το οριστικό άρθρο δεν χωρίζονται.

(Σημ.: Λέξη της Πομακικής που να αρχίζει από ck ή čk δεν υπάρχει και κανονικά θα έπρεπε να εφαρμοστεί ο αντίστοιχος κανόνας συλλαβισμού, ανάλογα με την περίπτωση, και να χωριστούν τα γράμματα c και από το k, κάτι το οποίο εγώ προσωπικά δεν επιθυμώ).
Αυτό είναι όλο κι όλο, για την ώρα τουλάχιστον.


Μπορείτε τώρα να κάνετε μια σύγκριση με τους κανόνες συλλαβισμού της Νεοελληνικής Γραμματικής του Μανόλη Τριανταφυλλίδη, σελ. 19, παρ. 24, και αυτούς της σύγχρονης Βουλγαρικής, όπως έχουν τροποποιηθεί από το 1983, ή άλλων γλωσσών και να βγάλετε τα όποια συμπεράσματά σας.

Όλα αυτά, βεβαίως, στη θεωρία.  Ας περάσουμε όμως τώρα στην πράξη και την υλοποίηση όλων αυτών των κανόνων στους υπολογιστές, προκειμένου να μπορεί να εφαρμόσει κανείς αυτόματο συλλαβισμό στα κείμενά του.


Την περιγραφή του γνωστού στους προγραμματιστές αλγορίθμου συλλαβισμού στους υπολογιστές του καθηγητή Franklin Mark Liang του Πανεπιστημίου Stanford μπορείτε να τη διαβάσετε εδώ.  Την υλοποίηση του παραπάνω αλγορίθμου, με κάποιες παραλλαγές, έχουν πραγματοποιήσει και ενσωματώσει στα έργα τους διάφοροι μεμονωμένοι προγραμματιστές, οργανισμοί και εταιρείες ανά τον κόσμο και μεταξύ αυτών και κάποια μεγάλης κλίμακας projects, όπως το OpenOffice και το LibreOffice κ.ά.


Μια τέτοια υλοποίηση γραμμένη σε C++ (για Linux) που μου κέντρισε το ενδιαφέρον είναι τούτη εδώ.  Αφού, λοιπόν, κατάφερα με κάποια δυσκολία, ομολογώ, να την μεταγλωττίσω σε περιβάλλον Windows και, όντας παιχνιδιάρης ο ίδιος, να «παίξω» μαζί της επί αρκετές ημέρες, διαπίστωσα με μεγάλη μου λύπη για άλλη μια φορά ότι το παιχνίδι δεν έβγαινε και ήταν σχεδόν αδύνατη η χρήση της στην περίπτωση της Πομακικής για δύο λόγους:  α) η χρήση διεθνών τυποποιήσεων σε ό,τι αφορά τις κωδικές ονομασίες των γλωσσών, στις οποίες δεν συμπεριλαμβάνεται η Πομακική, και β) οι πάρα πολλές και αμφιβόλου τελικού αποτελέσματος αλλαγές που θα έπρεπε να γίνουν στον κώδικα , λόγω του ιδιαίτερου συστήματος γραφής της Πομακικής (βλ. προηγούμενες αναρτήσεις).


Κι έτσι, μη έχοντας και πολλές επιλογές, στράφηκα προς την αυτοσχέδια λύση, η οποία θα ήταν και μια πρώτης τάξεως ευκαιρία να δοκιμάσω τις γνώσεις μου στη C++.  Το παίδεψα και με παίδεψε, είναι αλήθεια, κι έκανα σχέδια επί σχεδίων, έως ότου καταλήξω σε κάποιο σχήμα.  Στο τέλος νομίζω ότι κάτι έκανα.  Μια απλή κλάση της C++ με ελάχιστες ρουτίνες και συναρτήσεις και πολύ λίγες γραμμές κώδικα.  Οι χρόνοι είναι ικανοποιητικοί, μπορεί και καλύτεροι από άλλες αντίστοιχες υλοποιήσεις, και το τελικό αποτελέσμα το επιθυμητό• δεν έχει να ζηλέψει τίποτα από εκείνες των υπολοίπων.  Βελτιώσεις και διορθώσεις ασφαλώς και μπορούν να γίνουν τόσο στην υλοποίηση αυτή καθεαυτή όσο και στους κώδικες συλλαβισμού, ο αριθμός των οποίων μόλις που πλησιάζει τους χίλιους σε σύνολο αρκετών δεκάδων χιλιάδων τύπων λέξεων της Πομακικής.  Νομίζω ότι είναι μια πολύ καλή βάση και αρχή.


Ιδού ένα μέρος του κώδικα που αποτελεί και την κεντρική διαδικασία (ρουτίνα) της υλοποίησης.


void Hyphenator::hyphenate( wstring& wrd, int32_t idx, vector<int>& pos_indexes )
{
    if ( wrd.empty() || wrd.size() < 3 )
        return;

    wstring word, key, pat;

    map<wstring, wstring>::const_iterator it;

    UnicodeString ustr( wrd.c_str() );
    ustr.toLower();

    word += _T(".");
    word += ustr.getTerminatedBuffer();
    word += _T(".");

    wchar_t c;
    size_t p, l, r = 0, s = word.size();

    vector<int> v;
    v.reserve( s * s );

    for ( size_t pos = 0; pos < s; pos++ ) {
        for ( size_t i = s; i > pos; i-- ) {
            key = word.substr( pos, i - pos );
            it = _patterns.find( key );
            if ( it != _patterns.end() ) {
                pat = it->second;
                v.resize( v.size() + s );
                p = pos; l = 0;
                if ( p == 0 ) l = 1; else p--;
                for ( size_t j = l; j < pat.size(); j++ ) {
                    c = pat[j];
                    v[ ( r * s ) + p++ ] = _wtoi( &c );
                }
                r++;
            }
        }
    }

    int32_t n, t;

    for ( size_t i = 1; i < s -1; i++ ) {
        n = 0;
        for ( size_t j = 0; j < r; j++ ) {
            t = v[ ( j * s ) + i ];
            if ( t > n ) n = t;
        }
        if ( i < ( s - 2 ) ) {
            if ( n > 0 && n % 2 > 0 ) {
                pos_indexes.push_back( (idx + i) );
            }
        }
    }
}





Να επισημάνω εδώ ότι η μόνη αναγκαία εμπλοκή της βιβλιοθήκης ICU στην περίπτωση του συλλαβισμού συνίσταται στην μετατροπή των κεφαλαίων χαρακτήρων σε πεζούς, καθότι δεν μπόρεσα να βρω κάτι άλλο πιο αξιόπιστο.

Αυτή είναι εν ολίγοις η ιστορία με τον συλλαβισμό και δε νομίζω ότι χρειάζεται να προσθέσω ή να συμπληρώσω κάτι άλλο επί του παρόντος.  Τώρα, το ότι πονάνε λίγο τα δάχτυλα των χεριών μου από το πληκτρολόγιο και ότι δεν πρόλαβα ακόμη να υποβάλω τη φορολογική μου δήλωση ή ότι δεν βρήκα λίγο χρόνο για το αγαπημένο μου «σπορ», αυτά πια, νομίζω, δεν ενδιαφέρουν κανέναν.


Κατεβάστε το πακέτο με την εφαρμογή επίδειξης από εδώ (md5 checksum: c5149f132d15c101de1fb2baed0eb3de) για να δείτε ζωντανά το αποτέλεσμα όλων των παραπάνω στην οθόνη του υπολογιστή σας.  Μέσα στο φάκελο θα βρείτε τη γραμματοσειρά Andika, την οποία πρέπει να εγκαταστήσετε για τη σωστή προβολή του κειμένου, και το αρχείο SampleText.txt, ένα πομακικό παραμύθι από το βιβλίο της Δήμητρας Κατάκη «Ο παππούς και η γιαγιά είπαν...», γραμμένο στο αναθεωρημένο λατινικό αλφάβητο, για τις δοκιμές σας.  Το πακέτο είναι πλήρες, με όλα τα παρελκόμενα, και εκτός από λίγο χρόνο κάτι άλλο δε νομίζω ότι θα χρειαστείτε.  Δοκιμάστε το και σχολιάστε το (προαιρετικά είναι και τα δύο).


Εάν κάποιος ενδιαφέρεται να αποκτήσει το σύνολο του πηγαίου κώδικα, μπορεί να τον λάβει δωρεάν, αρκεί, απλά, να τον ζητήσει.

Σάββατο 25 Μαΐου 2013

Σχετικά με την ταξινόμηση

Εδώ και μια δεκαετία περίπου χρησιμοποιώ το κορυφαίο ίσως από κάθε άποψη νοτιοαφρικανικής προέλευσης λεξικογραφικό υπερεργαλείο TshwaneLex για τις καθημερινές και συνηθισμένες εργασίες μου πάνω στο PomLex.  Και δεν είναι ότι το συγκεκριμένο εργαλείο δεν παρέχει τη δυνατότητα προσαρμοσμένης ταξινόμησης.  Την παρέχει και με τον καλύτερο τρόπο ίσως.  Αλλιώς τί σόι εργαλείο θα ήταν;  Απλώς η δυνατότητα αυτή παρέχεται σε επίπεδο λήμματος.   Για πολύ εξειδικευμένες εργασίες όμως, όπως η ενδολημματική ταξινόμηση σε μια δενδροειδή δομή ενός λήμματος της παρακάτω μορφής, τα πράγματα γίνονται αρκετά περίπλοκα.


Αυτό, βέβαια, μέσα από το περιβάλλον του TshwaneLex.  Αν τώρα θελήσει κανείς να μεταφέρει την εργασία του εκτός περιβάλλοντος TshwaneLex και να χρησιμοποιήσει εργαλεία δικά του ή τρίτων κατασκευαστών για περαιτέρω επεξεργασία τί γίνεται;  Στην περίπτωση της Πομακικής άμεση υποστήριξη, απλά, δεν παρέχεται από κανέναν.  Η δε έμμεση συναρτάται με την ατομική πρωτοβουλία και δυνατότητα αλλά και τους στόχους που έχει ο καθένας.

Η δωρεάν και ανοιχτού κώδικα βιβλιοθήκη ICU (International Components for Unicode) της IBM είναι μια απ’ αυτές που χρησιμοποιείται ευρέως από τους προγραμματιστές για τον χειρισμό κειμένου Unicode.  Μερική χρήση των δυνατοτήτων της βιβλιοθήκης μπορεί να κάνει και το SQLite για την ταξινόμηση, αν του το ζητήσει κανείς (μεταγλώττιση με την αντίστοιχη επιλογή - ενεργοποίηση).  Αυτή θα ήταν μια καλή λύση ομολογώ, έστω και μεσοβέζικη, αν, βεβαίως, ήμουν γκουρού της C και μπορούσα να το θέσω σε λειτουργία αυτό το πράγμα.  Η αλήθεια είναι ότι αποπειράθηκα, ασχέτως αποτελέσματος.

Η επόμενη κίνηση ήταν να δοκιμάσω την απ’ ευθείας χρήση της βιβλιοθήκης μέσα από τα δικά μου C++ εργαλεία.  Τα πρώτα αποτελέσματα δεν άργησαν να φανούν και ήταν ό,τι ακριβώς έψαχνα.  Προσαρμοσμένη ταξινόμηση, ανεξάρτητη από λειτουργικά συστήματα, λεξικογραφικά εργαλεία, επεξεργαστές κειμένου κλπ.  Να ‘ναι καλά όλοι αυτοί οι άνθρωποι που δούλεψαν για το ICU.




Κάποια άλλη φορά θα γράψω για τον συλλαβισμό και θα σας δώσω μια μίνι εφαρμογή επίδειξης των δυνατοτήτων ταξινόμησης και συλλαβισμού της Πομακικής.


Τετάρτη 22 Μαΐου 2013

Το πρωινό "ξύπνημα" της φύσης

Απολαμβάνοντας τη μοναδική και "άγρια" αίσθηση ομορφιάς του πρωινού "ξυπνήματος" της φύσης, όπου χελιδόνια και λογής λογής δασοπούλια στήνουν ένα ξέφρενο πανηγύρι στην αυλή του σπιτιού σου με εξωτικές μουσικές και χορούς και σαν φυσικό ξυπνητήρι σε καλούν να σηκωθείς από το κρεββάτι σου και να απολαύσεις έναν υπέροχο καφέ μαζί τους, προτού ξεκινήσεις για την άσκηση της επιταγμένης σου υπηρεσίας.