Table of Contents
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í 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; done
a pak můžeme provést lemurizaci
mkdir -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 nalovelace
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 <MODEL_FILE> Options: -m, --model-file <MODEL_FILE> Model file [e.g. model.msgpack] -u, --url <URL> Lemur URL [default: https://yggdrasil.korpus.cz/ratatosk/api/cunits/_search] -p, --name-prefix <NAME_PREFIX> Name prefix: only dump MWEs whose name starts with the given prefix -i, --input-directory <INPUT_DIR> 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 je
cd ~/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 <INPUT> --output <OUTPUT> --model-file <MODEL_FILE> Options: -i, --input <INPUT> Input file or directory -o, --output <OUTPUT> Output file or directory -m, --model-file <MODEL_FILE> Model file -n, --number-of-threads <THREADS_NUMBER> Number of threads (batch mode only) [default: 1] -f, --format <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 Návodu na výrobu korpusu
- Vertikálu spojených anotací vytvoříme podle návodu pro 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 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
<pw>
,<para>
,<overlap>
a<unclear>
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 < vertikala
Ve stejném adresáři vzniknou
.txt
soubory obsahující jeden původní soubor. - Nasekané soubory přesuneme do adresáře
orig
a odstranímeXML
mark-up:mv *.xml ../orig/ cd ../orig parallel-mask.sh -C xml2standoff -d . -m ".*\.xml$" -p45 -v
a 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 Návodu na výrobu korpusu...) a potom vyrobíme data pro Kontext (podle Skript process_text.sh)
- Kontrola:
cd <korpus> 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---...
aH---...
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.xml
nebo 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/vertikala
a 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 zde.
Korpus anotovaný nejnovější verzí mwe_tagger
je např. NEWTON2023
Až bude LEMUR “hotový”, počítáme s prokliky z korpusu do databáze, jako je to v 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.txt
anebo, chceme-li zachovat uzávorkování, dvěma po sobě jsoucími příkazy
paren_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.txt
Pak je ještě třeba vyrazit duplikáty
sort -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ůsobem
process_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/<s>\n([0-9]+)[^\n]+/<s id="$1">/g' > /cnk/common/korpus/vertikaly/assc-lemur/vertikala