====== Práce na projektu TAČR ====== Projekt trvá od 09/23 do 11/26. Cílem je doplnit kvalitativně i kvantitativně databázi LEMUR a při značkování přejít na ni. ===== Anotace korpusů Frantou i Lemurem ===== ==== Anotace Frantou ==== * Frantou anotujeme klasicky pomocí [[wiki:user:skoumal:infra:process_text_run|návodu na výrobu korpusu novými skripty s MorphoDiTou]]. ==== Anotace Lemurem ==== * Pracujeme na ''lovelace''. * Použijeme formát ''vert-rules0-frazrl-rules-mdita-correct'' ''vert-rules0-frazrl-rules-mdita-kolok-sublm-agr'', ze kterého odstraníme anotaci FRANTou:mkdir -p vert-1-6 mkdir -p vert-7 mkdir -p vert-8 mkdir -p vert-9 cd vert-rules0-frazrl-rules-mdita-kolok-sublm-agr for ff in *; do cut -f1-6 $ff > ../vert-1-6/$ff; done for ff in *; do cut -f7 $ff > ../vert-7/$ff; done for ff in *; do cut -f8 $ff > ../vert-8/$ff; donea pak můžeme provést lemurizacimkdir -p vert-mwe lemurtag -b -i vert-6 -o vert-mwe -m /cnk/local/ssd/vitovec/model_20240915.json -n100 === Popis anotačního programu === * Program pro anotaci lemurem se jmenuje ''mwe_tagger'' a jeho poslední verze je na ''lovelace'' v adresáři ''/cnk/local/ssd/vitovec/mwe_suite/target/release''. * Ke své práci potřebuje zkompilovaný slovník z Lemuru, který se kompiluje programem ''lemur_compiler'': $ lemur_compiler -h Compile Lemur data into representation suitable for data annotation Usage: lemur_compiler [OPTIONS] --model-file Options: -m, --model-file Model file [e.g. model.msgpack] -u, --url Lemur URL [default: https://yggdrasil.korpus.cz/ratatosk/api/cunits/_search] -p, --name-prefix Name prefix: only dump MWEs whose name starts with the given prefix -i, --input-directory Local directory containing Lemur data -t, --transform Whether to derive additional data from the original data --gen-json Whether to generate JSON output along with the MSGPACK output -v, --verbose... Increase verbosity level (-v, -vv) -h, --help Print help -V, --version Print version obvyklý postup kompilace jecd ~/cnk-work/LEMUR lemur_compiler -t -m model-250820.msgpack > model-250820.log * Anotace se pak provádí programem ''mwe_tagger'': $ mwe_tagger -h Annotate data with multi-word expressions from the Lemur database Usage: mwe_tagger [OPTIONS] --input --output --model-file Options: -i, --input Input file or directory -o, --output Output file or directory -m, --model-file Model file -n, --number-of-threads Number of threads (batch mode only) [default: 1] -f, --format Format of input data [default: long] [possible values: long, short] -b, --batch-mode Batch mode (input and output interpreted as directories) -t, --include-tags Include MWE tags -c, --compress Avoid matches that are part of another matches (partially overlapping matches still allowed) -h, --help Print help -V, --version Print version obvyklý postup anotace je mwe_tagger -b -i vert-rules0-frazrl-rules-mdita-sublm-agr -o mwe_out -t -n 100 [-c]výstupní adresář musí existovat. ==== Vytvoření korpusu pro porovnání ==== * Otagovaný text, FRANTu a Lemura poslepujeme dohromady:mkdir -p vert-kolok cd vert-1-6 for ff in *; do paste $ff ../vert-7/$ff ../vert-8/$ff ../vert-9/$ff | perl -pe 's/[\ \t]+$//' > ../vert-kolok/${ff%.txt}.vrt; done * Provedeme kontroly podle [[wiki:user:skoumal:infra:process_text_run#zaverecne_kontroly|Návodu na výrobu korpusu]] * Vertikálu spojených anotací vytvoříme podle návodu pro [[wiki:user:skoumal:gacr24#anotace|GAČR 2024-2026]]: cd vert-kolok for ff in ../orig/*.txt; do ln -s $ff; done for ff in ../orig/*.json; do ln -s $ff; done for ff in ../orig/*.xml; do ln -s $ff; done parallel-mask.sh -C "ann2standoff -c ../../ann2standoff.ini -p frantalemur -P none" -m ".*\.vrt" -v -p45 -d. parallel-mask.sh -C "standoff2xml " -m ".*\.txt$" -v -p100 -d. for ff in *.ann.xml; do xml2vrt -c ../../ann2standoff.ini -p frantalemur -g g $ff; done \ > /cnk/common/korpus/vertikaly/totalita-gacr/vertikala * A pak zkompilujeme korpus na trnkovi podle návodu na [[wiki:user:skoumal:infra#indexace_do_kontextu_ukazano_na_ortofon_mluv|Práce pro Infrastrukturu]] ===== Anotace mluvených korpusů ===== ==== Lemurizace ==== V korpusu ''ortofon'' postupujeme takto: * Použijeme vertikálu, která se nachází v ''/cnk/common/korpus/vertikaly/ortofon_v3/vertikala'' * Musíme z ní odstranit značky '''', '''', '''' a '''' a zkrátit ji na 6 sloupců: cd cnk-work/Frazeologie/ortofon_v3/vert grep -vP "^<[/]?(para.*|pw|overlap|unclear)>$" /cnk/common/korpus/vertikaly/ortofon_v3/vertikala | cut -f1-6 | remove-sp.pl > vertikala * Celou vertikálu pak musíme nasekat na jednotlivé fajly:split-doc.pl < vertikalaVe stejném adresáři vzniknou ''.txt'' soubory obsahující jeden původní soubor. * Nasekané soubory přesuneme do adresáře ''orig'' a odstraníme ''XML'' mark-up:mv *.xml ../orig/ cd ../orig parallel-mask.sh -C xml2standoff -d . -m ".*\.xml$" -p45 -va přesuneme ''.txt'' soubory do ''../mwe-in'': for ff in *.txt; do echo $ff; cat -s $ff | sed '1{/^$/d}' > ../mwe-in/$ff; done * Adresář ''mwe-in'' slouží jako vstupní pro lemurizátor (provádíme na lovelace):cd cnk-work/Frazeologie/ortofon_v3 lemurtag -b -i mwe-in -o mwe-out -m /cnk/local/ssd/vitovec/model_20240915.json -n 10 ==== Vytvoření korpusu pro Kontext ==== Postupujeme stejně jako u Synů. Nejdřív vše zkontrolujeme (podle [[wiki:user:skoumal:infra:process_text_run#opravy_chybejicich_nebo_vadnych_souboru|Návodu na výrobu korpusu...]]) a potom vyrobíme data pro Kontext (podle [[wiki:user:skoumal:infra:process_text_run#vyroba_vlastnich_korpusu|Skript process_text.sh]]) * Kontrola:cd comm -3 <(ls mwe-in) <(ls mwe-out) cd .. parallel-filter.sh -C "check-vert-tag-v2020.pl -c5 -k -t -V" -n -s mwe-out -p45(v současné době si stěžuje na tagy ''%%E---...%%'' a ''%%H---...%%'' a na lemuří tagy). * Vrátíme do souboru XML tagy. Na to si nejdříve musíme vyrobit ''skeleton file'':cd orig grep -vP "\t" 15X028N.xml > ../mwe-out/15X028N.skel.xml * Potom spustíme program ''vrt2xml.pl'':cd ../mwe-out vrt2xml.pl 15X028N.skel.xml /dev/null < 15X028N.txt > 15X028N.ann.xmlnebo hromadně for ff in *.txt; do echo $ff; vrt2xml.pl ${ff%.txt}.skel.xml ../failed-files.txt < $ff > ${ff%.txt}.ann.xml; done * Soubory ''.ann.xml'' už můžou být poslepovány do vertikály: cat *.ann.xml > /cnk/common/korpus/vertikaly/ortofon_mwe/vertikalaa oindexovány do korpusu. ===== Anotace v SYNech ===== Zde jsou sepsané zásady pro frazémovou anotaci v SYNech počínaje verzí SYNv14 a SYN2025, přičemž něco se uplatní až v dalších korpusech. * Přecházíme na databázi LEMUR a anotační program ''mwe_tagger''. * Frazémová anotace bude sestávat z těchto částí: * ''mwe_lemma'' * ''mwe_tag'' * ''mwe_ltag'' * ''mwe_lemma'': lemma z databáze LEMUR. Pod ním se mohou skrývat různé varianty lexikálního obsazení, ale lemma bude pro všechny varianty jen jedno: * ''mrkat_na_drát'': //mrkat//, //čučet//, //čumět// * ''mwe_tag'': tag popisující celou MWE, u všech slov stejný, až na příznak (momentálně 1) sloužící k tomu, abychom mohli každý výskyt najít jen jednou. Pozice v tagu: - Typ užití MWE (přísloví, pranostika, přirovnání atd.). - Syntaktický typ celé fráze (jmenná, slovesná, věta atd.). - Lexikální idiomatičnost MWE (//křížem krážem//). - Morfologická idiomatičnost MWE (//podle nosa poznáš kosa//). - Syntaktická idiomatičnost MWE. - Sémantická idiomatičnost MWE. - Pragmatická idiomatičnost MWE. - Statistická idiomatičnost MWE. - Counter. * ''mwe_ltag'': tag popisující jednotlivá slova v MWE. Pozice v tagu: - (Téměř) monokolokabilní slovo. - Cizí slovo/výpůjčka. - Pouze negativní forma. - Jinak lexikálně idiomatické slovo. - Nestandardní tvar. * Pracujeme i s transformacemi. Některé jsou bezproblémové, některé budeme ještě testovat. Jde třeba o pasiva, nominalizace, adjektivizace apod. * Bezproblémové: * Opisné pasivum. * Reflexivní pasivum. * Nominalizace na //-ní/-tí//. * Činná adjektiva na //-lý/-ící/-vší//. * Pasivní adjektiva na //-ný/-tý//. * Přechýlení. * Problematické: * Zdrobněliny. * Jiné nominalizace (//-telnost/-ost// apod.). * Derivace. * Do ''mwe_tag'' přidáme ještě příznak, že jde o transformaci (a jakou). * Pokud transformace povede ke změně POS, podle kterého se určuje synt. typ, ponecháme MWE lemma, jak je, ale změníme tag. Může se pak stát, že lemma je slovesná fráze, ale tag říká, že jde o jmennou frázi: ''//hození flinty do žita //%% hodit_flintu_do_žita vn---z--%%'' Podrobnější popis ''mwe_tag'' a ''mwe_ltag'' je [[https://drive.google.com/file/d/1vzW7AU_LtJ-KuSUMxcsF15VGrofAW-9f/view|zde]]. Korpus anotovaný nejnovější verzí ''mwe_tagger'' je např. [[https://www.korpus.cz/kontext/query?corpname=NEWTON2023|NEWTON2023]] Až bude LEMUR "hotový", počítáme s prokliky z korpusu do databáze, jako je to v [[https://www.korpus.cz/kontext/query?corpname=syn2020lemur|syn2020lemur]]. ===== Anotace MWE z ASSČ (pro Honzu) ===== ==== Úprava vstupu ==== Vstupní věty obsahují ID a text se závorkami, lomítky a svislítky, např. * ''%% 6764 [dělat / vyvolávat / způsobit] zlou krev (mezi někým)|[dělat / vyvolávat / způsobit] (někde) zlou krev%%'' * ''%% 7128 dávatxsi na někoho / něco (velkého) bacha / majzla%%'' * ''%%14170 čumět (na něco / někoho) jako puk%%'' Je třeba text rozgenerovat, aby každá varianta tvořila celou větu. Netvoříme varianty, kde je něco vynecháno, vždy použijeme všechny pozice. Závorky jsou užitečné, protože vyznačují dosah lomítka. Tam, kde chybí, je doplníme perlovským skriptem ''paren_ASSC.pl'' paren_ASSC.pl < assc-lemmata_062025_lemurizovat.txt > assc-lemmata_062025_paren_lemurizovat.txt Výsledkem je soubor. kam jsou dodané složené závorky: * ''%%6764 [[dělat / vyvolávat / způsobit]] zlou krev (mezi někým)|[[dělat / vyvolávat / způsobit]] (někde) zlou krev%%'' * ''%%7128 dávatxsi na {někoho / něco} (velkého) {bacha / majzla}%%'' * ''%%2119 to by {člověk / jeden} blil|z toho by {jeden / člověk} blil%%'' Pro rozgenerování všech variant máme skript ''split_ASSC.pl''. Je třeba ještě opravit ''xsi'' a ''xse'' na '' si'' a '' se'' a vyrazit duplikáty. Celé rozgenerování se pouští příkazem paren_ASSC.pl < assc-lemmata_062025_lemurizovat.txt | split_ASSC.pl | perl -pe 's/x(s[ei])/ $1/g' > assc-lemmata_062025_split_lemurizovat.txtanebo, chceme-li zachovat uzávorkování, dvěma po sobě jsoucími příkazyparen_ASSC.pl < assc-lemmata_062025_lemurizovat.txt > assc-lemmata_062025_paren_lemurizovat.txt split_ASSC.pl < assc-lemmata_062025_paren_lemurizovat.txt | perl -pe 's/x(s[ei])/ $1/g' > assc-lemmata_062025_split_lemurizovat.txtPak je ještě třeba vyrazit duplikátysort -u -o assc-lemmata_062025_split_lemurizovat.txt assc-lemmata_062025_split_lemurizovat.txt TODO: Je třeba ještě ošetřit spřežky: * Jedny$ grep -P "([\p{L}]+) ([\p{L}]+) / \1\2" assc-lemmata_062025_lemurizovat.txt 1542 blbnout na kvadrát / nakvadrát 24318 být [ten tam / tentam / ta tam / tatam] 28969 brát za své / zasvé 41772 svatá Anna, chladna z rána / zrána 41772 svatá Anna, chladna z rána / zrána 24081 vzít / brát za své / zasvé * Druhé:$ grep -P "([\p{L}]+)([\p{L}]+) / \1 \2" assc-lemmata_062025_lemurizovat.txt 1567 totéž v bleděmodrém / bledě modrém|to samé v bleděmodrém / bledě modrém 10444 rozpálit / rozžhavit někoho doběla / do běla 14155 koukat / čumět / zírat doblba / do blba 15612 dátxsi (s něčím) načas / na čas 15613 dávatxsi (s něčím) načas / na čas 29547 jez dopolosyta / do polosyta (, pij dopolopita / do polopita) 43866 jít donaha / do naha 54432 spadnout z jahody (naznak / na znak) 52727 koukat (na to) jako zjara / z jara 55391 nemít (ani) (zdaleka / z daleka) vyhráno 55390 nemít (ještě) (zdaleka / z daleka) vyhráno 51229 [oznámit / sdělit / donést] někomu něco hned zatepla / za tepla 51228 [oznámit / sdělit / donést] někomu něco ještě / hned zatepla / za tepla 51230 [oznámit / sdělit / donést] někomu něco ještě zatepla / za tepla 51228 [oznámit / sdělit / donést] někomu něco ještě / hned zatepla / za tepla 51228 [oznámit / sdělit / donést] někomu něco ještě / hned zatepla / za tepla 47253 rozpálit / rozžhavitxse doběla / do běla 56621 (je to pravda,) jakože / jako žexse X jmenuju ==== Lemurizace ==== Hotový soubor ''assc-lemmata_062025_split_lemurizovat.txt'' zkopírujeme do adresáře ''in-utf8'' a postupujeme obvyklým způsobemprocess_text.sh -f -v Adresář ''vert-rules0-frazrl-rules-mdita-sublm-agr'' zlinkujeme jako ''mwe-in'', vyrobíme ''mwe-out'' a lemurizujeme mwe_tagger -i mwe-in/ -o mwe-out/ -m ~/cnk-work/LEMUR/model-250618.msgpack -b -t -c Korpus (''assč-lemur'') vyrobíme ze souboru v ''mwe-out'' příkazem mkdir /cnk/common/korpus/vertikaly/assc-lemur vert2verttab.pl mwe-out | perl -pe 'undef $/; s/\n([0-9]+)[^\n]+//g' > /cnk/common/korpus/vertikaly/assc-lemur/vertikala