[ Skip to the content ]

Institute of Formal and Applied Linguistics Wiki


[ Back to the navigation ]

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
user:zeman:morpho-challenge-2008 [2008/07/31 13:32]
zeman Výsledky.
user:zeman:morpho-challenge-2008 [2008/08/01 22:35]
zeman Abrupt, abruptly, abruptness vysvětleno, byť uspokojivě nevyřešeno.
Line 47: Line 47:
 vzorfiltr.pl -okm en.kmeny.txt -okonc en.koncovky.txt < en.nefiltr > en.vzor</code> vzorfiltr.pl -okm en.kmeny.txt -okonc en.koncovky.txt < en.nefiltr > en.vzor</code>
 Skript ''vzorfiltr.pl'' jako vedlejší účinek vedle standardního výstupu tiše vyrobí soubory ''kmeny.txt'' a ''koncovky.txt''. Skript ''vzorfiltr.pl'' jako vedlejší účinek vedle standardního výstupu tiše vyrobí soubory ''kmeny.txt'' a ''koncovky.txt''.
 +
 +
 +
  
 ===== Morfematická segmentace ===== ===== Morfematická segmentace =====
Line 61: Line 64:
   $MC/mchallenge.pl $l.kmeny.txt $l.koncovky.txt < wordlist.$l.txt > $l.dz.txt   $MC/mchallenge.pl $l.kmeny.txt $l.koncovky.txt < wordlist.$l.txt > $l.dz.txt
 end</code> end</code>
 +
 +V úvahu přichází několik stupňů přísnosti při aplikaci vzorů na morfematickou segmentaci:
 +  - Slovo rozdělit pouze v případě, že toto dělení bylo viděno v trénovacích datech a proniklo filtrem mezi výsledné vzory. Jinými slovy, kmen i koncovka musí být známé a navíc musely být viděny spolu.
 +    - Kmen a koncovka nemusely být viděny přímo spolu. Stačí, když byl kmen viděn s N jinými koncovkami, které se s hledanou koncovkou společně vyskytují alespoň v jednom vzoru.
 +    - Další možnost by byla snažit se zjistit, zda slovo může náležet ke vzoru, který připouští danou koncovku. I když náš systém toto slovo zařadil k jinému slovu. Např. nejpřísnější metoda nerozdělila "a-com's" na "a-com" a "'s", přestože samostatné slovo "a-com" v datech bylo a koncovka "'s" je součástí mnoha vzorů. Dotyčná kombinace kmene a koncovky byla zřejmě nějak odfiltrována. Chtělo by to nějaký ladící režim.
 +  - Kmen i koncovka musí být známé, ale nemusely být viděny spolu.
 +  - Známá je koncovka, kmen známý být nemusí.
 +  - Známý je kmen, koncovka známá být nemusí.
 +  - Známý je kmen nebo koncovka, ale ne nutně obojí.
 +Poslední tři body neumím uspořádat podle přísnosti, ale všechny tři jsou méně přísné než první dva body. Můj přístup z roku 2007 a oficiálně vyhodnocená metoda 1 z roku 2008 zkouší nejdřív bod 2, a pokud selže, tak bod 5. I když by popis na začátku této kapitoly mohl napovídat, že začínám podle bodu 1, není tomu tak.
  
 ===== Úprava výstupu před odesláním ===== ===== Úprava výstupu před odesláním =====
