Magistro darbai

Programinė įranga lietuviško sakinio sintaksinei struktūrai atvaizduoti grafu

9.8   (3 atsiliepimai)
Programinė įranga lietuviško sakinio sintaksinei struktūrai atvaizduoti grafu 1 puslapis
Programinė įranga lietuviško sakinio sintaksinei struktūrai atvaizduoti grafu 2 puslapis
Programinė įranga lietuviško sakinio sintaksinei struktūrai atvaizduoti grafu 3 puslapis
Programinė įranga lietuviško sakinio sintaksinei struktūrai atvaizduoti grafu 4 puslapis
Programinė įranga lietuviško sakinio sintaksinei struktūrai atvaizduoti grafu 5 puslapis
Programinė įranga lietuviško sakinio sintaksinei struktūrai atvaizduoti grafu 6 puslapis
Programinė įranga lietuviško sakinio sintaksinei struktūrai atvaizduoti grafu 7 puslapis
Programinė įranga lietuviško sakinio sintaksinei struktūrai atvaizduoti grafu 8 puslapis
Programinė įranga lietuviško sakinio sintaksinei struktūrai atvaizduoti grafu 9 puslapis
Programinė įranga lietuviško sakinio sintaksinei struktūrai atvaizduoti grafu 10 puslapis
Programinė įranga lietuviško sakinio sintaksinei struktūrai atvaizduoti grafu 11 puslapis
Programinė įranga lietuviško sakinio sintaksinei struktūrai atvaizduoti grafu 12 puslapis
Programinė įranga lietuviško sakinio sintaksinei struktūrai atvaizduoti grafu 13 puslapis
Programinė įranga lietuviško sakinio sintaksinei struktūrai atvaizduoti grafu 14 puslapis
Programinė įranga lietuviško sakinio sintaksinei struktūrai atvaizduoti grafu 15 puslapis
Programinė įranga lietuviško sakinio sintaksinei struktūrai atvaizduoti grafu 16 puslapis
Programinė įranga lietuviško sakinio sintaksinei struktūrai atvaizduoti grafu 17 puslapis
Programinė įranga lietuviško sakinio sintaksinei struktūrai atvaizduoti grafu 18 puslapis
Programinė įranga lietuviško sakinio sintaksinei struktūrai atvaizduoti grafu 19 puslapis
Programinė įranga lietuviško sakinio sintaksinei struktūrai atvaizduoti grafu 20 puslapis
www.nemoku.lt
www.nemoku.lt
Aukščiau pateiktos peržiūros nuotraukos yra sumažintos kokybės. Norėdami matyti visą darbą, spustelkite peržiūrėti darbą.
Ištrauka

