====== csts.pm, csts1.pm ====== Dosavadní modul csts.pm nebyl knihovnou pro vstup a výstup ve formátu CSTS. Používal se pouze při vstupu, kromě vlastní analýzy vstupu obsahoval i operace, které už lze spíše označit za předzpracování pro parser, a i vlastní čtení bylo někdy až příliš cílené na užití s parserem. Přestože se tento modul postupem času využíval i s mnoha jinými programy. V roce 2006 paralelně vznikl modul csts1.pm, který definuje své čtení (i zápis) CSTS formátu. Není poplatný parseru (ostatně vznikl kvůli jinému nástroji), je navržen trochu robustněji, protože využívá knihovnu pro rozbor HTML, ale zatím toho umí méně než původní csts.pm. Cílem je oba moduly sjednotit a udělat z nich skutečně kvalitní knihovnu pro čtení a zápis CSTS. K tomu je ovšem potřeba odstěhovat funkce, které jsou šité na míru parseru, do jiných modulů a vše velmi pečlivě otestovat, aby se nezměnila funkčnost parseru. ===== Je potřeba udělat ===== * Můžeme definovat morfologický shluk informací. Bude obsahovat úplný popis jednoho čtení slova. Vždy bude obsahovat jedno lemma a jednu značku. Může navíc obsahovat i různě upravené verze lemmatu i značky. Různé zdroje pak mohou nabízet jeden či více takových shluků. Budeme vždy předpokládat, že jich nabízejí více. Pokud nabízejí jen jeden, budeme pracovat s jednoprvkovým polem. Obdobně syntaktický shluk bude obsahovat číselný odkaz na rodiče a syntaktickou značku pro druh závislosti. Název zdroje, který nezačíná MM ani MD, znamená ruční anotaci (, , , ). Slovní tvar a ord nemají různé zdroje a vyskytují se pouze ve vrchním hashi. $slovo->{m}{mda}[0]{lemma} $slovo->{m}{mda}[0]{tag} $slovo->{m}{mmab}[3]{lemma} $slovo->{s}{mddz}[0]{pord} # parent ord $slovo->{s}{mddz}[0]{stag} # afun Přímé odkazy na jiné uzly ({parent} a {children}) by se neudržovaly mezi alternativami, ale pouze pro anotaci, která byla vytažena nahoru jako hlavní. Usnadní se tím údržba odkazů a jejich rozpojování při destrukci slova. Protože hodnoty základních atributů (lemma, tag, pord a stag) jsou skaláry, vybrané a nahoru vytažené hodnoty nejsou odkazy, ale kopie. Případné změny hodnot se tedy neprojeví v originále mezi zdroji a alternativami! To je v některých případech i dobře. Např. DZ Parser si dělá různé úpravy (převádí slovo na malá písmena, v koncové interpunkci k němu připojuje "K", upravuje morfologické značky), které by měl provádět na svých kopiích příslušných atributů, žel hrabe se přímo v originále. Vedlejším účinkem nové architektury tedy bude, že se nám původní lemmata a značky uchovají a budeme je moci vypsat na výstup. Bohužel to neplatí o slovním tvaru (form), protože ten žádné zdroje a alternativy nemá. Ten budeme muset chránit zvlášť. Pozor na cyklické odkazy při destrukci anotací o slově! Na konci zpracování věty bychom měli ji měli povinně projít a všechny pomocné odkazy zrušit! ----- Jak vyresit, ze nektere alternativy mohou mit vahy? Kam je ulozit, abychom jeste nezeslozitili pristup k hodnotam atributu? Pripravenost na prvky, ktere vubec nejsou v DTD CSTS. Kdyz se objevi yyy $slovo->{extra}[0]{elem} = "x"; # [0] je index takoveho extrata v ramci slova $slovo->{extra}[0]{attr}{atr1} = "A"; $slovo->{extra}[0]{attr}{atr2} = "B"; $slovo->{extra}[0]{text} = "yyy"; Takove prvky nesmeji byt strukturovane, tj. jejich {text} nesmi obsahovat dalsi prvky. Nebo muzu od parseru HTML dostat zadarmo celou hierarchii neceho takoveho? Nejspis ne. Budeme nekde uchovavat poradi, ve kterem se prvky objevily ve vstupnim CSTS? Budeme nekde uchovavat atributy prvku, ktere v DTD CSTS jsou, ale tyto jejich atributy tam nejsou? Budeme uchovavat atributy, ktere v DTD jsou, ale normalne nas nezajimaly (napr. nektere atributy prvku )? Ruzne upravene znacky apod. muzeme chapat jako znacku z dalsiho zdroje. Napr. $slovo->{0}{tag}{upr_mc_style} = "N4"; Problem je, ze se ztraci korespondence s puvodni neupravenou znackou. I kdyz by samozrejme klic mohl znit treba "upr_mc_style_zdroj_mdt_a". Ale takto zakodovana korespondence neni podchytitelna strojove.