Line 77: Line 90:
 $MC/mc_convert.pl -t fi < fi.dz3.txt | gzip -c > wordlist.fin.dz3.gz $MC/mc_convert.pl -t fi < fi.dz3.txt | gzip -c > wordlist.fin.dz3.gz
 $MC/mc_convert.pl -t tr < tr.dz3.txt | gzip -c > wordlist.tur.dz3.gz</code> $MC/mc_convert.pl -t tr < tr.dz3.txt | gzip -c > wordlist.tur.dz3.gz</code>
 +
 +===== Skórování =====
 +
 +Organizátoři poskytli program ''eval_morphemes.pl''. Pokyny pro správné vyhodnocování sepsali na stránce [[http://www.cis.hut.fi/morphochallenge2008/evaluation.shtml]]. Napsal jsem si kvůli tomu ''Makefile'', který je ve složce s daty a níže popsaný postup se z něj dá vyčíst.
 +
 +Co ještě potřebujeme:
 +
 +  * ''wordpairs_goldstd'' ... vzorek dvojic slov ze zlatého standardu. Získá se programem ''sample_word_pairs.pl''.
 +  * ''wordpairs_proposed'' ... vzorek dvojic slov z výstupu analyzátoru. Získá se programem ''sample_word_pairs.pl''.
 +  * ''morphemeanalyses_goldstd'' ... vzorové analýzy slov (zlatý standard)
 +  * ''morphemeanalyses_proposed'' ... výstup analyzátoru
 +
 +Jaký je tedy úplný postup při vyhodnocování?
 +
 +  - Stáhnout program ''eval_morphemes.pl'' z webu [[http://www.cis.hut.fi/morphochallenge2008/evaluation.shtml]].
 +  - Stáhnout program ''sample_word_pairs.pl'' z téhož webu.
 +  - Pro jazyk, který chceme vyhodnocovat, stáhnout vzorovou analýzu. Organizátoři poskytují pro každý jazyk [[http://www.cis.hut.fi/morphochallenge2008/datasets.shtml#goldstdfiles|vzorové analýzy]] pro podmnožinu 500 slov (pravděpodobně prostě proto, že větší část vzorových analýz chtějí udržet v tajnosti, aby soutěž byla regulérní). Jmenuje se např. ''goldstdsample.ara'' (pro arabštinu) a je k dispozici na adrese [[http://www.cis.hut.fi/morphochallenge2008/datasets.shtml#download]].
 +  - Pro jazyk, který chceme vyhodnocovat, stáhnout soubor náhodných dvojic slov ("random word pairs file"). Tento soubor obsahuje na každém řádku slovo (např. "abacus'", za tabulátorem pak jednu nebo více dvojic slovo2 [morfém], kde slovo2 je slovo, se kterým první slovo sdílí stejně pojmenovaný morfém, a [morfém] (uveden v hranatých závorkách) je označení tohoto sdíleného morfému. Např. pro "abacus'" jsou to dvojice "abacuses [abacus_N]" a "presbytery's [+GEN]".
 +  - Z výstupu analyzátoru, který chceme vyhodnotit, navzorkovat dvojice slov podobné těm, které jsme si stáhli pro gold standard. Zatímco ty stažené se použijí pro výpočet úplnosti, ty naše budou potřeba pro výpočet přesnosti. Námi zjištěná přesnost bude ve skutečnosti velmi hrubý odhad přesnosti, protože nemáme k dispozici celý gold standard.
 +    - Nejdříve vytvoříme seznam relevantních slov, tedy takových, která se vyskytují ve vzorových analýzách, které jsme dostali k dispozici. <code>cut -f1 goldstdfile > relevantwordsfile</code>
 +    - Potom náhodně vybereme 100 relevantních slov z výstupu našeho analyzátoru. <code>sample_word_pairs.pl -refwords relevantwordsfile < resultfile > wordpairsfile_result</code>
 +  - Nyní již máme pohromadě všechny soubory potřebné jako vstupy pro vyhodnocovací program a můžeme spustit vyhodnocování:
 +<code>eval_morphemes.pl -trace wordpairsfile_goldstd wordpairsfile_result goldstdfile resultfile</code>
 +
 +<code>cut -f1 $MC/data/2008/goldstdsample.eng > $MC/data/2008/relevantwords.eng
 +$MC/sample_word_pairs.pl -refwords $MC/data/2008/relevantwords.eng < $MC/data/2008/en.dz.txt > $MC/data/2008/wordpairs_result.eng
 +$MC/eval_morphemes.pl -trace $MC/data/2008/samplepairs.goldstd.eng $MC/data/2008/wordpairs_result.eng $MC/data/2008/goldstdsample.eng $MC/data/2008/en.dz.txt</code>
  
 ===== Vyhodnocení ===== ===== Vyhodnocení =====
Line 104: Line 144:
 end</code> end</code>
  
-===== Zbývá udělat =====+===== Záznamy pokusů =====
  
-  * Vyzkoušet skórování. +==== Převrácená slova a předpony ====
-  * Pustit celý algoritmus na převrácená slova a získat předpony+
-  * Zkusit rozpoznat složená slova, resp. složené kmeny. Pouze jednoduchý přístup, snažit se najít uvnitř kmenu jiný existující kmen tak, aby to, co zbyde, byl také existující kmen nebo složenina. +
-  * Vymyslet způsob, jak využít četnosti slovních tvarů, které jsme dostali s&nbsp;trénovacími daty. +
-  * Odeslat výsledky Mikkovi.+
  
-===== Skórování =====+První pokus se ještě dostal do oficiálního vyhodnocení, ale bylo to zklamání. Od té doby jsem se na to nedíval.
  
-Organizátoři poskytli program ''eval_morphemes.pl''. Pokyny pro správné vyhodnocování sepsali na stránce [[http://www.cis.hut.fi/morphochallenge2008/evaluation.shtml]].+==== Pomlčka odděluje morfémy ====
  
-Co ještě potřebujeme:+Při segmentaci prostě v každém rozkladu navíc nahradím pomlčky mezerami, čímž se slovo může rozpadnout na větší počet morfémů (pokud pomlčka nebyla na začátku). V angličtině to zvedlo F o 2 body.
  
-  * ''wordpairs_goldstd'' ... vzorek dvojic slov ze zlatého standardu. Získá se programem ''sample_word_pairs.pl''. 
-  * ''wordpairs_proposed'' ... vzorek dvojic slov z výstupu analyzátoru. Získá se programem ''sample_word_pairs.pl''. 
-  * ''morphemeanalyses_goldstd'' ... vzorové analýzy slov (zlatý standard) 
-  * ''morphemeanalyses_proposed'' ... výstup analyzátoru 
  
-Jaký je tedy úplný postup při vyhodnocování?+==== Nejpřísnější segmentace ====
  
-  - Stáhnout program ''eval_morphemes.pl'' z webu [[http://www.cis.hut.fi/morphochallenge2008/evaluation.shtml]]+Museli jsme vidět kmen i koncovku ve stejném vzoru (tedy buď přímo v trénovacích datech, nebo se koncovka ke kmeni dostala slučováním podmnožin s nadmnožinami)
-  - Stáhnout program ''sample_word_pairs.pl'' z téhož webu+ 
-  - Pro jazykkterý chceme vyhodnocovatstáhnout vzorovou analýzu. Organizátoři poskytují pro každý jazyk [[http://www.cis.hut.fi/morphochallenge2008/datasets.shtml#goldstdfiles|vzorové analýzy]] pro podmnožinu 500 slov (pravděpodobně prostě proto, že větší část vzorových analýz chtějí udržet tajnostiaby soutěž byla regulérní)Jmenuje se např. ''goldstdsample.ara'' (pro arabštinuje k dispozici na adrese [[http://www.cis.hut.fi/morphochallenge2008/datasets.shtml#download]]+Dvě třetiny vzorů nepřežijí filtrování, takže spoustě slov nezbyde žádný vzor a tato slova se stanou nerozložitelnýmiDrasticky klesla úplnost, takže tohle je asi spíš slepá ulička
-  Pro jazykkterý chceme vyhodnocovat, stáhnout soubor náhodných dvojic slov ("random word pairs file"). Tento soubor obsahuje na každém řádku slovo (např. "abacus'"za tabulátorem pak jednu nebo více dvojic slovo2 [morfém]kde slovo2 je slovo, se kterým první slovo sdílí stejně pojmenovaný morféma [morfém] (uveden v hranatých závorkáchje označení tohoto sdíleného morfémuNapř. pro "abacus'" jsou to dvojice "abacuses [abacus_N]" a "presbytery's [+GEN]". + 
-  - Z výstupu analyzátorukterý chceme vyhodnotit, navzorkovat dvojice slov podobné těm, které jsme si stáhli pro gold standardZatímco ty stažené se použijí pro výpočet úplnostity našbudou potřeba pro výpočet esnostiNámi zjištěná esnost bude ve skutečnosti velmi hrubý odhad přesnosti, protože nemáme k dispozici celý gold standard. +==== Mazání vzorůkteré mají více koncovek než kmenůa přepracovaný algoritmus slévání podmnožin ==== 
-    - Nejdříve vytvoříme seznam relevantních slovtedy takovýchkterá se vyskytují ve vzorových analýzáchkteré jsme dostali dispozici<code>cut -f1 goldstdfile > relevantwordsfile</code> + 
-    - Potom náhodně vybereme 100 relevantních slov z výstupu našeho analyzátoru<code>sample_word_pairs.pl -refwords relevantwordsfile < resultfile > wordpairsfile_result</code> +Vzor pro slova abrupt, abruptly, abruptness nepřežil, protože se do slovníku kvůli překlepu připletlo i slovo abruptyTakový vzor měl jen dva kmeny (druhý byl explicit), neslil se s hlavním vzorem bez překlepu a zahynul, protože měl víc koncovek než kmenůZkusil jsem kvůli tomu dovolit, aby vzor měl až 5krát více koncovek než kmenů, protože toto pravidlo bylo stejně zavedeno kvůli mamutím vzorům, kde byl jeden kmen (první písmeno) a několik tisíc koncovekZměna mě donutila kompletně přepracovat (zefektivnit) algoritmus slévání podmnožin, ale ovoce v podobě úspěšnosti nepřinesla: F kleslo. 
-  - Nyní již máme pohromadě všechny soubory potřebné jako vstupy pro vyhodnocovací program žeme spustit vyhodnocování: + 
-<code>eval_morphemes.pl -trace wordpairsfile_goldstd wordpairsfile_result goldstdfile resultfile</code>+=== Nový algoritmus pro prořezávání podmnožin === 
 + 
 +Starý: 
 +1. Množiny procházet od největších po nejmenší (využíváme tím toho, že během procházení se nalezené podmnožiny mažoutakže se zmenšuje prostor, který procházíme). 
 +2. Pro každou množinu procházet nadmnožiny. V nejhorším případě všechny, ale pokud najdeme alespoň jednu nadmnožinu velikosti n, hledáme už jen další nadmnožiny stejné velikosti a neprocházíme větší množiny. 
 +3. Zjištění, zda je množina A nadmnožinou množiny B, znamená projít všechny prvky množiny B a zeptat sejestli jsou v hashi reprezentujícím množinu A. 
 + 
 +Složitost algoritmu je v nejhorším případě O((n**2)*k), kde n je počet množin a je maximální velikost množiny. Pro 69877 anglických vzorů o průměrné velikosti dejme tomu 4 by vycházelo 20 miliard dotazů na hashPro 248077 německých vzorů by při stejné průměrné velikosti vycházelo 246 miliard dotazů. 
 + 
 +Nový dynamický: 
 +1Projít všechny množiny
 +2. Pro každou zkoumat podmnožinykteré jsou menší o 1 (pokud v trénovacích datech nebyly, vytvoříme si je jen jako pomocný uzel). Těch má každá množina tolik, kolik má prvků (protože odebráním prvku vznikne podmnožina). Z podmnožiny si vytvořit zpětný odkaz na nadmnožinuPokud jsme podmnožinu vytvořili jako pomocný uzelkterý doteď neexistoval ani jako pomocný (důležité!)rovnou rekurzivně najdeme i jeho podmnožiny. 
 +3. Projít množiny podruhéteď už od největších po nejmenší. Pro každou množinu procházíme do šířky strom jejích nadmnožin (máme na ně odkazy). U nadmnožin se díváme, zda o nich máme jen pomocný záznam, nebo zda jsme něco takového skutečně viděli v datechZa "nalezenoupovažujeme nadmnožinu, která byla v datechPokud nalezneme alespoň jednu nadmnožinu velikosti nhledáme už jen další nadmnožiny stejné velikosti a neprocházíme větší množiny. Místo mazání množiny pouze měníme skutečný záznam na pomocný. 
 + 
 +Složitost algoritmu: Vybudování grafu nadmnožin stojí O(n*k) kroků. Složitost procházení stromu je těžké odhadnoutprotožnevíme, kolika způsoby půjde rozšířit každou množinu a v kolikátém patře se hledání zastavíV nejhorším ípadě by to mohlo být ještě horší než n na druhou (protože jsme přidali pomocné záznamy pro množinykteré v datech nebyly)spíš si ale myslímže typicky budeme procházet jen O(k) množin v nejbližším 1 až 2 patrechPřípadně bychom mohli zkusit prostě hledání na několik nejbližších pater omezit. 
 + 
 +Počítadlo zjistilo, že pro 69877 anglických vzorů graf množin obsahoval 455633 množin
 +Pozor, při procházení zdola nahoru zřejmě také mnohokrát procházím tímtéž místem! 
 +Po zabránění tomuto opakování mi počítadlo zjistilo, že pro 69877 anglických vzorů jsem celkem zkoušel 202302 nadmnožin. 
 + 
 +===== Zbývá udělat ===== 
 + 
 +  * Pustit celý algoritmus na převrácená slova získat předpony. 
 +  * Zkusit rozpoznat složená slova, resp. složené kmeny. Pouze jednoduchý přístup, snažit se najít uvnitř kmenu jiný existující kmen tak, aby to, co zbyde, byl také existující kmen nebo složenina. 
 +  * Vymyslet způsob, jak využít četnosti slovních tvarů, které jsme dostali s&nbsp;trénovacími daty.
  
-<code>cut -f1 $MC/data/2008/goldstdsample.eng > $MC/data/2008/relevantwords.eng 
-$MC/sample_word_pairs.pl -refwords $MC/data/2008/relevantwords.eng < $MC/data/2008/en.dz.txt > $MC/data/2008/wordpairs_result.eng 
-$MC/eval_morphemes.pl -trace $MC/data/2008/samplepairs.goldstd.eng $MC/data/2008/wordpairs_result.eng $MC/data/2008/goldstdsample.eng $MC/data/2008/en.dz.txt</code> 
  
 ===== Postřehy ===== ===== Postřehy =====
Line 147: Line 200:
 Segmentaci dělám hladově, i když by to chtělo chart parser. Problém: máme 2 seznamy kmenů (jeden zbytky po předponách, druhý po příponách). Který seznam použít? Segmentaci dělám hladově, i když by to chtělo chart parser. Problém: máme 2 seznamy kmenů (jeden zbytky po předponách, druhý po příponách). Který seznam použít?
  
-Algoritmus 3 (předpony + kmeny + přípony) nedělá to, co máJaktože nepoznal vzor //abrupt - abruptly - abruptness//když všechna tato slova jsou v&nbsp;datech a //-ly// i //-ness// jsou běžné koncovky?+Četnost koncovek: u kolika slov (typů i výskytů) jsme viděli danou koncovku? Méně časté koncovky by měly mít ztížené uplatnění i segmentaci. Zatím ale nevím, jak jim ho ztížit jinak, než je úplně zakázat. 
 + 
 +Vzhledem ke způsobu vyhodnocení, který používá Morpho Challenge, by to chtělo sjednotit označení koncovek. Např. když téměř stejnou sadu koncovek uvidíme jednou jako "a, y, e, u, o, ou" a jindy jako "na, ny, ně, nu, no, nou". Nevím ale, jak to udělat. 
 + 
 +Jak mám poznat podmnožinukdyž se kvůli chybějícímu výskytu v trénovacích datech neposunulo písmeno? Například mám v němčině největší vzor "0,m,n,r,re,rem,ren,rer,res,s"Všechny kmeny končí na "e". Jak poznám, že kdybych toto "e" zahrnul do koncovek ("e,em,en,er,ere,erem,eren,erer,eres,es"), mohl bych do vzoru přilít jiný vzor, který je téměř jeho podmnožinou, akorát má navíc koncovku "0" (tedy bez toho "e")? Další c: jak poznám složené koncovky? Tady by zrovna správná segmentace byla "aggressiv+er+e". Musel bych hledat podmnožinu množiny koncovek, která je v množině koncovek obsažena dvakrát, jednou s prefixem a podruhé bez. Hledání by muselo být fuzzy. 
 + 
 +Třetina slov v angličtině neprojde filtrováním vzorů. Na vstupu mám 385 tisíc slov, na výstupu 122 tisíc segmentací. (Ve skutečnosti jsem jich asi odfiltroval víc, protože na výstupu navíc mohou být i taková slova, která jsem vůbec neviděl. Můžou se tam dostat při slučování vzorů s nadmnožinami.) Otázka je, jak přesně k tomu došlo. Kdybych věděl, kde se slova ztrácejí, možná by mě napadlo, jak je neztratit úplně. To bych ale musel rozvinout ladění, abych dokázal stopovat slovo během celého procesu filtrování.

[ Back to the navigation ] [ Back to the content ]