Table of Contents
Deltacorpus
Delexicalized tagging and parsing.
https://github.com/ufal/deltacorpus
Cesty na disku:
/home/zhiwai/pos
… zde zůstal Zhiweiův kód/home/marecek/listr/delex_pos
… zde to dále rozvíjí David/home/marecek/listr/ud_delex_pos
… vylepšené makefily a data z Universal Dependencies 1.2
/net/work/people/zeman/delextag
… zde to dále rozvíjí Dan
TODO
- Posunout se k parsingu (nový článek na PACLIC, odložený deadline 12.6.2016).
- U parsingu se zatím musíme držet UD 1.2 a nemůžeme přejít na UD 1.3, pokud si sami nenatrénujeme UDPIPE na 1.3. Potřebujeme se umět srovnat s parsingem nad značkami predikovanými supervizovaným modelem, a takové značky máme od Milana k dispozici pro UD 1.2. (Dělal to stylem 9+1 dílů, takže mohl označkovat trénovací i testovací data modelem, který nebyl přímo na těch datech natrénovaný.)
- Trénovací i testovací treebank obsahuje deltaznačky, žádné rysy, žádná slova ani lemmata.
- Pro každý jazyk je třeba rozhodnout, kterému deltamodelu věříme. A samozřejmě potřebujeme vždy takovou modifikaci, aby trénovací data deltamodelu neobsahovala dotyčný jazyk. Na tom už se pracuje. c7 pro všechny už jsem vyzkoušel a dopadlo to katastrofálně. Ale je možné, že jsem použil značky z HamleDTa a nasadil je na UD, tím by se část katastrofy vysvětlovala.
- I u parsingu vyzkoušet multi-source transfer, tj. na zdrojové straně je směs několika jazyků vybraných podle různých kritérií. (Pozor, při zkoumání učicí křivky beru prvních N vět, tak aby u té směsi nebyly všechny ze stejného jazyka, musela by být směs nějak pravidelně prokládaná.)
- Zkusit delexikalizovaný parsing bez jazykově závislých relací, tj. vyhodit dvojtečku a vše za ní. Měříme sice UAS, ale nějakou roli to může hrát při trénování.
- Zkusit delexikalizovaný parsing zcela bez rysů. U deltaznaček už to tak máme, ale u Milanem predikovaných a u zlatých dat ještě ne.
- Technická delexikalizace: interpunkci částečně nechat (jen trochu sjednotit) a čísla převést na 000.
- K delexikalizovanému parsingu na deltaznačkách přidat ty jazykově nezávislé meta-rysy, třeba se parser něco naučí na nich.
- Tagger, který má k dispozici 50 nejčastějších slov rozhodnutých ručně (šlo by nasimulovat tím, že je prostě řekneme správně podle zlatého standardu).
- Bude-li to vypadat smysluplně, vydat parsebank těch 107 jazyků.
- Srovnat se s rychloanotací cílového jazyka. Třeba 20 vět, lexikalizovaných, ale bez značek (protože nemáme tagger). Klidně s pomocí Google Translate tam, kde to jde.
- Obdobně je zajímavá rychloanotace u značek, viz Cucerzan and Yarowsky 2002. Vybrat 100 nejčastějších slov, dát jim značky.
- Článek:
- Citovat Loganathana (použil delex na indické jazyky).
- Citovat Teresu Lynn (použila to přímo k urychlení tvorby irského treebanku).
- Citovat Rudu Rosu (algoritmus výběru vhodného zdrojového jazyka; váhy v MST parseru).
- Vůbec by neškodilo vyhodnotit to na více parserech. Nebo alespoň přidat nivreeager + liblinear, je to rychlé.
- Analýza chyb (u deltaznaček zopakovat, protože máme nová data; u delparsingu jsme ji zatím nedělali).
Deltacorpus
Verze 1.0 (2016-03-17) obsahuje 107 jazyků vybraných z W2C. V každém je první milión tokenů (nebo méně, pokud jich W2C neobsahuje milión). Všechny jsou označkované stejným modelem, a to tím, který se při našich pokusech choval v průměru nejlépe: klasifikátor SVM se 17 rysy natrénovaný na směsi c7, tedy na bulharštině, katalánštině, němčině, řečtině, hindštině, maďarštině a turečtině; z trénovacích dat každého z těchto jazyků jsme použili prvních 50000 tokenů.
Více než polovina jazyků v Deltacorpusu je indoevropských, a z nich velké skupiny tvoří jazyky baltoslovanské, germánské a románské. Takže první, co chceme změnit, je alternativní mix trénovacích jazyků pro tyto cílové skupiny. Pokud budeme vybírat jen z těch jazyků HamleDTa, které už jsme použili pro trénování v minulosti, tak máme:
- Pro baltoslovanské jazyky bulharštinu, češtinu a ruštinu.
- Pro germánské jazyky němčinu, angličtinu a švédštinu.
- Pro románské jazyky katalánštinu, italštinu a portugalštinu.
- Lze ještě uvažovat o tom, že
- pro ostatní indoevropské jazyky, pro semitské jazyky, svahilštinu a také pro všechny umělé jazyky použijeme směs indoevropských jazyků, tj. z původního c7 vyhodíme maďarštinu a turečtinu a nahradíme je třeba češtinou a portugalštinou;
- pro aglutinační jazyky (uralské, turkické, altajské, drávidské, gruzínštinu a baskičtinu) z původního c7 určitě necháme maďarštinu a turečtinu; více podobných jazyků pro trénování nemáme, ale mohli bychom snížit vliv jazyků s chudší morfologií, tj. např. přidat češtinu, ruštinu a švédštinu a naopak vyhodit bulharštinu, katalánštinu a hindštinu;
- zbývající jazyky (nevarština, vietnamština a austronéské jazyky) ponecháme pod c7, protože toho o nich neumíme mnoho říct a hlavně nemáme trénovací jazyk, o kterém předpokládáme, že je jim podobný.
Tyhle nové trénovací směsi bychom samozřejmě měli opět vyhodnotit na testovacích jazycích, které máme k dispozici. V článku bylo 19 testovacích jazyků, ale vynechal bych bengálštinu a telugštinu, kde v podstatě nemáme povrchové věty.
Obecné poznámky
Zhiweiův kód je v Pythonu a používá jeden nestandardní modul, regex
. Lze ho doinstalovat pomocí pythonovského nástroje pip
; ten lze zase nainstalovat jako balíček pro Ubuntu. Při instalaci pipem lze přidat volbu –user
, která způsobí, že modul se nainstaluje do domovské složky aktuálního uživatele, nevyžaduje tedy přístup do systémových oblastí disku.
Jak spočítat hodnoty rysů
Rysy se získávají z velkého neanotovaného korpusu, v našem případě typicky z W2C. Výstupem je slovník, který pro každé slovo (typ) dodá hodnoty rysů. Na základě tohoto slovníku můžeme převést libovolný nový text daného jazyka na posloupnost struktur rysů. Některá slova budou OOV a nedostanou žádné rysy. Alternativně bychom je mohli přilepit k W2C a spočítat rysy i s nimi, ale to by bylo náročné.
Jak natrénovat a pustit tagger
Zhiwei dělal obojí v jednom kroku. Prošel trénovací data, natrénoval klasifikátor, nikam ho neukládal a hned ho aplikoval na testovací data. Klasifikátorů měl několik různých (např. SVM nebo KNN), ale žádný z nich nebral v úvahu kontext. Klasickým taggerům posloupností se to tedy moc nepodobalo. Slova by mohla být klidně seřazená abecedně jako ve slovníku a každé by dostalo právě jednu značku.