Įžanga Paskutinieji XX a. dešimtmečiai pasižymėjo itin sparčia informacinių technologijų, padariusių perversmą moksle ir kasdieniniame gyvenime, raida. Kompiuterizacijai skverbiantis į pačias įvairiausias gyvenimo sferas, atsirado naujos mokslo tiriamųjų darbų kryptys, susijusios su kompiuterinių technologijų kūrimu ir taikymu specifinėse srityse. Viena iš tokių krypčių yra tautų kalbos reiškinių apdorojimas kompiuteriais. Kalbant apie kalbos apdorojimą kompiuteriais, turimos omenyje automatiško rašytinės ir sakytinės kalbos analizės bei generavimo (sintezės) technologijos, skirtos kompiuterinio vertimo, bendravimo su kompiuteriais tautų kalba, kompiuterinio kalbos mokymo ir kitiems panašiems tikslams. Sintaksinės analizės (sintaksė – tai lingvistinė gramatikos šaka, nagrinėjanti kurios nors kalbos sakinių ar sakinio dalių sandarą) poreikis atsirado, kai buvo pradėtos kurti automatinio vertimo sistemos. Kol kas nėra dar tokių vertimo mašinų, kurios galėtų, paspaudus kelis klavišus, paimti tekstą, parašytą viena kalba, ir be žmogaus pagalbos pateikti puikų vertimą kita kalba. Daugeliui pasaulio kalbų jau yra sukurtos automatinio vertimo sistemos. Lietuvių kalba tokios sistemos kol kas dar neturi. Pagrindinė priežastis turbūt yra ta, kad kompiuteriniam apdorojimui lietuvių kalba dar nėra pakankamai paruošta. „Kad lietuvių kalba nenuskęstų kitų tautų aktyviai naudojamų kalbų jūroje būtina nedelsiant pradėti sistemingai kurti priemones lietuvių kalbai į kitas kalbas ir kitų kalbų į lietuvių kalbą automatiniam vertimui, gaminti lietuvių šnekos automatinio atpažinimo ir sintezės prietaisus. Šiuos darbus galima atlikti sutelktomis informatikų ir humanitarų pastangomis. Svarbu, kad šiame kelyje esame ne vieni. Europos Sąjungos valstybės kalboms skiria išskirtinį dėmesį.“ [1]. Automatiniam vertimui reikia sukurti lietuvių kalbos morfologinės analizės ir sintezės modelius, parengti lietuvių kalbos sintaksės analizės ir sintezės modelius, padaryti lietuvių kalbos semantinės analizės ir sintezės modelius, sudaryti vertimui reikalingus žodynus ir tekstynus. Iš jau atliktų šios srities darbų galima paminėti V. Zinkevičiaus darbus [2, 3], jo sukurtą lietuvių kalbos lemavimo programą, kuri gali būti panaudota automatinio vertimo sistemos pirmam analizės etapui – teksto morfologinei analizei. Ši kompiuterinė programa automatiškai apibūdina lietuviškas rašytines žodžių formas gramatiniu (morfologiniu) aspektu ir nustato žodžiams antraštinius (žodyninius) pavidalus. Apie antrą analizės etapą – sakinio automatinę sintaksinę analizę spausdintų darbų kol kas nėra. Todėl automatinio lietuvių kalbos vertimo kūrėjų svarbiausias uždavinys šiuo metu yra sukurti automatinę lietuvių kalbos sintaksinę analizę. Pirmosios užuominos apie vertimo automatizavimą buvo jau septynioliktame amžiuje, kai tapo labai populiari „universalios kalbos“ idėja. 1629 m. Dekartas rašė, kad universali kalba turėtų būti sudaryta iš šifrų, kur visų žinomų kalbų ekvivalentams būtų suteiktas tas pats kodo numeris, ir siūlė sukurti žodynus, paremtus skaitmeniniais kodais. Vienas jų J.J. Becherio (1661) pakartotinai buvo išleistas septintame šio amžiaus dešimtmetyje. Becherio idėjos pranašavo pagrindinius automatinio vertimo principus. Jo knygoje dešimčiai tūkstančių lotyniškų žodžių suteikti kodai, tik jis nenurodė ekvivalentų graikų, hebrajų, vokiečių, prancūzų, slavų ir arabų kalbomis, kaip buvo siūloma žodyno aprašomojoje dalyje. Buvo aišku viena – skirtumai tarp kalbų yra tokie dideli, kad jų negali apimti žodynai, kad ir kaip jie būtų sudaryti. [4] Sukurti „vertimo mašinas“ pirmąkart buvo pasiūlyta 1933 metais tada, kai Prancūzijoje ir Rusijoje buvo pateikti du patentai apie mechaninius žodynus. Buvo planuojama panaudoti perfojuostų atminties įrenginį, kad būtų surastas žodžio ekvivalentas kitoje kalboje. Numatyti trys mechaninio vertimo etapai: 1. redaktorius, mokantis tik šaltinio kalbą, turėjo atlikti „loginę“ žodžių analizę, nurodydamas jų norminę formą (daiktavardžiams – vardininko linksnį, veiksmažodžiams – bendratį ir t.t.) ir sintaksinę funkciją; 2. mašina turėjo pakeisti norminių formų su funkcijomis seką į ekvivalentišką kitos kalbos seką; 3. redaktorius, mokantis tik rezultato kalbą, turėjo paversti mašinos pateiktus žodžius į reikiamas tos kalbos formas. Kompiuterių panaudojimo galimybes verčiant tekstus pirmą kartą aptarė Warren Weaver („I have wondered if it were unthinkable to design a computer which would translate“ – „Aš svarsčiau, ar neįtikėtina būtų sukurti kompiuterį, kuris galėtų atlikti vertimą“), kurio memorandumas, pasirodęs 1949 m., sukėlė didelį susidomėjimą automatiniu vertimu ir daugelyje JAV centrų buvo pradėti tyrinėjimai. [4] Problema Vienos kalbos žodžių keitimas kitos kalbos žodžiais vyksta dviem lygmenimis. Norint išversti vienos kalbos žodžius į kitą, reikia turėti sintaksinę struktūrą. Šiuo metu lietuvių kalbai nėra programinės įrangos, kuri formuotų lietuviško sakinio sintaksinę struktūrą. Šio darbo tikslas Sukurti programinę įrangą, kuri formuotų lietuviško sakinio sintaksinės struktūros grafą. Pagrindinis darbo uždavinys Sudaryti algoritmą, kuris iš lietuviškų žodžių sekos, sudarančios sakinį, ir kiekvieno žodžio sintaksinę struktūrą parodančios lentelės suformuotų sakinio sintaksinės struktūros grafinį vaizdą. Sintaksinės analizės sistemų ištakos Pirmosios automatinio vertimo sistemos dar nenaudojo sintaksinės analizės. Buvo labai prasta kokybė, kadangi šaltinio kalba buvo pažodžiui verčiama į kitą kalbą (vadinamosios tiesioginio vertimo sistemos (1 pav.)). Pvz., rusiškas sakinys Вчера мы целый час катались на лодке į anglų kalbą buvo verčiamas kaip Yesterday we the entire hour rolled themselves on a boat, kai tuo tarpu teisingas vertimas turėtų būti Yesterday we went out boating for a whole hour [5]. Todėl reikėjo tobulinti vertimo sistemas ir tekstus pradėta versti netiesiogiai – per tarpinę formą (2 pav.). 1 pav. Tiesioginio vertimo sistema 2 pav. Vertimas per tarpinę formą Iš pradžių mokslininkai rėmėsi prielaida, kad tekstą galima konvertuoti į semantinę-sintaksinę struktūrą, tinkančią daugeliui kalbų, ir tikėjosi sukurti ją universalią, kuri būtų bendra visoms kalboms, t.y. būtų tarpinė kalba. Joje turėjo atsispindėti visa informacija, reikalinga teksto generavimui bet kuria kalba. Praktiškai tai pasirodė sunkiai įgyvendinama. Panaudojant tarpinę kalbą vertimo procesas suskaidomas į dvi dalis: analizę, kurios metu šaltinio kalbos tekstas pavaizduojamas tarpine struktūra ir sintezę, kuri iš šios struktūros sudaro pageidaujamos kalbos tekstą. Tačiau sukurti tokią automatinio vertimo sistemą, kuri apimtų visas pasaulio kalbas, pasirodė labai sunku, todėl imta naudoti dar vieną netiesioginio vertimo metodą – keitimą, kuriame jau naudojama sintaksinė analizė. Čia šaltinio kalbos tekstas ir rezultato kalbos tekstas turi skirtingas tarpines formas (3 pav.). Jose vertimas susideda iš trijų dalių: 1. analizė, 2. keitimas, 3. sintezė. 3 pav. Keitimo metodo struktūrinė schema Keitiklio funkcija yra konvertuoti šaltinio kalbos struktūrą į rezultato kalbos struktūrą. Atsispindėti čia turi tik tos sąvokos, kurios sutinkamos šaltinio ir rezultato kalbose. Keitimo sistemose jau galima pasinaudoti kalbų panašumais ir dėl to tarpinės formos darosi paprastesnės. Tuo pasireiškia keitimo metodo privalumai. Kai vienas žodis turi daug atitikmenų, visi skirtumai turi būti apibrėžti tarpinėje struktūroje ir analizės metu kiekvieną kartą reikia nustatyti, kuri reikšmė pavartota tekste. Tai ir lėmė keitimo sistemų paplitimą. Analizės metu šaltinio tekstas performuojamas į tarpinę struktūrą. Tai atliekama trimis etapais: a) morfologinė analizė, b) sintaksinė analizė, c) semantinė analizė. Morfologinės analizės etape kiekvienam teksto žodžiui surandama jo pradinė forma (bendratis, vardininko linksnis ir pan.) bei nusakoma informacija apie sakinyje pavartotą to žodžio formą (giminė, skaičius, linksnis, asmuo ir kt.). Morfologijos objektas yra žodžio formos, jų visuma. Kaip minėjome, lietuvių kalbos morfologinė analizė yra automatizuota ([2] darbo lemavimo programa). Semantinė analizė naudojama panaikinti daugiareikšmiškumui. Atliekant semantinę analizę, žodžiams priskirtais reikšmių požymiais galima panaikinti šaltinio kalbos teksto daugiareikšmiškumą. Jie padeda tiksliau parinkti žodžius rezultato kalboje. Lietuvių kalbos semantinės analizės sistema dar nėra sukurta. Kai kurie semantiniai požymiai naudojami šiame darbe kaip sintaksinės analizės sudedamoji dalis. Sintaksinės analizės metu nustatomos žodžių sintaksinės funkcijos bei nurodomi ryšių tipai tarp jų. Sintaksės tyrimo esmę visada sudaro žodžių tarpusavio santykiai, žodžių ar sakinių jungimo taisyklės. Sintaksei rūpi ir žodžių formos, bet tik tiek, kiek jos gali atlikti tam tikras sintaksines funkcijas. Lietuvių kalbai sintaksinės analizės sistema taip pat kol kas dar nėra sukurta ir šio darbo tikslas – užpildyti tą spragą. Šaltinio teksto tarpinės formos keitimas į rezultato teksto tarpinę formą vyksta dviem lygmenimis: 1. Vienos kalbos žodžiai keičiami kitos kalbos žodžiais. Morfologinės analizės rezultatai perduodami dvikalbiams žodynams, iš kurių paimta informacija panaudojama sintezės metu formuoti išverstą tekstą. 2. Vienos kalbos sintaksinė struktūra keičiama kitos kalbos sintaksine struktūra. Labai dažnai jos nesutampa, todėl neatlikus sintaksinės analizės geros kokybės vertimo gauti negalima. (Visi sintaksiniai pakeitimai tai yra veiksmai, atliekami su medžiais). Pvz., sakinyje John likes the Film veiksmažodžio like struktūrinė schema, verčiant į lietuvių kalbą, būtų keičiama taip: S S’ funkcija funkcija funkcija funkcija funkcija funkcija VEIKSNYS TARINYS PAPILDINYS VEIKSNYS TARINYS PAPILDINYS žodis žodis žodis žodis žodis žodis Ž1 LIKE Ž2 Ž2’ PATIKTI Ž1’ Sintezės paskirtis yra iš pakeistos tarpinės struktūros suformuoti išverstą tekstą. Tai, galima sakyti, atvirkščias teksto analizei procesas. Todėl sukurtomis morfologinės bei sintaksinės analizės sistemomis galima pasinaudoti ruošiant sintezės etapo sistemas. Georgetown’o universiteto mokslininkas Leon Dostert buvo pirmasis (1954 m.), kuris sintaksinei analizei teikė tiek pat reikšmės, kiek ir leksiniam apdorojimui. O jau 1984 m. Hans-Ulrich Block savo disertacijoje rašė: „šaltinio kalbos sintaksinė analizė yra svarbiausia visos [vertimo] sistemos dalis“. Norint išsiaiškinti, kaip kompiuteris sudaro sakinio sintaksinę struktūrą, reikia patyrinėti du dalykus: a) gramatiką, kuri yra kalbos leistinų struktūrų formalus aprašas, b) nagrinėjimo techniką, t.y. kaip analizuojamas sakinys ir nustatoma jo struktūra pagal tą gramatiką. Mes galime sudaryti bei pasakyti sakinius, kurių niekada anksčiau nesame sakę ar girdėję, bet tuos sakinius supranta kiti žmonės, kuriems jie yra iš viso nauji, niekada anksčiau negirdėti. Tačiau mūsų laisvė sakyti nauja yra tam tikruose rėmuose. Visos kalbos turi sintaksę, kuri uždeda griežtas toje kalboje vartojamų šablonų ribas. Kokiai kalbos daliai priklauso žodžio forma, kartais lemia ir sakinio sintaksinė struktūra (Flying planes is dangerous ir Flying planes are dangerous – pirmame sakinyje flying yra daiktavardis, o antrame sakinyje ta pati žodžio forma jau yra dalyvis) bei žodžių junginys, kuriame tos formos yra (the green book ir the book worm – pirmame junginyje žodis book yra daiktavardis, o antrame – būdvardis). Lietuvių kalboje taip pat pasitaiko tokių atvejų, tik jie galbūt retesni, pvz., pušų sakai ir tu sakai – žodis sakai pirmu atveju daiktavardis, o antruoju – veiksmažodis. Sintaksinė sakinio struktūra rodo būdą, kaip žodžiai sakinyje yra susiję vienas su kitu. Labiausiai paplitęs sakinio struktūros pavaizdavimo būdas yra grafas (medis). Kalbininkų medžiai visada yra braižomi viršūne žemyn, t.y. šaknis yra viršuje, o lapai apačioje. Yra du iš principo skirtingi medžio sudarymo principai: žodžių junginių metodas ir priklausomumo metodas. Žodžių junginių metodas, kilo iš Amerikos mokslininkų sukurtos gramatikos, o priklausomybių gramatikos metodas kilo iš europietiškos tradicinės gramatikos, kurią pasiūlė kalbininkas Tesnièrre. Skirtumai gerai matyti pateikus to paties sakinio (pavyzdžiui The boy gave the girl an apple) struktūras abiem atvejais [6]. Žodžių junginių metodu sudaryta sakinio struktūra parodyta 4 pav. S NP VP NP NP Det N V Det N Det N The boy gave the girl an apple 4 pav. Sakinio the boy gave the girl an apple sintaksinė struktūra (žodžių junginių metodas) Sakinys (S) susideda iš daiktavardinio žodžių junginio (NP) ir veiksmažodinio žodžių junginio (VP). Veiksmažodinį žodžių junginį sudaro veiksmažodis (V) ir daiktavardiniai žodžių junginiai (NP). Pagrindinis žodžių junginių metodo trūkumas yra tas, kad analizė atliekama remiantis žodžių tvarka ir tokiame sakinyje kaip A man walked by wearing earrings nėra galimybės susieti žodį man su žodžiais wearing earrings [6]. Tokie atvejai lietuvių kalboje, kur žodžių tvarka sakinyje beveik visiškai laisva, yra labai dažni. Kita gramatikos teorija – priklausomybių gramatika – sako, kad sintaksė ne tiek turi grupuoti žodžius į žodžių junginius, kiek nustatyti tiesioginius ryšius tarp pačių žodžių. Šioje gramatikoje sakinio sintaksinė struktūra, pavaizduota medžiu, skiriasi nuo žodžių junginių metodu sudaryto medžio. Čia šaknyje stovi kaitomas veiksmažodis, o toliau eina nuo jo priklausomi žodžiai. Tas pats sakinys The boy gave the girl an apple priklausomybių gramatikoje atrodytų taip (5 pav.): gave boy girl apple the the an 5 pav. Sakinio The boy gave the girl an apple sintaksinė struktūra (priklausomybių gramatikos metodas) Principinis skirtumas tarp šių dviejų medžių yra tas, kad žodžių junginių gramatikoje visose viršūnėse yra sintaksinės kategorijos (sakinys, daiktavardinis žodžių junginys ir pan.) ir tik lapuose – patys sakinio žodžiai, o priklausomybių gramatikos medžio kiekvienoje viršūnėje yra sakinio žodis, ir žemiau jo pateikiami jį pažymintys žodžiai. Priklausomybių gramatikos siūloma struktūra yra nesusijusi su žodžių tvarka sakinyje ir todėl labiau paplito kalbose, turinčiose laisvą žodžių tvarką [7]. Tačiau automatizuojant lietuvių kalbos sintaksinę analizę ir šiuo medžiu pasinaudoti negalima, nes medis iš principo negali atspindėti visos sintaksinės informacijos, esančios lietuviškame sakinyje, t.y. jis negali parodyti visų ryšių tarp sakinio žodžių. Lietuvių kalbai negalioja priklausomybių gramatikos metodą pasiūliusio kalbininko Tesnièrre teiginys, kad pats žodis gali priklausyti tik nuo vieno žodžio, o priklausomų žodžių gali turėti kelis. Lietuvių kalboje tarininis pažyminys formaliai priklauso ir nuo tarinio, ir nuo veiksnio ar papildinio. Būdingas lietuvių kalbos bruožas yra tas, kad ji yra kaitoma ir žodžių formų turi labai daug. Visos pagrindinės kalbos dalys turi 24-28 formas. Pvz., angliškas žodis two jau vien vardininko linksnyje turi keturis atitikmenis. Žodžių junginiai two boys, two girls, two yers, two doors verčiami du berniukai, dvi mergaitės, dveji metai, dvejos durys. Kiekviena ši forma kaitoma šešiais linksniais – štai ir 24 skaitvardžio two formos. Dėl tokio žodžių formų gausumo jos yra svarbiausia sintaksinių ryšių raiškos priemonė lietuvių kalboje. Kiekviena kalba turi gramatinių ar kitokių priemonių rinkinį, kuris rodo tiesioginį prasminį žodžių ryšį sakinyje. Dažniausiai tai žodžių formos, tarnybiniai žodžiai (prielinksniai, jungtukai) ir žodžių tvarka sakinyje, kartais dar intonacija. Skirtingose kalbose pirmenybė teikiama ne toms pačioms žodžių ryšių raiškos priemonėms. Pavyzdžiui, anglų kalbai svarbiausia žodžių tvarka, po to tarnybiniai žodžiai ir tik paskiausia žodžių formos. Lietuvių kalboje ryšiai tarp žodžių pirmiausia rodomi žodžių formomis (ypač linksniais), po to tarnybiniais žodžiais ir tik paskiausia – žodžių tvarka. Dabartinėje lietuvių kalboje yra keturi pagrindiniai žodžių sintaksinių ryšių tipai: derinimas, valdymas, šliejimas ir formų koreliavimas. Ir beveik visi jie formaliai išreiškiami derinimu. Žodžių formų derinimas – tai nesavarankiškas morfologines kategorijas (giminė, skaičius, linksnis) turinčių būdvardiškųjų žodžių (dalyviai, būdvardiniai skaitvardžiai ir įvardžiai) taikymas prie kitų žodžių. Būdvardis lietuvių kalboje neturi savarankiškos giminės kategorijos. Jo giminė, skaičius ir linksnis pritaikomi prie daiktavardžio, kurį jis pažymi. Pats daiktavardis turi savarankišką giminės kategoriją ir giminėmis nekaitomas, pvz., žodis medis yra vyriškosios giminės ir jokiame žodžių junginyje jis nebus moteriškos giminės, o būdvardis geras junginyje geras žmogus yra vyriškosios giminės, o junginyje gera knyga – jau moteriškosios giminės. Valdymo santykio rodiklis taip pat yra priklausomojo žodžio forma – bet kuris linksnis, išskyrus vardininką (baigia darbą – galininkas, nori saldainio – kilmininkas ir pan.). Šliejimas yra vienintelis atvejis, kada žodis, prijungtas prie kito žodžio, formaliai į tą ryšį nereaguoja ir prijungimą rodo tik nesavarankiška to žodžio sintaksinė pozicija, pvz., prie veiksmažodžio asmenuojamosios formos prijungta bendratis (Niekas neišdrįso gesinti tos ugnies.). Koreliavimas – tai morfologiškai savarankiškų žodžių formų taikymas prie kitų žodžių. Čia dažniausiai atsižvelgiama tik į linksnį, giminė ir skaičius gali ir nesutapti. Pvz., Mūsiškės lūšys (moteriškoji giminė) yra gan stambūs plėšrūnai (vyriškoji giminė). Sintaksei priklauso ne tik sakinys, tekstas, bet ir tarpinis vienetas – žodžių junginys. Žodžių junginio ryšius rodo žodžių forma, ypač linksnis, pvz., sodinau beržą, džiaugiuos beržu, kartais linksnis, skaičius, giminė, pvz., baltas beržas. Žodžio formos irgi padeda išryškinti sakinio dalis. Vadinasi, sintaksė tiria teksto, sakinio, žodžių junginio struktūrą, kuri neatsiejama nuo žodžių formų. Teksto struktūros nagrinėjimas padeda įprasminti ir mažesniųjų vienetų, būtent sakinio (sudėtinio ar vientisinio), žodžių junginio sandaros ypatumus, žodžių funkcijas. Visa tai ir yra teoriniai sintaksės klausimai. Sakinio struktūros parinkimas Perimti jau sukurtų kitoms kalboms sintaksinės analizės sistemų negalima dėl didelių skirtumų tarp lietuvių kalbos ir kitų indoeuropiečių kalbų, kurios tokias sistemas jau turi. Kadangi lietuvių kalba yra kaitoma, lietuviško sakinio sintaksinei struktūrai pavaizduoti labiau tiktų priklausomybių gramatikos metodas. Tačiau medis negali apimti visos sakinio sintaksinės informacijos, esančios lietuviškame sakinyje. Tad lietuviško sakinio struktūrai pavaizduoti pasirenkamas grafas, kuris formuojamas pagal priklausomybių gramatikos principą. Kadangi žodžių formų derinimas rodo sintaksinį ryšį tarp tų žodžių, jis būtinai turi atsispindėti sakinio sintaksinėje struktūroje. Lietuvių kalboje vienas priklausomas žodis gali būti siejamas su dviem kitais žodžiais (to paties ar kito rango). Parodžius šiuos ryšius rodyklėmis, medyje susidaro uždaras kelias, o tai jau prieštarauja medžio apibrėžimui (medis – susietas grafas be ciklų). Todėl lietuviško sakinio sintaksinei struktūrai pavaizduoti pasirenkamas grafas. Lietuviško sakinio sintaksinė struktūra turi būti sudaroma remiantis naujausia lietuvių kalbos gramatika. Paskutinė pasirodžiusi spaudoje V. Labučio „Lietuvių kalbos sintaksė“ [8] sako, kad lietuvių kalboje yra dvi pagrindinės sakinio dalys – veiksnys ir tarinys bei trys antrininkės sakinio dalys – papildinys, pažyminys ir aplinkybė. Pagrindinės sakinio dalys išdėstomos grafo viršuje tame pačiame lygyje ir traktuojamos kaip to paties rango viršūnės. Žemiau pateikiamos antrininkės sakinio dalys, kurios išplečia pagrindines. Atliekant sintaksinę analizę automatiškai (kompiuteriu) patogu turėti apibendrintą schemą, kuri apimtų bet kokį lietuvišką sakinį, t.y. būtų bendra visiems lietuvių kalbos sakiniams. Kiekvienas konkretus sakinys turėtų aktyvuoti toje schemoje kurį nors vieną kelią. Apibendrinta lietuviško vientisinio sakinio schema pateikiama 6 pav.. Visos penkios sakinio dalys (veiksnys, tarinys, papildinys, pažyminys ir aplinkybė) gali būti išplėstos pažyminiu, papildiniu ir aplinkybe. Tačiau nė viena iš jų negali būti išplėsta veiksniu ar tariniu. Tai ir atsispindi schemoje. Šešėliai ant blokelių, atitinkančių sakinio dalis, žymi galimas vienarūšes sakinio dalis. Iš veiksnio išeinančios rodyklės į visas tris antrininkes sakinio dalis iš pirmo žvilgsnio gali atrodyti prieštaraujantis lietuvių kalbos gramatikai atvejis, nes lietuvių kalbos gramatikoje sakoma, kad papildinys gali jungtis tik prie veiksmažodžio, o pažyminys tik prie daiktavardžio. Tipinė veiksnio forma yra daiktavardžio vardininkas. Tokiu atveju jis išplečiamas pažyminiu (mažas vaikas). Kai veiksnys išreikštas veiksmažodžio bendratimi, jis gali būti išplečiamas papildiniu ar aplinkybe (Ginti tėvynę – visų mūsų pareiga). Apibendrintoje schemoje parodyti visi galimi atvejai. Kiekvienu konkrečiu atveju bus naudojama to sakinio struktūrą atitinkanti rodyklė. Pvz., sakinio Maža mergaitė nori raudono obuolio sintaksinės struktūros grafas yra apibendrintos sakinio struktūros dalis (7 pav.). Lietuviško vientisinio sakinio apibendrinta struktūrinė schema Sutrumpinimai: Pž – pažyminys, Pp – papildinys, A- aplinkybė, TPž – tarininis pažyminys. 6 pav. Apibendrinta lietuviško sakinio struktūrinė schema 1 2 3 4 5 6 Maža mergaitė labai nori raudono obuolio 1 (2-o derinamasis pažyminys) 2 (veiksnys) 3 (4-o aplinkybė) 4 (tarinys) 5 (6-o derinamasis pažyminys) 6 (4-o netiesioginis papildinys) 7 pav. Konkretaus sakinio aktyvuotas kelias apibendrintos struktūros grafe Tarininis pažyminys turi dvigubus sintaksinius ryšius. Jis formaliai derinamas su veiksniu ar papildiniu ir kartu šliejamas prie veiksmažodžio. Todėl schemoje ir parodytos dviejų rūšių rodyklės. Ištisinė linija žymi tarininio pažyminio priklausymą nuo tarinio, o punktyrine linija parodomas derinimas, kuris kartais gali būti tik linksniu ir skaičiumi, pvz., kai įvardis neturi giminės: nebepamatysi manęs gyvo (gyvos). Tarininis pažyminys rodo veiksniu ar papildiniu einančio daikto ypatybę, kurią jis turi tik to veiksmo metu. Pvz., Tėvas šiandien grįžo piktas (8 pav.). Požymis piktas žodžiui tėvas galioja tik grįžimo momentu ir nereiškia, kad jis visą laiką būna piktas. Tuo tarininis pažyminys skiriasi nuo paprasto pažyminio. Pvz., sakinyje Piktas vilkas atsėlino prie trobelės. Žodis piktas rodo pastovią vilko ypatybę, t.y. kad jis visada būna piktas. Papildinio atveju, pvz., Vakar aš mačiau motulę verkiančią (9 pav.) – žodis motulė turi savybę verkianti tik pamatymo momentu. Lietuvių kalboje yra sakinių, kuriuose kurios nors vienos pagrindinės sakinio dalies nėra (veiksnio, tarinio). Keletas šių ir kitų sakinių pavyzdžių yra pateikta 10-13 pav.. Lietuvių kalbos automatinės sintaksinės analizės ypatumus sąlygoja beveik visiškai laisva žodžių tvarka. Išimtys labai jau nedidelės. Neiginys eina prieš neigiamąjį žodį (ne visi taip gali); prielinksnis eina prieš linksnį (išėjome į mišką); klausiamoji dalelytė visada būna sakinio pradžioje (Ar visi susirinko?); šalutinio pažyminio sakinio vieta yra po pažymimojo žodžio; jei veiksnys ir tarinio vardinė dalis išreiškiami tomis pačiomis morfologinėmis formomis (daiktavardžio vardininku, bendratimi), veiksnys eina prieš tarinio vardinę dalį – tai, ko gero, būtų visi žodžių tvarką sakinyje reglamentuojantys atvejai. 1 2 3 4 Tėvas šiandien grįžo piktas 1 (veiksnys) 2 (3-o aplinkybė) 3 (tarinys) 4 (1-o tarininis(3) pažyminys) 8 pav. Tarininio pažyminio siejimas su veiksniu ir tariniu 1 2 3 4 5 Vakar aš mačiau motulę verkiančią 1 (3-o aplinkybė) 2 (veiksnys) 3 (tarinys) 4 (3-o tiesioginis papildinys) 5 (4-o tarininis(3) pažyminys) 9 pav. Papildinio ir tarininio pažyminio priklausomybė 1 2 3 4 5 6 Jo svajonės apie tolimus kraštus išsipildė. 1 (2-o nederinamasis pažyminys) 2 (veiksnys) 3 (prielinksnis) 4 (5-o derinamasis pažyminys) 5 (2-o papildininis pažyminys) 6 (tarinys) 10 pav. Sakinio aktyvuotas kelias apibendrintos struktūros grafe 1 2 3 4 5 6 Pavargusio keleivio ausis pasiekė keistas švokštimas, 7 8 9 10 11 12 nepanašus į pamažu rimstančios liūties ūžesį. 1 (2-o derinamasis pažyminys) 2 (3-o nederinamasis pažyminys) 3 (4-o tiesioginis papildinys) 4 (tarinys) 5 (6-o derinamasis pažyminys) 6 (veiksnys) 7 (6-o derinamasis pažyminys) 8 (prielinksnis) 9 (10-o aplinkybė) 10 (11-o derinamasis pažyminys) 11 (12-o nederinamasisi pažyminys) 12 (7-o papildinys) 11 pav. Sakinio aktyvuotas kelias apibendrintos struktūros grafe 1 2 3 Vaikams mieste patiks. 1 (3-o netiesioginis paildinys) 2 (3-o aplinkybė) 3 (tarinys) 12 pav. Sakinio aktyvuotas kelias apibendrintos struktūros grafe, kai nėra pagrindinės sakinio dalies – veiksnio 1 2 3 4 5 6 Vėsus ir ūkanotas ankstyvo pavasario rytas. 1 (6-o derinamasis pažyminys) 2 (jungtukas) 3 (6-o derinamasis pažyminys) 4 (5-o derinamasis pažyminys) 5 (6-o nederinamasis pažyminys) 6 (veiksnys) 13 pav. Sakinio aktyvuotas kelias apibendrintos struktūros grafe, kai nėra pagrindinės sakinio dalies – tarinio Programa lietuviško vientisinio sakinio sintaksinei struktūrai atvaizduoti grafu Sintaksinės analizės programos yra sudėtingesnė programų rūšis, leidžianti analizuoti sakinių sintaksę. Paprastai jos identifikuoja žodžius sakinyje, nustato jų sintaksinį priklausymą, sugrupuoja į aukštesnio lygio vienetus (žodžių junginius ir prijungiamuosius sakinius) ir atitinkamai juos pavadina. Sintaksinės analizės būna pagrįstos tikimybiniais skaičiavimais arba iš anksto sudarytomis taisyklėmis. Lietuvių kalbai sintaksinės analizės programa iki šiol dar nėra sukurta. Iš jau atliktų lietuvių kalbos formalizavimo darbų paminėta V. Zinkevičiaus sukurta lietuvių kalbos lemavimo programa, kuri parašyta Visual Basic kalba. Kadangi sintaksinėje analizėje naudojami morfologinės analizės duomenys, tai šio darbo programa sukurta taip pat Visual Basic 5.0 programavimo kalba. Duomenys yra imami iš dviejų tekstinių failų, kuriuose yra sakinys bei kiekvieno žodžio sintaksinė struktūra. Rezultatas – sakinio pavaizdavimas grafu. Aptarsime pradinius duomenis. Vienas iš pradinių duomenų yra nagrinėjamas sakinys. Jis yra rašomas naudojantis tekstiniu redaktoriumi Notepad. Vientisinis sakinys rašomas naudojantis visomis lietuviško sakinio sintaksės taisyklėmis, t.y. tarpai tarp žodžių, prieš kablelį tarpo nėra, po kablelio – yra ir t.t. Įvestasis sakinys yra vientisinis, turintis po vieną veiksnį, tarinį (14 pav.). Parašytas sakinys yra įrašomas ir taip turime vieną tekstinį failą. 14 pav. Lietuviško vientisinio sakinio rašymas teksto redaktoriuje Antrasis iš pradinių duomenų yra lietuviško vientisinio sakinio kiekvieno žodžio sintaksinę struktūrą vaizduojanti lentelė. Čia jau yra aprašoma, kokiai sakinio daliai priklauso kiekvienas konkretus žodis. 15 pav. Lietuviško vientisinio sakinio kiekvieno žodžio sintaksinę struktūrą vaizduojanti lentelė teksto redaktoriuje Šiame tekstiniame faile duomenys taip pat turėtų būti surašyti pagal tam tikras taisykles (15 pav.). Kiekviena eilutė – tai konkretaus žodžio sintaksė. Duomenys yra surašyti pagal tam tikro sakinio žodžių eiliškumą. Numeriai, esantys kiekvienos eilutės pradžioje – tai žodžio numeris, t.y. kelintas iš eilės jis eina nagrinėjamame sakinyje. Po žodžio eilės numerio dedamas tarpas ir atidaromas skliaustelis. Skliaustuose yra nurodoma, ar nagrinėjamo sakinio žodis yra pagrindinė sakinio dalis, ar antrininkė. Jei šis žodis yra pagrindinė sakinio dalis, t.y. veiksnys arba tarinys, tada iš karto tai ir yra rašoma (jokio skirtumo ar tai bus parašyta didžiąją ar mažąja raide). Pvz., 2 (Veiksnys), 4 (Tarinys). Tai reiškia, kad antrasis ir ketvirtasis žodžiai nagrinėjamame sakinyje yra atitinkamai veiksnys ir tarinys (pagrindinės sakinio dalys). Kitaip yra su antrininkėmis sakinio dalimis ar kitais žodžiais. Kadangi antrininkės sakinio dalys išplečia pagrindines, tai jos turi tam tikrus sąryšius. Aprašant šiuos žodžius, visų pirma už skliausto pradedamas rašyti numeris, nurodantis, kurį žodį jis papildo. Po numerio yra rašoma „-o“ („4-o“ reiškia „ketvirto“) ir tarpas. Po tarpo jau yra nurodoma, kokia tai antrininkė sakinio dalis. Pvz., 5 (6-o Derinamasis pažyminys), 6 (4-o Netiesioginis papildinys) ir t.t. Tai reiškia, kad nagrinėjamo sakinio penktasis žodis yra šeštojo derinamasis pažyminys ir šeštasis žodis yra ketvirtojo netiesioginis papildinys. Jei norėsime sužinoti konkrečiai, kuris žodis kurį papildo, arba kuris iš jų yra pagrindinė sakinio dalis, turime turėti abu šiuos tekstinius failus. Jei žiūrėsime į antrąjį tekstinį failą (nagrinėjamo sakinio struktūrą) ir norėsime prisiminti, kas yra 2 (Veiksnys), pažvelgę į pirmąjį failą matome, kad tai antrasis žodis mergaitė. O jei bus parašyta 1 (2-o Derinamasis pažyminys), reikš, kad tai yra žodis maža, kuris yra antrojo žodžio mergaitė derinamasis pažyminys. Dar kitaip yra su žodžiais, kurie nėra nei pagrindinės, nei antrininkės sakinio dalys. Kalbama apie žodžius, kurie vadinami jungtukais arba prielinksniais. Jie aprašomi sintaksinę struktūrą parodančioje lentelėje panašiai kaip pagrindinės sakinio dalys, t.y. iš karto skliaustuose yra įrašoma, priklausomai nuo nagrinėjamo žodžio, jungtukas ar prielinksnis (16-17 pav.). 16 pav. Sakiniai, kuriuose yra prielinksnis ir jungtukas, teksto redaktoriuje 17 pav. Nagrinėjamų sakinių, kuriuose yra prielinksnis ir jungtukas, kiekvieno žodžio sintaksinę struktūrą vaizduojančios lentelės teksto redaktoriuje Šie žodžiai grafe nebus vaizduojami. Kaip matome penktame sakinyje trečiasis žodis yra prielinksnis, o septintame sakinyje antrasis žodis yra jungtukas. Taigi turime du tekstinius failus, kurie yra mūsų programos pradiniai duomenys. Programa kuriama Visual Basic 5.0 programavimo kalba. Visų pirma kuriama forma, kurioje bus rodomas lietuviško vientisinio sakinio sintaksinės struktūros vaizdavimas grafu. Formoje yra nubraižomi du tekstiniai laukeliai, kurių pirmajame bus nurodomas nagrinėjamo sakinio tekstinis failas, o antrajame – nagrinėjamo sakinio sintaksinę struktūrą vaizduojančios lentelės tekstinis failas. Tuos sakinius ir nagrinėjamų sakinių struktūrą galima pasirinkti mygtukais „Pasirinkti“, kurie yra atitinkamai prie tų tekstinių laukelių. Žemiau jų yra trečiasis tekstinis laukelis, kuriame bus įrašytas nagrinėjamas lietuviškas vientisinis sakinys (18 pav.). 18 pav. Forma, kurioje bus vaizduojamas sakinio sintaksinės struktūros vaizdavimas grafu Trečiasis esantis mygtukas „Nagrinėti sakinį“ bus naudojamas tada, kai jau įrašyti į tekstinius laukelius sakinio ir jo žodžių sintaksinę struktūrą parodančios lentelės tekstiniai failai. Jį paspaudus, į trečiąjį tekstinį laukelį bus įrašomas nagrinėjamas sakinys ir nubraižomas sakinio sintaksinę struktūrą vaizduojantis grafas. Pradėjus rašyti programą, nurodoma, kaip turėtų vadintis forma, pradėjus vykdyti programą: Private Sub Form_Load() Form1.Caption = "Sakinio sintaksinės struktūros vaizdavimas grafu" For A = 1 To 50 Label1(A).Top = 0 Label1(A).Height = 0 Label1(A).Left = 0 Label1(A).Width = 0 Next A End Sub Kadangi mes vaizduosime sakinio sintaksinę struktūrą grafu, tai tikslingiausia taip ir būtų tą formą pavadinti. Tik pradėjus vykdyti programą reikia nurodyti, kad etiketės, kurių yra 50, bus patalpinamos kairiajame viršutiniame formos kampe. Jos ilgio ir aukščio iš karto neturės (prilyginama 0), kad netrukdytų vykdant programą. Toliau parašyti programos sakiniai parodo, kad paspaudus pirmąjį mygtuką atsivers dialogo langas, kurio pavadinimas „Pasirinkite sakinio failą“. Čia nurodomas kelias, kuriame yra nagrinėjamo sakinio tekstinis failas: Private Sub Command1_Click() CommonDialog1.DialogTitle = "Pasirinkite sakinio failą" CommonDialog1.ShowOpen Text1.Text = CommonDialog1.filename End Sub Lygiai tuo pačiu būdu yra pasirenkamas nagrinėjamo sakinio žodžių sintaksinę struktūrą parodančios lentelės tekstinis failas. Jį bus galima pasirinkti paspaudus antrąjį formos mygtuką ir tas kelias bus įrašomas antrajame tekstiniame laukelyje: Private Sub Command2_Click() CommonDialog1.DialogTitle = "Pasirinkite sakinio struktūros failą" CommonDialog1.ShowOpen Text2.Text = CommonDialog1.filename End Sub Kai jau nagrinėjamo sakinio tekstinių failų keliai nurodyti, trečiojo mygtuko paspaudimu atidarome šiuos reikiamus pasirinktuosius failus Private Sub Command3_Click() Open Text1.Text For Input As #1 Open Text2.Text For Input As #2 ir išvalome formą Form1.Cls Formą tenka išvalyti, kad, išvydę pasirinkto sakinio sintaksinės struktūros grafinį vaizdą, galėtumėme pasirinkti ir išvysti kito norimo sakinio grafinį vaizdą. Pirmojo sakinio grafinis vaizdas bus išvalytas, o tada tuo pačiu būdu galėsime pasirinkti antrojo sakinio ir jo sintaksinės struktūros tekstinius failus. Paspaudę „Nagrinėti sakinį“ pamatysime jau antrojo norimo vientisinio sakinio sintaksinės struktūros grafinį vaizdą. Dim Sakinys As String Line Input #1, Sakinys Šiose programos eilutėse žodis „Sakinys“ yra visa eilutė – vientisinis sakinys – iš pirmojo tekstinio failo, String tipo. Antrojoje programos eilutėje jau ta eilutė yra nuskaitoma iš turimo tekstinio failo. Reikia aprašyti kintamuosius, kurie bus naudojami toliau, rašant programą. „Zodis“ – tai nagrinėjamame sakinyje esančio žodžio numeris, kurio tipas yra Integer, o „Zodziai(50)“ tai konkretūs nagrinėjamo sakinio žodžiai, kurių tipas yra String. Skaičius 50 įrašytas todėl, kad pasirenkamas toks maksimalus sakinyje esančių žodžių kiekis. Tikrai nebus tokio lietuviško vientisinio sakinio, kurio žodžių skaičius jame bus daugiau nei 50. Dim Zodis As Integer Dim Zodziai(50) As String Sekančiu programos sakiniu yra įrašomas pasirinktasis nagrinėjamas vientisinis sakinys į trečiąjį tekstinį laukelį: Text3.Text = Sakinys „Pozicija“ – tai kiekvieno simbolio pozicija. Pradžioje ji yra priskiriama vienetui. „Ilgis“ – viso nagrinėjamo sakinio ilgis simboliais: Pozicija = 1 Ilgis = Len(Sakinys) Toliau jau reikia visą vientisinį sakinį, kuris yra nagrinėjamas, suskaidyti į atskirus žodžius. Tai ir yra atliekama tokiais žingsniais: Zodis = 1 Zodziai(Zodis) = "" While Pozicija "," Then Zodziai(Zodis) = Zodziai(Zodis) + Mid(Sakinys, Pozicija, 1) End If End If Pozicija = Pozicija + 1 Wend Visų pirma žodžio numeris priskiriamas vienetui. Antrojoje eilutėje nurodoma, kad pirmasis žodis yra tuščias. Kitais žingsniais nurodoma, kad kol einamoji pozicija nepasidarys “ “ (tarpas) arba tai nebus lygu kableliui, tai prie einamojo žodžio vis pridedama po simbolį. Jei sutinkamas tarpas, tai jau turima, kad vienas žodis baigėsi, jį jau atskyrėme, žodžio numeris padidinamas vienetu. Šis ciklas sukamas tol, kol pozicija (pozicija vis padidinama vienetu) bus mažesnė už viso sakinio ilgį simboliais. Aprašomi tolesniam programos vykdymui reikalingi naudojami kintamieji. „Rysiai(50)“ – tai Integer tipo kintamasis. Surandamas einamojo žodžio tėvinis žodis, t.y. su kuo jis yra susijęs, kelintu numeriu pažymėtas. „SubRyšiai(50)“ – priklausomybė tam pačiam lygiui. Šis Integer tipo kintamasis reikalingas nustatyti ryšį tame pačiame lygyje su kitu žodžiu. Priklausomybė tame pačiame lygyje bus Tarininio pažyminio. Jis turės ryšius ir su tame pačiame, ir su aukštesniame lygyje esančiais žodžiais. „Pavadinimai(50)“ – tai tiesiog kiekvieno konkretaus žodžio pavadinimas, t.y. kokia tai yra nagrinėjamo žodžio sakinio dalis (veiksnys, tarinys, papildinys, pažyminys ar aplinkybė): Dim Rysiai(50) As Integer Dim SubRysiai(50) As Integer Dim Pavadinimai(50) As String Visiems žodžiams nuo vieneto iki penkiasdešimties yra priskiriamos tuščios reikšmės: For A = 1 To 50 Rysiai(A) = 0 SubRysiai(A) = 0 Pavadinimai(A) = "" Next A „Strukt“ – nagrinėjamo sakinio sintaksinė struktūra, String tipo kintamasis. Jis turės kintantį einamojo žodžio aprašymą. Dim Strukt As String Sekantis ciklas „perbėgs“ per visus žodžius. Nuskaitoma A-tojo žodžio struktūra. „Ilgis“ – tai nagrinėjamos struktūros ilgis, „Eile“ – kelintas tai bus žodis. Simboliai „bėga“ struktūroje nuo nurodytos pozicijos per vieną simbolį. Ir kol nebus pasiektas tarpas, tol bus nustatinėjama, kelintas numeris yra parašytas, t.y. kelintas nagrinėjamas žodis. Kai jau yra nustatytas nagrinėjamas žodis, reikia ieškoti atsidarančio skliausto, kadangi juose yra mus dominanti informacija. Kol nesutiktas skliaustas, tol vėl yra pridedami simboliai ir pozicija pasislenka per vienetą. For A = 1 To Zodis Line Input #2, Strukt Pozicija = 1 Ilgis = Len(Strukt) Eile = 0 Simbolis = Mid(Strukt, Pozicija, 1) While Simbolis " " Eile = Eile * 10 + (Asc(Simbolis) - Asc("0")) Pozicija = Pozicija + 1 Simbolis = Mid(Strukt, Pozicija, 1) Wend While Simbolis "(" Pozicija = Pozicija + 1 Simbolis = Mid(Strukt, Pozicija, 1) Wend Pozicija = Pozicija + 1 Simbolis = Mid(Strukt, Pozicija, 1) If (Simbolis = "t") Or (Simbolis = "T") Then Rysiai(Eile) = 52 Pavadinimai(Eile) = "Tarinys" Else If (Simbolis = "v") Or (Simbolis = "V") Then Rysiai(Eile) = 51 Pavadinimai(Eile) = "Veiksnys" Else Kai yra aptinkamas skliaustas, tada reikia nustatinėti, ar tai bus pagrindinė, ar antrininkė sakinio dalis. Kadangi pagrindinės sakinio dalys vaizduojamos grafo viršūnėje ir jos yra aukščiausiame lygyje, tai jas pirmiausia ir reikia surasti. Visi kiti žodžiai – antrininkės sakinio dalys jau tik papildys šiuos žodžius. Todėl yra tikrinamas pats pirmasis simbolis už skliaustų. Jei tai bus “t“ arba “T “ (reikia imti abu atvejus, nes gali būti didžioji arba mažoji raidė), iš karto žinoma, kad tai pagrindinė sakinio dalis – Tarinys. Todėl jam ir galima priskirti pavadinimą „Tarinys“, o „Rysiai(Eile)“ priskiriamas skaičius 52, kad šis žodis būtų aukščiau visų. Juk iš karto yra žinoma jo padėtis grafe (aukščiausiame lygyje). Taip pat galima surasti ir kitą pagrindinę sakinio dalį – Veiksnį. “v“ arba “V“ reikš, kad rastas žodis yra kita pagrindinė sakinio dalis. Šiam žodžiui taip pat iš karto galima suteikti pavadinimą ir priskirti ryšį. Iš karto po skliaustų gali eiti ir kiti žodžiai, t.y. jungtukas arba prielinksnis, kurie nėra sakinio nei pagrindinė, nei antrininkė sakinio dalys. Šie žodžiai sintaksinės sakinio struktūros grafe nebus vaizduojami, todėl tikslinga būtų juos rasti. Jungtuką ir prielinksnį galima rasti taip pat, kaip buvo randami veiksnys su tariniu. Tikrinama pirmoji raidė, nustatinėjama, kas tai per žodis gali būti. Šiems žodžiams Rysiai(Eile) bus priskiriami nuliai, nes tada jie nebus nagrinėjami sekančiuose cikluose ir nevaizduojami tarp programos rezultatų: If (Simbolis = "j") Or (Simbolis = "J") Then Rysiai(Eile) = 0 Pavadinimai(Eile) = "Jungtukas" Else If (Simbolis = "p") Or (Simbolis = "P") Then Rysiai(Eile) = 0 Pavadinimai(Eile) = "Prielinksnis" Else Pradiniuose duomenyse už skliaustų gali būti ne raidė, bet kažkoks skaičius. Tuo atveju reikės „perbėgti“ per simbolius iki “-“ (brūkšnio) ir nustatinėti, koks tai bus skaičius. Per kiekvieną simbolį perbėgama analogiškai, kaip jau anksčiau buvusiuose peržvelgtuose sakiniuose: While Simbolis "-" Rysiai(Eile) = Rysiai(Eile) * 10 + (Asc(Simbolis) - Asc("0")) Pozicija = Pozicija + 1 Simbolis = Mid(Strukt, Pozicija, 1) Wend Jei yra aptiktas brūkšnys, nustatomas ryšys, su kuriuo žodžiu susijęs einamasis žodis. Tuomet iš karto galima pridėti tris pozicijas, per jas „perbėgti“, nes už brūkšnio eina raidė “o“ ir tarpas (15, 17 pav.). Kai tos trys pozicijos peršokamos, reikia „bėgti“ po vieną simbolį nuo nurodytos pozicijos, kol nebus aptiktas atsidarantis arba užsidarantis skliaustas. Jei bus sutiktas užsidarantis skliaustas, tai tų simbolių rinkinys bus nagrinėjamo sakinio konkretaus žodžio antrininkės sakinio dalies pavadinimas. Taip surandamas žodžio antrininkės sakinio dalies pavadinimas ir priskiriamas nagrinėjamam žodžiui. Pozicija = Pozicija + 3 Simbolis = Mid(Strukt, Pozicija, 1) While (Simbolis ")") And (Simbolis "(") Pavadinimai(Eile) = Pavadinimai(Eile) + Simbolis Pozicija = Pozicija + 1 Simbolis = Mid(Strukt, Pozicija, 1) Wend Kaip jau anksčiau minėta, Tarininis pažyminys turi du ryšius. Jis papildo žodį, esantį aukštesniame lygyje, derinamas su tame pačiame lygyje esančiu kitu žodžiu. Tarininis pažyminys tiesiogiai priklauso nuo tarinio ir gali būti derinamas su kitu žodžiu, esančiu tame pačiame lygyje kaip ir jis pats. 19 pav. yra pavaizduoti du sakiniai teksto redaktoriuje, kuriuose yra po tarininį pažyminį. Viršutiniame sakinyje žodis piktas, apatiniame – verkiančią. 19 pav. Sakiniai, kuriuose yra tarininis pažyminys Tarininiai pažyminiai sakinio struktūros lentelėje (antrame tekstiniame faile) aprašomi kitaip negu paprastos antrininkės sakinio dalys (20 pav.). 20 pav. Sakinių sintaksinės struktūros lentelės teksto redaktoriuje Kai aprašomas tarininis pažyminys, visų pirma už skliaustų yra rašomas numeris to žodžio, su kuriuo jis yra derinamas. Skaičius, esantis skliaustuose po žodžio tarininis, nurodo žodį, nuo kurio tiesiogiai priklauso. Pvz., 20 pav. aukščiau esančioje sintaksinėje struktūroje eilutė 4 (1-o tarininis(3) pažyminys) reiškia, kad ketvirtasis sakinio žodis piktas yra tarininis pažyminys, kuris derinamas su pirmuoju žodžiu tėvas ir tiesiogiai priklauso nuo trečiojo žodžio grįžo. Atitinkamai kito sakinio pavyzdyje 5 (4-o tarininis(3) pažyminys) eilutė reiškia, jog penktasis sakinio žodis verkiančią yra tarininis pažyminys, derinamas su ketvirtuoju žodžiu motulę ir tiesiogiai priklauso nuo trečiojo žodžio mačiau. Visa tai ir nustatinėja programos sakiniai. Ieško atsidarančių, užsidarančių skliaustų, nustato, koks yra simbolis, su kuriuo žodžiu yra susijęs ir pan. If (Simbolis = "(") Then SubRysiai(Eile) = Rysiai(Eile) Rysiai(Eile) = 0 Pozicija = Pozicija + 1 Simbolis = Mid(Strukt, Pozicija, 1) While Simbolis ")" Rysiai(Eile) = Rysiai(Eile) * 10 + (Asc(Simbolis) - Asc("0")) Pozicija = Pozicija + 1 Simbolis = Mid(Strukt, Pozicija, 1) Wend Pozicija = Pozicija + 1 Simbolis = Mid(Strukt, Pozicija, 1) Pavadinimai(Eile) = Pavadinimai(Eile) + " " While Simbolis ")" Pavadinimai(Eile) = Pavadinimai(Eile) + Simbolis Pozicija = Pozicija + 1 Simbolis = Mid(Strukt, Pozicija, 1) Wend End If End If End If End If End If Next A Kai yra nustatyti ryšiai tarp žodžių, priskirti pavadinimai jiems, galima nustatyti, kuriam lygiui jie priklauso. „Lygiai(50)“ – tai konkretaus žodžio lygis, t.y. kuriam lygiui jis priklauso. „LygPoz(50)“ – žodžio pozicija lygyje, t.y. kelintas jis bus tame lygyje. Dim Lygiai(50) As Integer Dim LygPoz(50) As Integer Visų pirma visiems penkiasdešimčiai žodžių priskiriamas nulinis lygis ir nulinė vieta tame lygyje: For A = 1 To 50 Lygiai(A) = 0 LygPoz(A) = 0 Next A Kadangi žinoma, kad veiksnys ir tarinys yra aukščiausiame – pirmame lygyje, tai anksčiau priskirti Rysiai(A) padeda iš karto nustatyti pagrindines sakinio dalis ir jiems priskirti aukščiausiąjį pirmąjį lygį: For A = 1 To Zodis If Rysiai(A) > 50 Then Lygiai(A) = 1 End If Next A Toliau nustatinėjami antrininkių sakinio dalių lygiai. Aprašyta, kad lygių B bus ne daugiau kaip 10. Toliau tikrinama, ar žodžiui nėra priskirtas koks nors lygis, ar jis turi ryšį su kuriuo nors žodžiu, ar tam žodžiui, su kuriuo turi ryšį, yra priskirtas lygis. Jei žodžiui jau bus jis priskirtas, tai žodžiui, kuris turės ryšį su turimuoju žodžiu, bus priskirtas vienetu žemesnis lygis: For B = 1 To 10 For A = 1 To Zodis If Lygiai(A) = 0 Then If Rysiai(A) > 0 Then If Lygiai(Rysiai(A)) > 0 Then Lygiai(A) = Lygiai(Rysiai(A)) + 1 End If End If End If Next A Next B Kai viskas, ką reikėjo sužinoti apie nagrinėjamo sakinio žodžius yra žinoma, reikia įrašyti juos į konkrečias etiketes. „Elementai(10,50)“ – tai dėžutės, į kurias bus įrašinėjami žodžiai, o „Elementu(10)“ – kintamasis kuris nusako, kiek konkrečiam lygy yra dėžučių. Kaip visada, visų pirma priskiriamos nulinės reikšmės: Dim Elementai(10, 50) As Integer Dim Elementu(10) As Integer For B = 1 To 10 For A = 1 To 50 Elementai(B, A) = 0 Next A Elementu(B) = 0 Next B Reikia suskaičiuoti nagrinėjamo sakinio žodžius ir priskirti dėžutes. Tikrinama, ar Rysiai(A) > 0, nes nuliniam ryšiui priskirti jungtukai ir prielinksniai, kurių vaizduoti grafe nereikia. Konkreti to lygio dėžutė turės informaciją apie konkretų žodį A. For A = 1 To Zodis If Rysiai(A) > 0 Then Elementu(Lygiai(A)) = Elementu(Lygiai(A)) + 1 Elementai(Lygiai(A), Elementu(Lygiai(A))) = A End If Next A Kitas ciklas dėžutes išrūšiuoja, kuria tvarka jos turės stovėti. Tikrinama, ar lygyje yra daugiau nei viena dėžutė. Kai lygyje yra viena dėžutė, tai nereikia tikrinti, kas pirmiau turi stovėti. Tikrinamas pirmame lygyje stovinčių dėžučių eiliškumas. Veiksnys turi stovėti pirmiau už tarinį. Žemesniuose lygiuose nustatoma dėžučių vieta pagal tėvinius žodžius (pagal žodžius, kuriems priklauso nagrinėjami žodžiai). Jei tėvinis žodis stovi kairiau, tai ir visi jam pavaldūs žodžiai turi stovėti kairiau, kad vaizduojant ryšius tarp žodžių, nesikirstų rodyklės. Galų gale žodžiui priskiriama, kelintoje vietoje jis bus vaizduojamas, kurioje dėžutėje patalpinamas. For B = 1 To 10 If Elementu(B) > 1 Then For A = 1 To Elementu(B) - 1 For C = A + 1 To Elementu(B) If B = 1 Then If Rysiai(Elementai(B, A)) > Rysiai(Elementai(B, C)) Then L = Elementai(B, A) Elementai(B, A) = Elementai(B, C) Elementai(B, C) = L End If Else If LygPoz(Rysiai(Elementai(B, A))) > LygPoz(Rysiai(Elementai(B, C))) Then L = Elementai(B, A) Elementai(B, A) = Elementai(B, C) Elementai(B, C) = L End If End If Next C Next A End If If Elementu(B) > 0 Then For A = 1 To Elementu(B) LygPoz(Elementai(B, A)) = A Next A End If Next B Kaip ir programos pradžioje, vėl nurodoma etikečių, kuriose bus patalpinama informacija apie žodį, vieta formoje: For A = 1 To 50 Label1(A).Top = 0 Label1(A).Height = 0 Label1(A).Left = 0 Label1(A).Width = 0 Next A Kintamuoju „Uzimta“ nurodoma, kiek yra užimta matomų dėžučių. Uzimta = 0 Sekančiais programos sakiniais yra braižomos etiketės, nurodoma jų padėtis formoje, jų ilgis bei plotis, lygiavimas jose, šrifto stilius. Nurodoma, kas turi būti patalpinama etiketėse, t.y. konkretūs žodžiai ir jų pavadinimai (sakinio dalys). For B = 1 To 10 If Elementu(B) > 0 Then For A = 1 To Elementu(B) Uzimta = Uzimta + 1 Label1(Uzimta).Top = 1800 + (B - 1) * 1200 Label1(Uzimta).Left = 5000 + 2500 * (A - Elementu(B) / 2) Label1(Uzimta).Width = 2000 Label1(Uzimta).Height = 1000 Label1(Uzimta).Alignment = 2 Label1(Uzimta).Font.Bold = True Label1(Uzimta).BorderStyle = 1 Label1(Uzimta).Caption = Chr(13) + Zodziai(Elementai(B, A)) + Chr(13) + Pavadinimai(Elementai(B, A)) Next A End If Next B Kai jau yra sukurtos etiketės, su jose esančia informacija apie žodžius, reikia nurodyti ryšius tarp jų, t.y. tarp konkrečių žodžių. Rodyklės nukreipiamos iš aukštesnio lygio į žemesnį. Šių rodyklių linija vientisa. Gale turi būti rodyklė, rodanti žodžių priklausomumą. Tarininis pažyminys turi du ryšius. Tiesioginis priklausomumas nurodomas rodykle su ištisine linija, o derinimas punktyrine. Imama Rysiai(A) > 0 ir Rysiai(A) 50, tai pirmasis lygis, kuriame yra pagrindinės sakinio dalys veiksnys ir tarinys. Jos siejamos tarpusavyje dviguba dvipuse rodykle. Kadangi veiksnys ir tarinys vienas kito nepapildo, yra vienodo rango. For A = 1 To Zodis If (Rysiai(A) > 0) And (Rysiai(A) 0 Then If Lygiai(A) Lygiai(SubRysiai(A)) Then NuoX = 6000 + 2500 * (LygPoz(A) - Elementu(Lygiai(A)) / 2) NuoY = 1700 + (Lygiai(A) - 1) * 1200 IkiX = 6000 + 2500 * (LygPoz(SubRysiai(A)) - Elementu(Lygiai(SubRysiai(A)))/2) IkiY = 1600 + (Lygiai(A) - 1) * 1200 Form1.DrawStyle = 1 Form1.Line (NuoX, NuoY)-(IkiX, IkiY) Form1.Line (NuoX, NuoY)-(NuoX, NuoY + 100) Form1.DrawStyle = 0 Form1.Line (NuoX, NuoY + 100)-(NuoX - 75, NuoY + 25) Form1.Line (NuoX, NuoY + 100)-(NuoX + 75, NuoY + 25) Else NuoX = 6000 + 2500 * (LygPoz(A) - Elementu(Lygiai(A)) / 2) NuoY = 1700 + (Lygiai(A)) * 1200 IkiX = 6000 + 2500 * (LygPoz(SubRysiai(A)) - Elementu(Lygiai(SubRysiai(A)))/2) IkiY = 1600 + (Lygiai(A)) * 1200 Form1.DrawStyle = 1 Form1.Line (NuoX, NuoY)-(IkiX, IkiY) Form1.Line (NuoX, NuoY)-(NuoX, NuoY - 100) Form1.DrawStyle = 0 Form1.Line (NuoX, NuoY - 100)-(NuoX - 75, NuoY - 25) Form1.Line (NuoX, NuoY - 100)-(NuoX + 75, NuoY - 25) End If End If Next A Kai visos antrininkės sakinio dalys susiejamos su tais žodžiais, kuriuos papildo, kai etiketės išdėstomos reikiamose vietose ir nurodomas ryšys tarp jų rodyklių pagalba, lieka nubraižyti dvipusę dvigubą rodyklę, kuri yra pirmame lygyje. Visų pirma nustatoma, ar pirmame lygyje yra daugiau nei vienas elementas. Esant vienam elementui, jokios rodyklės braižyti nereikės. Jei elementų daugiau nei vienas, piešiama dviguba dvipusė rodyklė. If Elementu(1) >= 2 Then Line (7035, 2300)-(7475, 2300) Line (7035, 2350)-(7475, 2350) Line (7000, 2325)-(7100, 2425) Line (7000, 2325)-(7100, 2225) Line (7500, 2325)-(7400, 2425) Line (7500, 2325)-(7400, 2225) End If Kai viskas išnagrinėta ir pavaizduota, tekstiniai failai, iš kurių buvo imami pradiniai duomenys, uždaromi ir programa baigia savo darbą: Close #1 Close #2 End Sub Kaip programa vaizduoja konkretaus lietuviško vientisinio sakinio sintaksinę struktūrą grafu, pateikta 21-24 pav. Visa programa, parašyta Visual Basic 5.0 programavimo kalba, yra pateikiama A priede. 21 pav. Sakinio „Maža mergaitė labai nori raudono obuolio“ sintaksinės struktūros vaizdavimas grafu 22 pav. Sakinio, kuriame yra tarininis pažyminys, sintaksinės struktūros vaizdavimas grafu 23 pav. Sakinio, kuriame yra tik viena pagrindinė sakinio dalis, sintaksinės struktūros vaizdavimas grafu 24 pav. Sakinio, kuriame yra prielinksnis, sintaksinės struktūros vaizdavimas grafu Išvados • Visual Basic 5.0 programavimo kalba sudaryta programa, galinti pateikti lietuviško vientisinio sakinio sintaksinę struktūrą, pavaizduotą grafu. Šiai programai naudojami duomenys yra informacija apie kiekvieno žodžio sintaksinę funkciją sakinyje. • Programa patikrinta testiniais sakiniais, kurių pavyzdžiai pateikti darbe (B priede). • Vienos kalbos žodžių keitimas kitos kalbos žodžiais vyksta dviem lygmenimis. Norint išversti vienos kalbos žodžius į kitą, reikia turėti sintaksinę struktūrą. Sukurta programa gali būti naudojama automatinio vertimo sistemos antram analizės etapui – sakinio automatinei sintaksinei analizei atlikti. Santrauka Lietuvių kalba tarp kitų kalbų tapo lygiateise Europos Sąjungos kalba. Automatinio vertimo priemonių kūrimas tapo dar aktualesnis. Kalbos automatinio vertimo realizavimui reikia sukurti lietuvių kalbos morfologinės analizės ir sintezės modelius, parengti lietuvių kalbos sintaksės analizės ir sintezės modelius, padaryti lietuvių kalbos semantinės analizės ir sintezės modelius, sudaryti vertimui reikalingus žodynus ir tekstynus. Šiuo metu lietuvių kalbai nėra programinės įrangos, kuri formuotų lietuviško sakinio sintaksinę struktūrą, kuri yra būtina, norint išversti vienos kalbos žodžius į kitą. Šio darbo tikslas buvo sukurti programinę įrangą, kuri formuotų lietuviško sakinio sintaksinės struktūros grafą. Tam reikėjo sudaryti algoritmą, kuris iš lietuviškų žodžių sekos, sudarančios sakinį, ir kiekvieno žodžio sintaksinę struktūrą parodančios lentelės suformuotų sakinio sintaksinės struktūros grafinį vaizdą. Darbe pateikiama programa, kurta Visual Basic 5.0 programavimo kalba. Programa naudodama kaip pradinius duomenis informaciją apie žodžių sintaksines funkcijas sakinyje, suformuoja grafą. Grafas atitinka lietuviško vientisinio sakinio sintaksinę struktūrą. Programa buvo išbandyta su dešimčia testinių sakinių, paimtų iš lietuvių autorių kūrybos. Visi testiniai sakiniai buvo teisingai pavaizduoti grafu. Summary Lithuanian language has become equal to other languages of Euro Union. Hence, the creation of the means for automatic translation has become an urgent issue. So solve the problem there should be models of morphological, syntactical and semantical analysis and synthesis created and dictionaries for translation compiled. At the present there is no software for Lithuanian language that could form the Lithuanian language structure necessary for translation of words from one language to another. The aim of this paper was to create a program that could form a graph of syntactic structure of Lithuanian sentence. For this purpose the algorithm that could make a graphical presentation of syntactic sentence structure of Lithuanian words sequence in sentence and syntactic structure of each word should be formed. The paper presents the program created is Visual Basic 5.0 language. The program, using information about syntactic function of words in the sentence as primary data, forms the graph. The graph corresponds the syntactic structure of Lithuanian simple sentence. The program was tested on 10 test sentences taken from Lithuanian authors’ works. All the sentences were depicted by the graph correctly. Literatūra 1. Lietuvių kalbos informacinėje visuomenėje programa. 2000-2006, http://kalba.mch.mii.lt/progrtekstas.htm 2. V. Zinkevičius. Lemuoklis – morfologinei analizei. Darbai ir dienos 24, Vytauto Didžiojo universitetas, p. 245-273, 2000. 3. V. Zinkevičius. Lietuvių kalbos automatinis morfologinis atpažinimas ir sintezė. http://www.liks.lt/anatac.htm 4. W.J. Hutchins. Machine Translation:Pats, Present, Future. Ellis Harwood Limited, 1986. 5. D. Šveikauskienė. Automatinio vertimo apžvalga. Informacinės technologijos ’98, konferencijos pranešimų apžvalga. Kaunas, Technologija, 1998. 6. M. Kay, J. M. Gawron, P. Norwig. Verbmobil. A Translation System for Fase-to-Fase Dialog. Center for the Study of Language and Information, Stanford, 1994. 7. T. Winograd. Language as a Cognitive Process. Volum I: Syntax. Addison-Wesley Publishing Company, London, 1983. 8. V. Labutis. Lietuvių kalbos sintaksė. Vilniaus universiteto leidykla, Vilnius, 1998. 9. A. Utka. Kalbinė įranga ir jos galimybės. Darbai ir dienos, 2000, ISSN 1392–0588. 10. E. Rimkutė. Lietuvių kalbos tekstyno morfologinės analizės automatizavimas. http://www3.vdu.lt/~ivus01/pdt/sm_rimkute.pdf 11. D. Jurafsky & J. H. Martin. Speech and language Processing. An Introduction to Natural Language Processing, Compiutational Linguistics, and Speech Recognition. Prentice Hall, 2000. Priedai A priedas Programa lietuviško vientisinio sakinio sintaksinei struktūrai atvaizduoti grafu: Private Sub Form_Load() Form1.Caption = "Sakinio sintaksinės struktūros vaizdavimas grafu" For A = 1 To 50 Label1(A).Top = 0 Label1(A).Height = 0 Label1(A).Left = 0 Label1(A).Width = 0 Next A End Sub Private Sub Command1_Click() CommonDialog1.DialogTitle = "Pasirinkite sakinio faila" CommonDialog1.ShowOpen Text1.Text = CommonDialog1.filename End Sub Private Sub Command2_Click() CommonDialog1.DialogTitle = "Pasirinkite sakinio strukturos faila" CommonDialog1.ShowOpen Text2.Text = CommonDialog1.filename End Sub Private Sub Command3_Click() Open Text1.Text For Input As #1 Open Text2.Text For Input As #2 Form1.Cls Dim Sakinys As String Line Input #1, Sakinys Dim Zodis As Integer Dim Zodziai(50) As String Text3.Text = Sakinys Pozicija = 1 Ilgis = Len(Sakinys) Zodis = 1 Zodziai(Zodis) = "" While Pozicija "," Then Zodziai(Zodis) = Zodziai(Zodis) + Mid(Sakinys, Pozicija, 1) End If End If Pozicija = Pozicija + 1 Wend Dim Rysiai(50) As Integer Dim SubRysiai(50) As Integer Dim Pavadinimai(50) As String For A = 1 To 50 Rysiai(A) = 0 SubRysiai(A) = 0 Pavadinimai(A) = "" Next A Dim Strukt As String For A = 1 To Zodis Line Input #2, Strukt Pozicija = 1 Ilgis = Len(Strukt) Eile = 0 Simbolis = Mid(Strukt, Pozicija, 1) While Simbolis " " Eile = Eile * 10 + (Asc(Simbolis) - Asc("0")) Pozicija = Pozicija + 1 Simbolis = Mid(Strukt, Pozicija, 1) Wend While Simbolis "(" Pozicija = Pozicija + 1 Simbolis = Mid(Strukt, Pozicija, 1) Wend Pozicija = Pozicija + 1 Simbolis = Mid(Strukt, Pozicija, 1) If (Simbolis = "t") Or (Simbolis = "T") Then Rysiai(Eile) = 52 Pavadinimai(Eile) = "Tarinys" Else If (Simbolis = "v") Or (Simbolis = "V") Then Rysiai(Eile) = 51 Pavadinimai(Eile) = "Veiksnys" Else If (Simbolis = "j") Or (Simbolis = "J") Then Rysiai(Eile) = 0 Pavadinimai(Eile) = "Jungtukas" Else If (Simbolis = "p") Or (Simbolis = "P") Then Rysiai(Eile) = 0 Pavadinimai(Eile) = "Prielinksnis" Else While Simbolis "-" Rysiai(Eile)=Rysiai(Eile)*10+(Asc(Simbolis)-Asc("0")) Pozicija = Pozicija + 1 Simbolis = Mid(Strukt, Pozicija, 1) Wend Pozicija = Pozicija + 3 Simbolis = Mid(Strukt, Pozicija, 1) While (Simbolis ")") And (Simbolis "(") Pavadinimai(Eile) = Pavadinimai(Eile) + Simbolis Pozicija = Pozicija + 1 Simbolis = Mid(Strukt, Pozicija, 1) Wend If (Simbolis = "(") Then SubRysiai(Eile) = Rysiai(Eile) Rysiai(Eile) = 0 Pozicija = Pozicija + 1 Simbolis = Mid(Strukt, Pozicija, 1) While Simbolis ")" Rysiai(Eile)=Rysiai(Eile)*10+(Asc(Simbolis)-Asc("0")) Pozicija = Pozicija + 1 Simbolis = Mid(Strukt, Pozicija, 1) Wend Pozicija = Pozicija + 1 Simbolis = Mid(Strukt, Pozicija, 1) Pavadinimai(Eile) = Pavadinimai(Eile) + " " While Simbolis ")" Pavadinimai(Eile) = Pavadinimai(Eile) + Simbolis Pozicija = Pozicija + 1 Simbolis = Mid(Strukt, Pozicija, 1) Wend End If End If End If End If End If Next A Dim Lygiai(50) As Integer Dim LygPoz(50) As Integer For A = 1 To 50 Lygiai(A) = 0 LygPoz(A) = 0 Next A For A = 1 To Zodis If Rysiai(A) > 50 Then Lygiai(A) = 1 End If Next A For B = 1 To 10 For A = 1 To Zodis If Lygiai(A) = 0 Then If Rysiai(A) > 0 Then If Lygiai(Rysiai(A)) > 0 Then Lygiai(A) = Lygiai(Rysiai(A)) + 1 End If End If End If Next A Next B Dim Elementai(10, 50) As Integer Dim Elementu(10) As Integer For B = 1 To 10 For A = 1 To 50 Elementai(B, A) = 0 Next A Elementu(B) = 0 Next B For A = 1 To Zodis If Rysiai(A) > 0 Then Elementu(Lygiai(A)) = Elementu(Lygiai(A)) + 1 Elementai(Lygiai(A), Elementu(Lygiai(A))) = A End If Next A For B = 1 To 10 If Elementu(B) > 1 Then For A = 1 To Elementu(B) - 1 For C = A + 1 To Elementu(B) If B = 1 Then If Rysiai(Elementai(B, A))>Rysiai(Elementai(B, C)) Then L = Elementai(B, A) Elementai(B, A) = Elementai(B, C) Elementai(B, C) = L End If Else If LygPoz(Rysiai(Elementai(B, A))) > LygPoz(Rysiai(Elementai(B, C))) Then L = Elementai(B, A) Elementai(B, A) = Elementai(B, C) Elementai(B, C) = L End If End If Next C Next A End If If Elementu(B) > 0 Then For A = 1 To Elementu(B) LygPoz(Elementai(B, A)) = A Next A End If Next B For A = 1 To 50 Label1(A).Top = 0 Label1(A).Height = 0 Label1(A).Left = 0 Label1(A).Width = 0 Next A Uzimta = 0 For B = 1 To 10 If Elementu(B) > 0 Then For A = 1 To Elementu(B) Uzimta = Uzimta + 1 Label1(Uzimta).Top = 1800 + (B - 1) * 1200 Label1(Uzimta).Left = 5000 + 2500 * (A - Elementu(B) / 2) Label1(Uzimta).Width = 2000 Label1(Uzimta).Height = 1000 Label1(Uzimta).Alignment = 2 Label1(Uzimta).Font.Bold = True Label1(Uzimta).BorderStyle = 1 Label1(Uzimta).Caption = Chr(13) + Zodziai(Elementai(B, A)) + Chr(13) + Pavadinimai(Elementai(B, A)) Next A End If Next B For A = 1 To Zodis If (Rysiai(A) > 0) And (Rysiai(A) 0 Then If Lygiai(A) Lygiai(SubRysiai(A)) Then NuoX = 6000 + 2500 * (LygPoz(A) - Elementu(Lygiai(A)) / 2) NuoY = 1700 + (Lygiai(A) - 1) * 1200 IkiX = 6000 + 2500 * (LygPoz(SubRysiai(A)) - Elementu(Lygiai(SubRysiai(A))) / 2) IkiY = 1600 + (Lygiai(A) - 1) * 1200 Form1.DrawStyle = 1 Form1.Line (NuoX, NuoY)-(IkiX, IkiY) Form1.Line (NuoX, NuoY)-(NuoX, NuoY + 100) Form1.DrawStyle = 0 Form1.Line (NuoX, NuoY + 100)-(NuoX - 75, NuoY + 25) Form1.Line (NuoX, NuoY + 100)-(NuoX + 75, NuoY + 25) Else NuoX = 6000 + 2500 * (LygPoz(A) - Elementu(Lygiai(A)) / 2) NuoY = 1700 + (Lygiai(A)) * 1200 IkiX = 6000 + 2500 * (LygPoz(SubRysiai(A)) - Elementu(Lygiai(SubRysiai(A))) / 2) IkiY = 1600 + (Lygiai(A)) * 1200 Form1.DrawStyle = 1 Form1.Line (NuoX, NuoY)-(IkiX, IkiY) Form1.Line (NuoX, NuoY)-(NuoX, NuoY - 100) Form1.DrawStyle = 0 Form1.Line (NuoX, NuoY - 100)-(NuoX - 75, NuoY - 25) Form1.Line (NuoX, NuoY - 100)-(NuoX + 75, NuoY - 25) End If End If Next A If Elementu(1) >= 2 Then Line (7035, 2300)-(7475, 2300) Line (7035, 2350)-(7475, 2350) Line (7000, 2325)-(7100, 2425) Line (7000, 2325)-(7100, 2225) Line (7500, 2325)-(7400, 2425) Line (7500, 2325)-(7400, 2225) End If Close #1 Close #2 End Sub B priedas Pateikiami testiniai sakiniai, paimti iš lietuvių autorių kūrybos, pradiniai duomenys, bei jų pavaizdavimas grafu. 1 testinis sakinys: 1 2 3 4 5 6 7 Netikėtai vakaruose, dangaus pakraštyje, mėlynumas pamaži balo. (Žemaitė) 1 (7-o aplinkybė) 2 (7-o aplinkybė) 3 (4-o pažyminys) 4 (7-o aplinkybė) 5 (veiksnys) 6 (7-o aplinkybė) 7 (tarinys) 2 testinis sakinys: 1 2 3 4 5 6 7 Gana margą plėšriųjų paukščių šeimą sudaro sakalai. (Tadas Ivanauskas) 1 (2-o aplinkybė) 2 (5-o pažyminys) 3 (4-o pažyminys) 4 (5-o pažyminys) 5 (6-o papildinys) 6 (tarinys) 7 (veiksnys) 3 testinis sakinys: 1 2 3 4 Mėnesienoj rugsėjo mačiau juos. (Salomėja Nėris) 1 (3-o aplinkybė) 2 (1-o pažyminys) 3 (tarinys) 4 (3-o papildinys) 4 testinis sakinys: 1 2 3 4 5 6 Negyvuos žiemos speiguos tujen lauk manęs. (Salomėja Nėris) 1 (3-o pažyminys) 2 (3-o pažyminys) 3 (5-o aplinkybė) 4 (veiksnys) 5 (tarinys) 6 (5-o papildinys) 5 testinis sakinys: 1 2 3 4 Ramios malonios vasaros naktys. (Maironis) 1 (4-o pažyminys) 2 (4-o pažyminys) 3 (4-o pažyminys) 4 (veiksnys) 6 testinis sakinys: 1 2 3 4 5 Rugpjūčio naktį žvaigždės žemėn krinta. (Vincas Mykolaitis-Putinas) 1 (2-o pažyminys) 2 (5-o aplinkybė) 3 (veiksnys) 4 (5-o aplinkybė) 5 (tarinys) 7 testinis sakinys: 1 2 3 Tėvas stovi vienplaukis. (Juozas Baltušis) 1 (veiksnys) 2 (tarinys) 3 (1-o tarininis pažyminys) 8 testinis sakinys: 1 2 3 4 5 Jis labai išsiilgo savo tėviškės. (Ieva Simionaitytė) 1 (veiksnys) 2 (3-o aplinkybė) 3 (tarinys) 4 (5-o pažyminys) 5 (3-o papildinys) 9 testinis sakinys: 1 2 3 4 5 6 Plieninis viesulas nudraskė tau žalius lapus. (Kostas Korsakas) 1 (2-o pažyminys) 2 (veiksnys) 3 (tarinys) 4 (3-o papildinys) 5 (6-o pažyminys) 6 (3-o papildinys) 10 testinis sakinys: 1 2 3 4 5 Netoli pelkių piemenukas ugnį kūrenosi. (Pranas Mašiotas) 1 (5-o aplinkybė) 2 (1-o papildinys) 3 (veiksnys) 4 (5-o papildinys) 5 (tarinys)

