230 likes | 404 Views
SOFTWAROVÝ PROJEKT Slovník cudzích slov. Vedúci: RNDr. Stanislav Krajči, PhD. Riešiteľ: Lucia Gotthardová. Cieľom projektu bolo. Hlavný cieľ projektu :
E N D
SOFTWAROVÝ PROJEKT Slovník cudzích slov Vedúci: RNDr. Stanislav Krajči, PhD. Riešiteľ: Lucia Gotthardová
Cieľom projektu bolo Hlavný cieľ projektu: • Vytvorenie aplikácie (v programovacom prostredí Delphi) na prepis súboru typu TXT, ktorý obsahuje heslá z Veľkého slovníka cudzích slov, do súboru typu XML. Podciele: • Uskutočniť podrobnú analýzu slovníkových hesiel. • Navrhnúť štruktúru XML súboru • Vytvoriť DTD súbor. DTD = definícia typu dokumentu
Vstup a štruktúra • vstupný textový súbor: • @abadir@ -u m. /orient./ v Oriente uctievané posvätné kamene, obyčajne okrúhle • @ab aeterno@ [ab-eterno] /lat./ od večnosti • @abak@ -a m. /tag. -> špan./ -> abakus • @abaka@ -y ž. /indonéz./ text. vlákno z listov daktorých druhov banánovníkov • každej časti rozanalyzovaného textu prislúcha 1 trieda • „hlavná“ trieda Slovnik_cudzich_slov obsahuje Heslove_jednotky • TSlovnik_cudzich_slov = class • private • Heslova_jednotka: array of THeslova_jednotka; • number: integer; • public • constructor CREATE; • function ANALYZUJ(s: string):boolean; • procedure XML(var f: TEXT); • Heslova_jednotka obsahuje ďalšie časti, pre ktoré sú definované prísušné triedy
Výklady významu TVyznam = class private Podvyznam: array of TPodvyznam; cislo_vyz: string; number: integer; nastavene:boolean; public constructor CREATE; function ANALYZUJ(s:string): boolean; procedure XML(var f:TEXT); end; TVyklady_vyznamu = class private Vyznam: array of TVyznam; number: integer; nastavene:boolean; public constructor CREATE; function ANALYZUJ(s:string):boolean; procedure XML(var f:TEXT); end; TPodvyznam = class private Styly: TStyly; Povody: TPovody; Odkaz: TOdkaz; Antonymum: TAntonymum; Text_vyznamu: TText_vyznamu; nastavene:boolean; public constructor CREATE; function ANALYZUJ(s:string):boolean; procedure XML(var f:TEXT); end; TText_vyznamu = class private text: string; nastavene:boolean; public constructor CREATE; function ANALYZUJ(s: string): boolean; procedure XML(var f:TEXT); end;
Výklady významu Analýza
Prepis • konštruktorom sa vytvorí inštancia "najvrchnejšej" triedy - Slovnik_cudzich_slov.CREATE • pokiaľ nie je koniec súboru • - načíta sa jeden riadok • - z riadku sa postupne načítavajú slová • - Slovnik_cudzich_slov.ANALYZUJ(slovo) • - Heslova_jednotka.CREATE • - Heslova_jednotka.ANALYZUJ(slovo) -> Heslove_slovo.ANALYZUJ(slovo), • ak nie, Odkaz.ANALYZUJ(slovo), • ak nie, Vyslovnost.ANALYZUJ(slovo), atď... • zápis do výstupného súboru • - Slovnik_cudzich_slov.XML(f) procedure TSlovnik_cudzich_slov.XML(var f:text); var i:integer; begin writeln(f,'<Slovník_cudzích_slov>'); for i:=0 to number-1 do Heslova_jednotka[i].XML(f); writeln(f,'</Slovník_cudzích_slov>'); end;
Prepis procedure THeslova_jednotka.XML(var f:TEXT); begin writeln(f,' <Heslová_jednotka>'); Heslove_slovo.XML(f); Odkaz.XML(f); Vyslovnost.XML(f); Gramaticka_charakteristika.XML(f); Varianty.XML(f); Zenska_prechylena_podoba.XML(f); Povody.XML(f); Vyklady_vyznamu.XML(f); Antonymum.XML(f); writeln(f,' </Heslová_jednotka>'); end; procedure TVariant.XML(var f:TEXT); begin if not nastavene then exit; writeln(f,' <Variant>'); Tvar_variantu.XML(f); Vyslovnost.XML(f); Gramaticka_charakteristika.XML(f); writeln(f,' </Variant>'); end; procedure TTvar_variantu.XML(var f:TEXT); begin if not nastavene then exit; write(f,' <Tvar_variantu'); if cislo_tvaru_var <> '' then write(f,' číslo_tvaru_var=' + cislo_tvaru_var); write(f,'>'); write(f,tvar_var); writeln(f,'</Tvar_variantu>'); end; procedure TVarianty.XML(var f:TEXT); var i: integer; begin if not nastavene then exit; writeln(f,' <Varianty>'); for i:= 0 to number-1 do Variant[i].XML(f); writeln(f,' </Varianty>'); end;
Výslovnosť @ab hoc et ab hac@ [-hok -hák] /lat./ o tomto i o tamtom; dve na tri (hovoriť, tárať) if znak = '[' then begin if i = 1 then hheslove_slovo_s_vyslovnostou:= true; je_tam:= ZISTI(riadok,']',i); if je_tam then begin sslovo:= '['; inc(i); znak:= riadok[i]; while znak <> ']' do begin sslovo:= sslovo + znak; inc(i); znak:= riadok[i]; end; vvyslovnost:= true; end end;
Pôvod @abreografía@ -ie ž. /podľa brazílskeho lekára Manoela de Abreua + gréc./ lek. rÖntgenologické ... if znak = '/' then begin if i = 1 then hheslove_slovo_s_vyslovnostou:= true; je_tam:= ZISTI(riadok,'/‚i); if je_tam then begin sslovo:= '['; inc(i); znak:= riadok[i]; while znak <> ']' do begin sslovo:= sslovo + znak; inc(i); znak:= riadok[i]; end; ppovod:= true; sslovo:= sslovo + znak; inc(i); znak:= riadok[i]; end end;
Opozitum @acidóza@ -y ž. /lat. + gréc./ lek. nadbytočný obsah kyslých látok v tkanive organizmu alebo v krvi (op. alkalóza) if (znak = '(') and (riadok[i+1] = 'o') and (riadok[i+2] = 'p') and (riadok[i+3] = '.') then begin sslovo:= '(op. '; i:= i + 4; while riadok = ' ' do inc(i); znak:= riadok[i]; while znak <> ')' do begin sslovo:= sslovo + znak; inc(i); znak:= riadok[i]; end; inc(i); znak:= riadok[i]; aantonymum:= true; end;
Analýza • funkcia Heslova_jednotka.ANALYZUJ(slovo) posiela reťazec slovo na analýzu svojim • podtriedam • sama najprv čiastočne zanalyzuje, či slovo môže poslať ďalej • Analýza Čísla • @akantocefaly@ -ov m. mn. č. /gréc./ vet. trieda parazitických červov z podkmeňa hlistovcov majúcich na hlavovom konci výbežok s prichytávacími háčikmi • zistí sa, že načítané slovo je „jedn.“ alebo „mn.“ • zapamätá si to a Gramatickej_charakteristike zatiaľ neposiela nič if (s[1]='j') and (s[2]='e') and (s[3]='d') and (s[4]='n') and (s[5]='.') then begin jednotne_cislo1:= true; rozanalyzovane:= true; end; if (s[1]='m') and (s[2]='n') and (s[3]='.') then begin mnozne_cislo1:= true; rozanalyzovane:= true; end;
Analýza - Číslo • @akantocefaly@ -ov m. mn. č. /gréc./ vet. trieda parazitických červov z podkmeňa hlistovcov majúcich na hlavovom konci výbežok s prichytávacími háčikmi • až po načítaní slova „č.“ pošle ďalej informáciu o čísle if (s[1]='č') and (s[2]='.') then begin if jednotne_cislo1 then jednotne_cislo2:= true; if mnozne_cislo1 then mnozne_cislo2:= true; jednotne_cislo1:= false; mnozne_cislo1:= false; rozanalyzovane:= true; end;
Analýza - Číslo @akantocefaly@ -ov m. mn. č. /gréc./ vet. trieda parazitických červov z podkmeňa hlistovcov majúcich na hlavovom konci výbežok s prichytávacími háčikmi function TGramaticka_charakteristika.ANALYZUJ(s:string):boolean; begin if Koncovky_genitivu.ANALYZUJ(s) = true then begin nastavene:= true; result:= true; ... exit; end; if Cislo.ANALYZUJ(s) = true then begin nastavene:= true; result:= true; end else result:= false; ... end;
Analýza - Číslo @akantocefaly@ -ov m. mn. č. /gréc./ vet. trieda parazitických červov z podkmeňa hlistovcov majúcich na hlavovom konci výbežok s prichytávacími háčikmi function TCislo.ANALYZUJ(s:string):boolean; begin if jednotne_cislo2 then begin cis:= 'jednotné číslo'; result:= true; nastavene:= true; jednotne_cislo1:= false; jednotne_cislo2:= false; end; if mnozne_cislo2 then begin cis:= 'množné èíslo'; result:= true; nastavene:= true; mnozne_cislo1:= false; mnozne_cislo2:= false; end; if (not jednotne_cislo2) and (not mnozne_cislo2) then result:=false; end;
Analýza - Pôvod 1. /lat. -> franc. -> nem./ 2. /lat. + franc./ 3. /lat. -> franc. + nem./ <Pôvody> <Pôvod cislo_pov=1> <Jazyk>latinčina</Jazyk> </Pôvod> <Pôvod cislo_pov=2> <Jazyk>francúzština</Jazyk> </Pôvod> <Pôvod cislo_pov=3> <Jazyk>nemčina</Jazyk> </Pôvod> </Pôvody> _____________________________________ <Pôvody> <Pôvod> <Jazyk>latinčina</Jazyk> </Pôvod> <Pôvod> <Jazyk>francúzština</Jazyk> </Pôvod> </Pôvody> _____________________________________ <Pôvody> <Pôvod cislo_pov=1> <Jazyk>latinčina</Jazyk> </Pôvod> <Pôvod cislo_pov=2> <Jazyk>francúzština</Jazyk> </Pôvod> <Pôvod> <Jazyk>nemčina</Jazyk> </Pôvod> </Pôvody>
Analýza - Pôvod 4. /skratka pre lat. acutus/ <Pôvody> <Pôvod> <Jazyk>latinčina</Jazyk> <Popis_pôvodu> skratka pre výraz "acutus" </Popis_pôvodu> </Pôvod> </Pôvody> TPovody.ANALYZUJ(s) • Heslova_jednotka pošle triede TPovody na analýzu slovné spojenie • Tpovody.ANALYZUJ(s) zistí, či sa vyskytuje plus „+“ alebo šípka „->“ • ak tam nie je + alebo ->, • - vytvorí objekt • inc(number); • Povod[number]:= TPovod.CREATE; • - zavolá Povod[number].ANALYZUJ(s) • ak tam je + alebo ->, • - číta celý reťazec • - ak príde šípka, pôvod bude očíslovaný a zvýši číslo pôvodu • - ak príde plus • - ak naposledy nebola šípka, pôvod nebude očíslovaný • - ak naposledy bola šípka, pôvod bude číslovaný a zvýši číslo pôvodu • - ak je koniec reťazca • - podľa predchádzajúcej spojky rozhodne o číslovaní pôvodu
Analýza - Pôvod • TPovod.ANALYZUJ(s) • /podľa franc. fyzika Ampéra/ • /z lat. anno ante Christum (natum)/ • /skratka pre lat. acutus/, /skratka z angl. animal protein factor/ • /lat./ • - ak je pôvod číslovaný, zaznamená si číslo • - zistí, či má reťazec viac slov • - ak má iba 1 slovo, pošle ho na analýzu triede Jazyk a Popis_povodu • - ak má viac slov, zistí 1. slovo (podľa, z, skratka) • - podľa –> Popis_povodu.ANALYZUJ(s) • - z, skratka –> zo stringu získa informáciu o jazyku • –> Jazyk.ANALYZUJ(string_jazyk) • –> všetko ostatné • –> Popis_povodu.ANALYZUJ(string_popis)
Analýza - Pôvod TPopis_povodu.ANALYZUJ(s) function TPopis_Povodu.ANALYZUJ(...); begin if s <> '' then begin if (s = '?') or (s = 'um.') or (s = 'podľa vlast. m.') then begin if s = '?' then pop:= 'neznámy pôvod'; if s = 'um.' then pop:= 'umelé slovo'; if s = 'podľa vlast. m.' then pop:= 'podľa vlastného mena'; end else pop:= s; nastavene:= true; result:= true; exit; end else begin nastavene:= false; result:= false; exit; end; end; TJazyk.ANALYZUJ(s) function TJazyk.ANALYZUJ(...); begin if s <> '' then begin if (s[length(s)] = '?') then begin s:= copy(s,1,length(s)-1); jaz:= Form1.SKRATKA(s); jaz:= jaz + '?'; end else jaz:= Form1.SKRATKA(s); nastavene:= true; result:= true; exit; end else begin nastavene:= false; result:= false; exit; end; end;
Analýza – Výklady významu @akútny@ /lat./ 1. lek. prudko prebiehajúci, náhly; prudký (op. chronický) 2. naliehavý, pálčivý súrny Vyklady_vyznamu.ANALYZUJ(s) - prechádza string až do konca - ak je na začiatku "1.", Vyznamybudú číslované (=> aspoň 2 významy) - kým sa nedostane k ďalšiemu číslu a nie je koniec riadku, - do stringu ss načítava znaky - vytvorí inštanciu podtriedy TVyznam -> Tvyznam.ANALYZUJ(ss) 1. lek. prudko prebiehajúci, náhly; prudký (op. chronický) 2. naliehavý, pálčivý súrny Vyznam.ANALYZUJ(s) - ak sú významy číslované, zapamätá si číslo - kým nepríde bodkočiarka, alebo nie je koniec reťazca - do stringu ss načítava znaky - vytvorí inštanciu podtriedy TPodvyznam -> TPodvyznam.ANALYZUJ(ss) lek. prudko prebiehajúci, náhly prudký (op. chronický) naliehavý, pálčivý súrny Významy
Analýza – Výklady významu @akútny@ /lat./ 1. lek. prudko prebiehajúci, náhly; prudký (op. chronický) 2. naliehavý, pálčivý súrny Podvyznam.ANALYZUJ(s) - Podvýznam: informácia o štýle, odkaz, pôvod, antonymum - kým nie je koniec reťazca - nájde podreťazce štýl -> TStyly.ANALYZUJ(string_styl) odkaz -> TOdkaz.ANALYZUJ(string_styl) pôvod -> TPovody.ANALYZUJ(string_styl) antonymum -> TAntonymum.ANALYZUJ(string_styl) - ostatné znaky -> TText_vyznamu.ANALYZUJ(string_styl)
Funkcia SKRATKA admin.#+v administratíve# afgan.#afgánčina# afr.#africké jazyky# • Pôvod – lat., nem., franc., ... • Štýl – lek., kniž., pren., zried., ... function TForm1.SKRATKA(s: string): string; var ss, rr: string; zz: char; begin result:= ‚?????'; AssignFile(f3,'skratky.txt'); Reset(f3); ss:= ''; rr:= ''; while not eof(f3) do begin read(f3,zz); while zz <> '#' do begin ss:= ss + zz; read(f3,zz); end; if ss = s then begin read(f3,zz); while zz <> '#' do begin rr:= rr + zz; read(f3,zz); end; result:= rr; exit; end else begin ss:= ''; rr:= ''; readln(f3); end; end; CloseFile(f3); end;
Zhrnutie Problém - chyby vo vstupných súboroch - môže sa vyskytnúť - @ab equis ad asinos - lat./, [ábécé, … - varianty, ženské prechýlené podoby bez @ - rozdielne typy pomlčiek - namiesto -> sa vyskytuje -- >, --- > Riešenie - oprava ručne - programy na opravu niektorých chýb