====== 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.