Wiki spuštěna 24. 7. 2025

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

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 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 <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íme XML 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---... 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.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:
    1. Typ užití MWE (přísloví, pranostika, přirovnání atd.).
    2. Syntaktický typ celé fráze (jmenná, slovesná, věta atd.).
    3. Lexikální idiomatičnost MWE (křížem krážem).
    4. Morfologická idiomatičnost MWE (podle nosa poznáš kosa).
    5. Syntaktická idiomatičnost MWE.
    6. Sémantická idiomatičnost MWE.
    7. Pragmatická idiomatičnost MWE.
    8. Statistická idiomatičnost MWE.
    9. Counter.
  • mwe_ltag: tag popisující jednotlivá slova v MWE. Pozice v tagu:
    1. (Téměř) monokolokabilní slovo.
    2. Cizí slovo/výpůjčka.
    3. Pouze negativní forma.
    4. Jinak lexikálně idiomatické slovo.
    5. 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

QR Code
QR Code wiki:user:skoumal:tacr23 (generated for current page)