Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
user:zeman:morpho-challenge-2008 [2008/05/06 09:47] zeman Převést do CSTS. |
user:zeman:morpho-challenge-2008 [2008/08/04 13:07] (current) zeman Daür, zürst. |
||
---|---|---|---|
Line 19: | Line 19: | ||
Můj skript pro automatické rozsekání slov na kmeny a koncovky předpokládá, | Můj skript pro automatické rozsekání slov na kmeny a koncovky předpokládá, | ||
- | ===== Zbytek této stránky je zatím pouhá kopie z roku 2007 ===== | + | < |
+ | foreach l (ar de en fi tr) | ||
+ | mc2csts.pl < data/ | ||
+ | end</ | ||
- | Dostali jsme pro každý jazyk (angličtinu, | + | ===== Trénování morfologických vzorů ===== |
- | Moje zpracování se skládá ze dvou částí: | + | Pro některé jazyky (zejména pro finštinu) trvá zpracování |
- | - Rozebrat slova na vstupu, získat seznam vzorů, kmenů | + | |
- | - Znova projít slova na vstupu, každé přiřadit k jednomu nebo několika vzorům a vypsat odpovídající rozklady. | + | |
- | Nijak nevyužívám informaci o četnosti slovních tvarů ani o kontextu slov v korpusu. Slovo umím rozložit na právě dva morfémy | + | < |
+ | cd $MC | ||
+ | foreach l (ar de en fi tr) | ||
+ | qsub.csh mc_jazyk.csh $l | ||
+ | end</ | ||
- | Potřebné skripty | + | Během trénování pro každý jazyk l vzniknou následující soubory: |
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
Seznam vzorů se buduje takto (práce je rozdělena do několika kroků, protože zpracování velkých dat trvá dlouho a při opravě nějaké drobnosti u filtrování vzorů nechceme muset opakovat i první dva kroky): | Seznam vzorů se buduje takto (práce je rozdělena do několika kroků, protože zpracování velkých dat trvá dlouho a při opravě nějaké drobnosti u filtrování vzorů nechceme muset opakovat i první dva kroky): | ||
< | < | ||
- | kmkon2vzor.pl < en.kmkon > en.vzor | + | kmkon2vzor.pl < en.kmkon > en.nefiltr |
- | vzorfiltr.pl < en.vzor > en1.vzor</ | + | vzorfiltr.pl |
Skript '' | Skript '' | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== Morfematická segmentace ===== | ||
+ | |||
+ | Mám natrénovaný seznam vzorů, resp. seznam kmenů a koncovek. Segmentace ve skutečnosti znamená najít takové dělení slova na dvě části, aby první část odpovídala známému kmenu a druhá část známé koncovce. | ||
+ | |||
+ | Slovo umím rozložit na právě dva morfémy (kmen a koncovka) nebo nechat nerozložené. Při přiřazování slov ke vzorům se přednostně zjišťuje, zda známe přímo danou dvojici kmen-koncovka. Pokud žádnou takovou dvojici nenajdeme, zjišťujeme, | ||
Rozklad slov na základě již vybudovaného seznamu vzorů se provede takto: | Rozklad slov na základě již vybudovaného seznamu vzorů se provede takto: | ||
< | < | ||
- | Turečtinu je pak ještě nutné prohnat skriptem '' | ||
- | ===== Nové seznamy | + | < |
+ | foreach l (ar de en fi tr) | ||
+ | $MC/ | ||
+ | end</ | ||
+ | |||
+ | 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 " | ||
+ | - 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, | ||
+ | |||
+ | ===== Úprava výstupu před odesláním ===== | ||
+ | |||
+ | Ve výstupních souborech musí být první slovo (tvar, který jsme měli rozebrat) identické s& | ||
+ | |||
+ | < | ||
+ | $MC/ | ||
+ | $MC/ | ||
+ | $MC/ | ||
+ | $MC/ | ||
+ | $MC/ | ||
+ | $MC/ | ||
+ | $MC/ | ||
+ | $MC/ | ||
+ | $MC/ | ||
+ | $MC/ | ||
+ | |||
+ | ===== Skórování ===== | ||
+ | |||
+ | Organizátoři poskytli program '' | ||
+ | |||
+ | Co ještě potřebujeme: | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | Jaký je tedy úplný postup při vyhodnocování? | ||
+ | |||
+ | - Stáhnout program '' | ||
+ | - Stáhnout program '' | ||
+ | - Pro jazyk, který chceme vyhodnocovat, | ||
+ | - Pro jazyk, který chceme vyhodnocovat, | ||
+ | - Z výstupu analyzátoru, | ||
+ | - Nejdříve vytvoříme seznam relevantních slov, tedy takových, která se vyskytují ve vzorových analýzách, | ||
+ | - Potom náhodně vybereme 100 relevantních slov z výstupu našeho analyzátoru. < | ||
+ | - Nyní již máme pohromadě všechny soubory potřebné jako vstupy pro vyhodnocovací program a můžeme spustit vyhodnocování: | ||
+ | < | ||
+ | |||
+ | < | ||
+ | $MC/ | ||
+ | $MC/ | ||
+ | |||
+ | ===== Vyhodnocení ===== | ||
+ | |||
+ | Moje vyhodnocení se bude lišit od oficiálních výsledků soutěže, protože mám k dispozici gold standard jen pro 500 slov z každého jazyka. Na prvním místě uvádím své výsledky, vpravo pak oficiální výsledky zveřejněné na stránkách soutěže. | ||
+ | |||
+ | | Jazyk | F | P | R | Fo | Po | Ro | | ||
+ | | en | 48.56 | 53.39 | 44.53 | 46.90 | 52.98 | 42.07 | | ||
+ | | de | 27.67 | 30.28 | 25.47 | 36.98 | 53.12 | 28.37 | | ||
+ | | fi | 30.97 | 47.44 | 22.99 | 30.33 | 58.51 | 20.47 | | ||
+ | | tr | 32.68 | 59.46 | 22.53 | 29.23 | 65.81 | 18.79 | | ||
+ | | ar | 15.78 | 79.86 | 8.76 | 21.86 | 77.24 | 12.73 | | ||
+ | |||
+ | ===== Zpracování převrácených slov a hledání předpon ===== | ||
+ | |||
+ | < | ||
+ | cd $MC/ | ||
+ | foreach l (ar de en fi tr) | ||
+ | $MC/ | ||
+ | qsub.csh $MC/ | ||
+ | end</ | ||
+ | |||
+ | < | ||
+ | cat $l.rev.kmeny.txt | $MC/ | ||
+ | cat $l.rev.koncovky.txt | $MC/ | ||
+ | $MC/ | ||
+ | end</ | ||
+ | |||
+ | ===== Záznamy pokusů ===== | ||
+ | |||
+ | ==== Převrácená slova a předpony ==== | ||
+ | |||
+ | První pokus se ještě dostal do oficiálního vyhodnocení, | ||
+ | |||
+ | ==== 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í, | ||
+ | |||
+ | ==== 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: | ||
+ | |||
+ | === 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í, | ||
+ | |||
+ | Složitost algoritmu je v nejhorším případě O((n**2)*k), | ||
+ | |||
+ | Nový dynamický: | ||
+ | 1. Projít všechny množiny. | ||
+ | 2. Pro každou zkoumat 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 " | ||
+ | |||
+ | 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 ===== | ||
+ | |||
+ | * 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& | ||
+ | |||
+ | |||
+ | |||
+ | ===== Postřehy ===== | ||
+ | |||
+ | 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 a ověřit, zda 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ě. | ||
+ | |||
+ | 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, | ||
+ | |||
+ | Č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. | ||
+ | |||
+ | Vzhledem ke způsobu vyhodnocení, | ||
+ | |||
+ | Jak mám poznat podmnožinu, | ||
- | Organizátoři dodatečně poskytli seznamy nových slov, která se neobjevila v původních trénovacích datech, ale vyskytují se v datech, nad kterými se vyhodnocuje získávání informací (information retrieval). Spojuji nový seznam slov se starým. Nad spojeným seznamem natrénuji nový seznam vzorů. Těmito vzory pak rozeberu nový seznam | + | V němčině je problém s kódováním. Postupně zjišťuju, že zobrazení, které použili |
- | < | ||
- | iconv -f iso-8859-1 -t utf8 < combined.eng | mctr2csts.pl > entrain1.csts | ||
- | csts2kmkon.pl < entrain1.csts > en1.kmkon | ||
- | kmkon2vzor.pl < en1.kmkon > en1.vzor | ||
- | vzorfiltr.pl < en1.vzor > en1.filtr.vzor | ||
- | mv kmeny.txt en1kmeny.txt | ||
- | mv koncovky.txt en1koncovky.txt | ||
- | mchallenge.pl en1kmeny.txt en1koncovky.txt < new-wordlist.eng > en1.dz.txt</ |