Daugiau informacijos...

Šį darbą sudaro 8961 žodžiai, tikrai rasi tai, ko ieškai!

Turinys
  • Įžanga 3
  • Problema, darbo tikslas, pagrindinis uždavinys 5
  • Sintaksinės analizės sistemų ištakos 6
  • Sakinio struktūros parinkimas 13
  • Programa lietuviško vientisinio sakinio sintaksinei struktūrai atvaizduoti grafu 24
  • Išvados 45
  • Santrauka 46
  • Summary 47
  • Literatūra 48
  • Priedai; A priedas 49
  • B priedas 55

★ Klientai rekomenduoja


Šį rašto darbą rekomenduoja mūsų klientai. Ką tai reiškia?

Mūsų svetainėje pateikiama dešimtys tūkstančių skirtingų rašto darbų, kuriuos įkėlė daugybė moksleivių ir studentų su skirtingais gabumais. Būtent šis rašto darbas yra patikrintas specialistų ir rekomenduojamas kitų klientų, kurie po atsisiuntimo įvertino šį mokslo darbą teigiamai. Todėl galite būti tikri, kad šis pasirinkimas geriausias!

Detali informacija
Darbo tipas
Šaltiniai
✅ Šaltiniai yra
Failo tipas
Word failas (.doc)
Apimtis
65 psl., (8961 ž.)
Darbo duomenys
  • Informacinių technologijų magistro darbas
  • 65 psl., (8961 ž.)
  • Word failas 762 KB
  • Lygis: Universitetinis
  • ✅ Yra šaltiniai
