Apie daugiskaitą
Parašė: Armandas, 2008-10-29
Kategorijose: Kodas, Python
Neseniai užmačiau vieną iš Artūro projektų. Iš karto prisiminiau, kad turiu nebaigtą blogo funkciją žodžių vertimui iš daugiskaitos į vienaskaitą:
def dgs(number, word=''): """Pluralization for Lithuanian (works partially) Kaip argumentą pateikite daugiskaitos vardininką - Pvz1: {{ 10|dgs:"Komentarai"}} - Pvz2: {{ 21|dgs:"Knygos"}} """ if number in range(11,20) or (number % 10) == 0: #masculine and feminine forms are the same word = word[:-2] + u"ų" elif number == 1 or (number % 10) == 1: if word[-2:] == "ai": #masculine form word = word[:-2] + "as" elif word[-2:] == "os": #feminine form word = word[:-2] + "a" #default value is used in all other cases return "%d %s" % (number, word)
Nusprendžiau patobulinti taip, kad veiktų su bet kokiu daiktavardžiu, turinčiu vienaskaitos ir daugiskaitos formas (atkrenta tokie žodžiai kaip pienas, alus, durys, miltai).
Procesas buvo gan ilgas, Tomas astsiuntė žodžių sąrašą, su Python jį išparsinau, tada sekė duomenų analizavimas bei abstrakcija, o galiausiai programavimas (lengviausia dalis ;)
Šiaip rekomenduoju visiems pasižiūrėti į kodą ir prisitaikyti savuose projektuose. Kažkaip susidaro įspūdis, jog programuotojai bijo Lietuvių kalbos. Kur tik pažiūrėsi, vis matai “10 Komentarai (-ų)”, “5 Prekių (-ės)” ir pan. Tikrai nėra taip sunku parinkti tinkamą žodžio formą.
P.S. nebijokit Python’o, jis kaip pseudo-kodas :)
P.P.S. Žinau, kad mano unit testas nėra labai rafinuotas, tad kitą kartą pasitengsiu labiau :D
Komentarų: 11
Dalius
Spalis 29, 2008, 8:06 ryte
Už pastangas 10, už rezultatą 6 (lietuvių kalbos pamokose praleidai kai ką), už dviračio išradinėjimą ir persistengimą kokie 5.
Pastangos – idėja įdomi, bet lietuvių kalbą labai supaprastinai.
Rezultatas – štai tik keletas žodžių su kuriais tavo programėlė nesusitvarkys (ir rezultatas, kurį gausime):
dantis – dantių, dantiai
pilis – pilių, piliai
duktė – dukčių, duktės
vanduo, sūnus, sesuo, marti – išvis nebus pagauti. Jau koks geologinio medžio portalas ir nebeveiks.
Lietuvių kalbos reikia bijoti. Nes va nepabijojai ir žiūrėk kaip linksmai gavosi viskas :-)
O dabar dėl dviračio – visų pirma tavo portalo nebebus galima išversti į kitas kalbas (!!!). Kitose kalbos daugiskaitinių formų gali būti netgi daugiau negu lietuvių kalboje. Negi aiškinsies kaip kiekvienoje kalboje daugiskaitinės formos sudaromos. Kita problema yra tokia, kad priklausomai nuo daugiskaitinės formos gali keistis visas sakinys, o ne tik daiktavardis prie skaičiaus. Siūlau pažiūrėti į šį projektą http://babel.edgewall.org/, kad būtų aiškiau kaip teisingai lokalizuoti programas.
Vėlgi tikrai nenoriu numušti entuziazmo ;-)
Armandas
Spalis 29, 2008, 2:33 vakare
* verkia *
Tikrai pažiūrėsiu tą projektą, nes dabar atrodo, kad čia be AI neišsiversi :D
Dėkui už pastabas ;)
sirex
Spalis 29, 2008, 9:29 vakare
O man kitas klausimas iškilo, dėl šito: if number in range(11,20)
Atrodo lyg ir skamba gerai, bet ar tai efektyvu. Kaip suprantu be reikalo bus sukuriamas masyvas. Bet gal aš klystu ir toks lyginimas yra normali „pythonška“ forma? Ar vis tik geriau lyginti taip: if number > 10 and number < 21:
Armandas
Spalis 30, 2008, 2:00 ryte
Manau čia yra vadinamasis “Python way”. Kadangi sąrašas niekam nepriskiriamas, tai Python’as jį automatiškai pašalina.
Daugiau apie tai: Dive into Python
RQ
Lapkritis 2, 2008, 2:56 vakare
Hm, yra dar toks daiktas kaip gettext bibliotekos. Jos palaiko kiek tik nori nuo skaitvardžių priklausomų formų. Tiesa, nežinau, kaip su Python bendrauja…
Domas
Lapkritis 3, 2008, 11:52 ryte
Gettex tikrai veikia su Python ir puikiai susitvarko su daugiskaita visose kalbose, tik reikia tvarkingo jos aprašo. Be to yra labai daug įrankių .po failams patogiai redaguoti.
Domas
Lapkritis 3, 2008, 11:53 ryte
Su lietuvybe turi problemų ir šiame puslapy. Negaliu įvesti savo http://šikna.info
Armandas
Lapkritis 3, 2008, 3:49 vakare
Domai, puliuoja biškį wp mūsų. Reiks pažiūrėt kas čia daros :)
Albertas Agejevas
Lapkritis 7, 2008, 1:45 vakare
Sirex, tu teisus, bet teisinga būtų taip:
if 10 < number < 21:
pass
Armandui, pasiimk iš biblios dabartinės lietuvių kalbos gramatiką. Arba pažiūrėk į ispell-lt afiksų failo pradžią. Lietuvių kalboj yra 12 daiktavardžių linksniavimo paradigmų:
1: vyras, pirštas
2: elnias, vėjai
3: peilis, arklys
4: turgus, sūnus
5: sodžius, pavojus
6: jūra, ranka
7: sauja, žinia, marti
8: gervė, bitė
9: krosnis, žuvis, akis
10: žvėris, dantis
11: akmuo, vanduo, šuo
12: sesuo, duktė
Greitas patikrinimas: tavo filtras neapdoroja 4, 5, 9, 10, 11, 12 paradigmų. Daugumą atsisako kaityti, o 9 sugadina: 2 akiai, 2 ausiai, 10 ausių.
Albertas Agejevas
Lapkritis 10, 2008, 4:59 vakare
Beje, AI nereikia, pakanka sutaginto wordlisto. Jį rasi ispell-lt pakete. Kaip ir kaitymo taisykles pagal tuos tagus.
Armandas
Lapkritis 12, 2008, 2:34 ryte
Dėkui, būtinai pasidomėsiu ;)
Pasiteisindamas galiu pasakyt, kad Lietuvių k. mokykloj ne ypač sekėsi :D