Κυριακή, 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, ένα πομακικό παραμύθι από το βιβλίο της Δήμητρας Κατάκη «Ο παππούς και η γιαγιά είπαν...», γραμμένο στο αναθεωρημένο λατινικό αλφάβητο, για τις δοκιμές σας.  Το πακέτο είναι πλήρες, με όλα τα παρελκόμενα, και εκτός από λίγο χρόνο κάτι άλλο δε νομίζω ότι θα χρειαστείτε.  Δοκιμάστε το και σχολιάστε το (προαιρετικά είναι και τα δύο).


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