[ Skip to the content ]

Institute of Formal and Applied Linguistics Wiki


[ Back to the navigation ]

This is an old revision of the document!


Table of Contents

Morpho Challenge 2008

Stránky soutěže jsou na http://www.cis.hut.fi/morphochallenge2008/. E-mailová adresa organizátorů je morphochallenge2007@james.hut.fi. Poznámky k mému loňskému řešení jsou na stránce Morpho Challenge 2007.

Data mám v ~/data/morphochallenge/2008. Programy mám v ~/projekty/morphochallenge (odkaz na data vede i odsud). Původně byly v ~/zapoctaky/konc.

setenv MC /home/zeman/projekty/morphochallenge

Příprava dat

Organizátoři používají trochu zvláštní kódování, navíc pro každý jazyk jiné. Napsal jsem si skript, který převede data od organizátorů do UTF-8. Bude umět i převod opačným směrem, což bude potřeba, až budu organizátorům posílat výsledky.

cd ~/data/morphochallenge/2008
gunzip -c wordlist.ara.gz | $MC/mc_convert.pl -f ar > wordlist.ar.txt
gunzip -c wordlist.eng.gz | $MC/mc_convert.pl -f en > wordlist.en.txt
gunzip -c wordlist.fin.gz | $MC/mc_convert.pl -f fi > wordlist.fi.txt
gunzip -c wordlist.ger.gz | $MC/mc_convert.pl -f de > wordlist.de.txt
gunzip -c wordlist.tur.gz | $MC/mc_convert.pl -f tr > wordlist.tr.txt

Můj skript pro automatické rozsekání slov na kmeny a koncovky předpokládá, že vstup je textový korpus ve formátu CSTS. Nejprve tedy musíme trénovací seznamy slov a jejich četností převést do tohoto formátu.

cd $MC
foreach l (ar de en fi tr)
  mc2csts.pl < data/2008/wordlist.$l.txt -l $l > data/2008/$l.csts
end

Trénování morfologických vzorů

Pro některé jazyky (zejména pro finštinu) trvá zpracování déle, než by se chtělo čekat, a vyplatí se tedy úlohy odeslat na cluster:

# lrc
cd $MC
foreach l (ar de en fi tr)
  qsub.csh mc_jazyk.csh $l
end

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):

csts2kmkon.pl < en.csts > en.kmkon
kmkon2vzor.pl < en.kmkon > en.vzor
vzorfiltr.pl < en.vzor > en1.vzor

Skript vzorfiltr.pl jako vedlejší účinek vedle standardního výstupu tiše vyrobí soubory kmeny.txt a koncovky.txt.

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, zda rozpoznáme alespoň koncovky (aniž bychom znali kmen).

Rozklad slov na základě již vybudovaného seznamu vzorů se provede takto:

mchallenge.pl kmeny.txt koncovky.txt < wordlist.eng > en.dz.txt
cd $MC/data/2008
foreach l (ar de en fi tr)
  $MC/mchallenge.pl $l.kmeny.txt $l.koncovky.txt < wordlist.$l.txt > $l.dz.txt
end

Ú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 řetězcem, který jsme od organizátorů dostali, tedy také v původním kódování. Zbytek řádku mohou být více méně libovolné řetězce, kterými si označujeme morfémy. Mohli bychom výstupy prohnat převodem kódování inverzním k tomu, který jsme na začátku dělali se vstupem. O něco bezpečnější se zdá žádné překódování neprovádět a pouze nahradit první slovo kopií prvního slova ze vstupu (vstupní a výstupní soubor mají stejný počet řádků, což se dá snadno ověřit). Má to ale háček. Původní texty obsahují ne-ASCII znaky, které jsou pak vesměs zakódované v ISO Latin 1. Uvnitř Perlu budou tyto znaky reprezentované jako UTF-8. Pokud pak na výstupu zvolíme UTF-8, bude se výstupní slovo lišit od vstupního. Pokud zvolíme ISO Latin 1, budou v pytli morfémy (možná jde nejen o estetickou chybu, ale i o věcnou, protože např. v arabštině by to mohlo dopadnout tak, že většina morfémů se převede na řetězce otazníků). Takže nakonec bude možná přece jen lepší překódovat celé výstupní soubory do těch příšerných kódování, která používají organizátoři.

cd ~/data/morphochallenge/2008
$MC/mc_convert.pl -t ar < ar.dz.txt | gzip -c > wordlist.ara.dz.gz
$MC/mc_convert.pl -t de < de.dz.txt | gzip -c > wordlist.ger.dz.gz
$MC/mc_convert.pl -t en < en.dz.txt | gzip -c > wordlist.eng.dz.gz
$MC/mc_convert.pl -t fi < fi.dz.txt | gzip -c > wordlist.fin.dz.gz
$MC/mc_convert.pl -t tr < tr.dz.txt | gzip -c > wordlist.tur.dz.gz
$MC/mc_convert.pl -t ar < ar.dz3.txt | gzip -c > wordlist.ara.dz3.gz
$MC/mc_convert.pl -t de < de.dz3.txt | gzip -c > wordlist.ger.dz3.gz
$MC/mc_convert.pl -t en < en.dz3.txt | gzip -c > wordlist.eng.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

Zpracování převrácených slov a hledání předpon

# lrc
cd $MC/data/2008
foreach l (ar de en fi tr)
  $MC/reverse.pl < $l.csts > $l.rev.csts
  qsub.csh $MC/mc_jazyk.csh $l.rev
end
foreach l (ar de en fi tr)
  cat $l.rev.kmeny.txt | $MC/reverse_line.pl > $l.kmeny1.txt
  cat $l.rev.koncovky.txt | $MC/reverse_line.pl > $l.predpony.txt
  $MC/mchallenge3.pl $l.predpony.txt $l.kmeny1.txt $l.kmeny.txt $l.koncovky.txt < wordlist.$l.txt > $l.dz3.txt
end

Zbývá udělat

Postřehy

Předpony, zdá 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 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, 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 datech a -ly i -ness jsou běžné koncovky?


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