Statistiskā lietvārdu deklinēšana
Tagad es tev pastāstīšu par savu ideju "total world domination" plāna ietvaros, kuru tikko eksperimentālā kārtā realizēju. Raugi, meklēšana internetā ir diezgan traks pasākums, ja runa ir par latviešu valodu. Viens ir gūgle, bet pavisam kas cits ir mazs meklētājiņš.
Prior scriptum. Kāds man tviterī pavaicāja - kāds mērķis? Kāpēc taisi? Zini, tāpēc, ka patīk, interesē un šķiet aizraujoši. Reāli pielietojumu redzu tikai nekur.lv meklēšanā un, iespējams, ja visu labi sadomāšu - publiskā API izveidē. Bet tā - rotaļa tikai paša priekam un lepnumam.
Brīdinu, ka te runa būs par lietvārdiem un to deklinēšanu (tā sauc locīšanu). Darbības vārdu konjugēšana ir vispār pavisam atsevišķs stāsts.
Piemērs nav tālu jāmeklē - nekur.lv (skatīt attēlu). Ja lietotājs meklē "instagramos", būtu jauki atrast arī visu, kas ir "instagrams" un "instagramā". It kā jau varētu paķert vārdnīcu un visu izdeklinēt, jo to mēs mākam, bet tādas pilnīgas vārdnīcas, kuru varētu lietot parasts mirstīgais īsti nav. Augšā redzamajā attēlā uzskatāmi parādīts, ka problēma ir risināta ar tipisku brute force piegājienu - deklinējam, kamēr vairs nedeklinējas :)
Bet mums ir gramatikas normas un man ir vēl labāks risinājums.
Algoritms, patiesībā, ir triviāls. Sauksim to par reverso deklinēšanu. Tātad, atrodam vārdam galotni (kas ir elementāri izdarāms), sameklējam visus locījumus, kuros mēdz būt šāda galotne. Iegūstam deklināciju, skaitli un potenciālo dzimti. Noņemam galotni, pieliekam atbilstošās deklinācijas nominatīva galotni un, lai cik mazticamu, esam dabūjuši vienu variantu.
Rezultātā mums ir vesela kaudze ar iespējamajiem vārdu variantiem un to locījumiem. Piemēram, paņemot vārdu "gūglē", mēs iegūstam divus variantus:
-
gūgle, gūgles, gūglem, gūgli, ar gūgli, gūglē, gūgle!, gūgles, gūgļu, gūglēm, gūgles, ar gūglēm, gūglēs, gūgles!
-
gūgle, gūgles, gūglei, gūgli, ar gūgli, gūglē, gūgle!, gūgles, gūgļu, gūglēm, gūgles, ar gūglēm, gūglēs, gūgles!
Uz aci, protams, skaidrs - pareizais ir otrais. Bet, kā to varētu noteikt dators? Viņam nekāds "uz aci" nederēs. Nu, labi. Ko tālāk? Kam lai prasa?
Izrādās, arī šī problēma risinās elementāri, Mendelson. Nolēmu izmantot dienesta stāvokli nekur.lv saturu. Bez piekrišanām, bez brīdināšanām, bez nekā, iedomājies tik? Tavi lietvārdi manā labumā!
Nekurs satur vairāk nekā miljonu ierakstu no dažnedažādākajiem Latvijas interneta nostūriem un laikmetiem. No cibiņiem līdz trūblogeriem, no seksa blogerēm līdz ceham. Tur noteikti būs teju jebkurš iedomājams vārds jebkurā formā. Un tieši tur arī parādīsies visi jaunie vārdi.
Tāpēc nākamajā solī mēs ņemam katru potenciālo locījumu kombināciju un saskaitām, cik reizes katrs no šiem vārdiem ir atrodams nekurā. Piemēram, gūgles gadījumā ar nelielu pārsvaru, pateicoties vienskaitļa datīvam, uzvar sieviešu dzimte, piektā deklinācija.
Skaitīšanā, protams, ir vērts ignorēt jau saskaitītos vārdus (piemēram, neies divreiz atsevišķi skaitīt akuzatīvu "gūgli" un instrumentāli "ar gūgli").
Bet, lai viss šis nešķistu bezjēdzīgi, ir viena ļoti svarīga nianse mūsu mainīgajam laikmetam. Kļūst sajēdzami visi jaunvārdi. Visi tie urla, instagrams, padiesi un klope. To tu nevienā vārdnīcā neatradīsi, bet atrast noteikti gribēsi.
Rezultātā mums sanāk tāda kā rekursija, kaut kas līdzīgs Inception. Lai kaut ko sameklētu milzīgā satura blāķī (nekurā), tu sauc talkā to pašu milzīgo satura blāķi, lai tas tev palīdz uzminēt to, ko tad īsti lietotājs grib sameklēt. Izklausās mistiski, bet, izrādās, ir skaisti.
Darāmā vēl tīri daudz (izņēmumi, atgriezeniskie lietvārdi, utt), bet paspēlēties ar šo raupjo un nepilnīgo versiju var teitan.
Vilx-
2015. gada 16. aprīlī, plkst. 00:10
Vai ta klasiskais variants meklēšanai nebija t.s "stemming"? Tas ir, no katra vārda vispirms izvelkam sakni, tad to noindeksējam, un pēc tam meklējot arī meklējam pēc šīm saknēm. Rezultātā nevajag nekādu locīšanu un galotņu piemeklēšanu, bet viss strādā tikpat labi.
laacz Autors
2015. gada 16. aprīlī, plkst. 00:12
Bija, bet stemminga loģiku latviešu valodai būtu pašam jātaisa. Šitā ir vienkāršāk.
laacz Autors
2015. gada 16. aprīlī, plkst. 00:15
Cilvēki PhD raksta par šo tēmu[1]. Tu gribi, lai es izrādos gudrāks? Es arī, bet labāk tagad un strādājošs. :)
1: https://dspace.lboro.ac.uk/dspace-jspui/handle/2134/7433
Vilx-
2015. gada 17. aprīlī, plkst. 16:16
"Noņemam galotni, pieliekam atbilstošās deklinācijas nominatīva galotni" - izvilkt sakni vai tad ir grūtāk?
laacz Autors
2015. gada 17. aprīlī, plkst. 16:35
Protams. Lietvārdu iespējamās galotnes ir zināmas (skatīt deklinēšanas tabulu) - paņem garāko. Bet sakni izvilkt nav tik vienkārši :)
Sandijs
2015. gada 16. aprīlī, plkst. 10:04
Ja es meklēju "instagrams" un Tu man piedāvā rezultātus ar visiem locījumiem, tad, tikpat labi, tur vari iekļaut arī "nepareizos" locījumus. Neredzu iemeslu diskriminēt rakstus ar kļūdām, ja vien nemeklēju, ko iesniegt sacerējuma vietā. Tas tā, par use case.
laacz Autors
2015. gada 16. aprīlī, plkst. 10:16
Starp citu, šis ir interesants aspekts. Par to iedomājos idejas sākuma stadijā.
No vienas puses - man ir fetišs uz gramatiski pareiziem tekstiem un es ar lielāko prieku diskriminēju tos, kas nejēdz pareizi izlocīt vārdu (Zemgus un Zemgum, nevis Zemgusam). Pats, protams, arī nereti pieļauju kļūdas, bet par tām es sevi vismaz iekšēji šaustu :)
No otras puses - ja "instagrama" gadījumā viss ir vienkārši, tad pie īsākiem vārdiem var būt diezgan daudz "false positives" un šāds "fuzziness" man pašam noteikti nepatiktu. Piemēram, ja es "valžu" izlocītu gan kā "valdis", gan kā "valde".
Tiesa, ar šo niansi es saskāršos, kad nonākšu pie personvārdiem kā izņēmumiem un darbības vārdiem (tas pats "Valda" vai "valda"?) :)
kao
2015. gada 16. aprīlī, plkst. 14:15
"saskaršos". Man arī ir fetišs. :)
Mr. Serge
2015. gada 16. aprīlī, plkst. 12:10
Eksperiments ir gana labs. AILAB nav ko tamlīdzīgu jau paveikuši, gadījumā? Pagaidām gan man ir izdevies ikurāt vienkārši atrast vārdus, kurus locītājs neloka, piemēram, http://nekur.lv/dekline.php?q=fosforsk%C4%81be
laacz Autors
2015. gada 16. aprīlī, plkst. 12:12
AiLab ir paveikuši daudz vairāk. Viņi prot teikumu sadalīt pa sastāvdaļām (izteicējs, priekšmets, utt) un vēl visu ko[1].
Kas attiecas uz fosforskābi, par to neviens nekurā neraksta[2] :)
1: http://valoda.ailab.lv/ 2: http://nekur.lv/dekline.php?q=fosforsk%C4%81be&debug
Mr. Serge
2015. gada 16. aprīlī, plkst. 23:26
Paldies, &debug bija tieši tas, kas bija vajadzīgs, lai paspēlētos vairāk.
pļura
2015. gada 16. aprīlī, plkst. 21:58
Datīvā smieklīgi: Pļura - pļuram Ļipa - ļipam Papele - papelem Helikopters - helikopteram Keda - kedam
laacz Autors
2015. gada 17. aprīlī, plkst. 09:48
Lielu daļu no šī novērsu, lai gan "puika" aizvien nav pareizi.
laacz Autors
2015. gada 17. aprīlī, plkst. 09:50
"puikam" tagad arī ir pareizi.
Bart
2015. gada 16. aprīlī, plkst. 23:14
Nez kāpēc ar vārdu "suka" datīvā sanāk cita nozīme, ak nekurs
laacz Autors
2015. gada 17. aprīlī, plkst. 09:08
Salabots. Biju piemirsis paņemt arī otru indeksu klāt. http://nekur.lv/dekline.php?q=sukai&debug
in
2015. gada 21. aprīlī, plkst. 00:46
Laacz, vai tu visu nekur saturu glabā uz kāda servera, ja esi saglabājis miljons rakstus ? Lamu vārdus (rusicismus) neloka.
BigUgga
2015. gada 21. aprīlī, plkst. 01:57
Man patika vecie labie laiki, kad visu nolocīja ar zvaigzn* un nebija pārgudro algortimu tirānijas.
Usinss
2015. gada 21. aprīlī, plkst. 09:18
Man ne pārāk. Laikam esmu pieradis meklēt konkrētas lietas konkrētos locījumos. Un ja rakstā nav pareizi uzrakstīts, tad diez vai ir jēga lasīt. Izmēģināju. Baigi daudz lieku rezultātu izmet. Kad izvēlas, ka tomēr vēlos meklēt konkrēti šādā formā, parādās precīzāki rezultāti. Bet gan jau kādam nenoteiktam cilvēkam noderēs.
Aivars
2015. gada 27. aprīlī, plkst. 18:07
Domāju, ka lielākā ķēpa būs tikt galā ar visām līdzskaņu mijām.
Citādi Deklinētāja kungs no "suņa" piedāvā "sunis" (Uz laukiem, uz laukiem, kur sunis sunim draugs!) Un no "kaķa" piedāvā nominatīvu "kaķs".
Laikam bez iebūvētas minivārdnīcas "akmens, asmens, zibens, rudens, ūdens, suns" neiztikt.
360
2015. gada 28. aprīlī, plkst. 10:13
Neatpazīst siev. dz. vārdu 'soda' (kaustiskā, dzeramā u.c.). Uzskata to par ģen. no 'sods'.
Reinis
2015. gada 9. jūnijā, plkst. 08:17
"Zābīšus" neatpazina. "Ziemīšiem" arī. Tas tā - pirmie tizlie vārdi, kas ienāca prātā.
Reinis
2015. gada 9. jūnijā, plkst. 08:18
T.i. ziemīšus atpazina gan, vienīgi piemeklēja arī vienskaitli.
Arnis
2015. gada 6. jūlijā, plkst. 05:29
Ar lietvārdiem analizē vārda celmu - būs vienkāršāk. Ar darbības vārdiem jālieto cits algoritms.
http://www.deksoft.com/baltic-products/latvian-nouns/ http://www.deksoft.com/baltic-products/latvian-verbs/