[ 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
user:zeman:morpho-challenge-2008 [2008/07/31 16:12]
zeman Brát v úvahu pomlčku.
user:zeman:morpho-challenge-2008 [2008/08/04 13:07] (current)
zeman Daür, zürst.
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''.
 +
 +
  
  
Line 65: Line 67:
 V úvahu přichází několik stupňů přísnosti při aplikaci vzorů na morfematickou segmentaci: 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.   - 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.   - 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 koncovka, kmen známý být nemusí.
Line 139: Line 143:
   $MC/mchallenge3.pl $l.predpony.txt $l.kmeny1.txt $l.kmeny.txt $l.koncovky.txt < wordlist.$l.txt > $l.dz3.txt   $MC/mchallenge3.pl $l.predpony.txt $l.kmeny1.txt $l.kmeny.txt $l.koncovky.txt < wordlist.$l.txt > $l.dz3.txt
 end</code> end</code>
 +
 +===== Záznamy pokusů =====
 +
 +==== Převrácená slova a předpony ====
 +
 +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.
 +
 +==== Pomlčka odděluje morfémy ====
 +
 +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.
 +
 +
 +==== Nejpřísnější segmentace ====
 +
 +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).
 +
 +Dvě třetiny vzorů nepřežijí filtrování, takže spoustě slov nezbyde žádný vzor a tato slova se stanou nerozložitelnými. Drasticky klesla úplnost, takže tohle je asi spíš slepá ulička.
 +
 +==== Mazání vzorů, které mají více koncovek než kmenů, a přepracovaný algoritmus slévání podmnožin ====
 +
 +Vzor pro slova abrupt, abruptly, abruptness nepřežil, protože se do slovníku kvůli překlepu připletlo i slovo abrupty. Takový 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 koncovek. Změna mě donutila kompletně přepracovat (zefektivnit) algoritmus slévání podmnožin, ale ovoce v podobě úspěšnosti nepřinesla: F kleslo.
 +
 +=== 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žou, takž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 se, jestli 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 k 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 hash. Pro 248077 německých vzorů by při stejné průměrné velikosti vycházelo 246 miliard dotazů.
 +
 +Nový dynamický:
 +1. Projít všechny množiny.
 +2. Pro každou zkoumat podmnožiny, které 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žinu. Pokud jsme podmnožinu vytvořili jako pomocný uzel, který 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 datech. Za "nalezenou" považujeme nadmnožinu, která byla v datech. Pokud nalezneme alespoň jednu nadmnožinu velikosti n, hledá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é odhadnout, protože 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 případě by to mohlo být ještě horší než n na druhou (protože jsme přidali pomocné záznamy pro množiny, které v datech nebyly), spíš si ale myslím, že typicky budeme procházet jen O(k) množin v nejbližším 1 až 2 patrech. Pří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 ===== ===== Zbývá udělat =====
  
-  * Vyzkoušet skórování. 
   * Pustit celý algoritmus na převrácená slova a získat 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.   * 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.   * Vymyslet způsob, jak využít četnosti slovních tvarů, které jsme dostali s&nbsp;trénovacími daty.
-  * Odeslat výsledky Mikkovi. 
- 
- 
  
  
Line 154: Line 195:
 ===== Postřehy ===== ===== Postřehy =====
  
-Zkusit nejpřísnější segmentaci. Slovo se rozdělí pouze v případě, že kmen koncovka byly viděny //spolu.// +Pravidlová metoda pro předpony funguje mnohem lépe než ta reverzní. Obě metody se ale také podstatně liší způsobem použití naučených předpon při segmentaci. Chtělo by to oba způsoby prohodit ověřitzda rozdíl v úspěšnosti netkví ve skutečnosti zde. Kromě toho upravit reverzní metodu tak, aby společné písmeno neputovalo ke kmeni, ale k předponě.
- +
-Předponyzdá se, fungují, ale na rozdíl od přípon by to tu nechtělo dávat společná písmena ke kmeni, nýbrž k&nbsp;předponě.+
  
 Jednopísmenné předpony jsou problém. Nemůžu je úplně zakázat (české //o-, u-//), ale ve výstupu se mi nezdravě množí. Jednopísmenné předpony jsou problém. Nemůžu je úplně zakázat (české //o-, u-//), ale ve výstupu se mi nezdravě množí.
  
 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í při segmentaci. Zatím ale nevím, jak jim ho ztížit jinak, než je úplně zakázat. Č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í při segmentaci. Zatím ale nevím, jak jim ho ztížit jinak, než je úplně zakázat.
Line 168: Line 205:
 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. 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.
  
-Jestliže slovo obsahuje pomlčku, je to téměř jistá hranice morfémů.+Jak mám poznat podmnožinu, když 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ší vě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. 
 + 
 +V němčině je problém s kódováním. Postupně zjišťuju, že zobrazení, které použili v Lipsku, není prosté. Nejdřív byl problém se slovem //guerilla// -> //gürilla//, to je v němčině cizí. Jenže ono se to objevuje i u některých německých slov: //dauer// -> //daür//, //zuerst// -> //zürst// atd.
  

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