www.nemoku.lt Atsisiųsti šį magistro darbą
Privalumai
Pakeitimo garantija Darbo pakeitimo garantija

Atsisiuntei rašto darbą ir neradai jame reikalingos informacijos? Pakeisime jį kitu nemokamai.

Sutaupyk 25% pirkdamas daugiau Gauk 25% nuolaidą

Pirkdamas daugiau nei vieną darbą, nuo sekančių darbų gausi 25% nuolaidą.

Greitas aptarnavimas Greitas aptarnavimas

Išsirink norimus rašto darbus ir gauk juos akimirksniu po sėkmingo apmokėjimo!

Atsiliepimai
www.nemoku.lt
Dainius Studentas
Naudojuosi nuo pirmo kurso ir visad randu tai, ko reikia. O ypač smagu, kad įdėjęs darbą gaunu bet kurį nemokamai. Geras puslapis.
www.nemoku.lt
Aurimas Studentas
Puiki svetainė, refleksija pilnai pateisino visus lūkesčius.
www.nemoku.lt
Greta Moksleivė
Pirkau rašto darbą, viskas gerai.
www.nemoku.lt
Skaistė Studentė
Užmačiau šią svetainę kursiokės kompiuteryje. :D Ką galiu pasakyti, iš kitur ir nebesisiunčiu, kai čia yra viskas ko reikia.
Palaukite! Šį darbą galite atsisiųsti visiškai NEMOKAMAI! Įkelkite bet kokį savo turimą mokslo darbą ir už kiekvieną įkeltą darbą būsite apdovanoti - gausite dovanų kodus, skirtus nemokamai parsisiųsti jums reikalingus rašto darbus.
Vilkti dokumentus čia:

.doc, .docx, .pdf, .ppt, .pptx, .odt