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