Wiki spuštěna 24. 7. 2025

Návod na výrobu korpusu novými skripty s MorphoDiTou

Tento návod se týká korpusů SYN2020 a novějších.

  • Pracujeme v UTF-8.
  • Zdrojové texty jsou dodávány ve formátu XML; my je převedeme na holý text a zpracujeme sadou skriptů.
  • Všechny použité skripty vytvoří adresář errlog, do kterého se zapisují chybové hlášky, a protokol o běhu proces_<skript>.log. Staré verze errlog a logu se přejmenují podle data, kdy byly vytvořeny.
  • Na konci provedeme několikerou kontrolu.

Přebrání souborů v XML

Soubory (pro NEWTON) jsou někde v /cnk/common/korpus/xml a jsou v adresářích podle titulů a ročníku, např. …/Ze/2023/. My potřebujeme všechny soubory v jednom adresáři:

for dd in /cnk/common/korpus/xml/synkorp/newton/03461/*; do echo $dd; cp -p $dd/2023/* ~/cnk-work/SYNv13/NEWTON2023/source/; done

Oprava ligatur fi a fl

V původních XML textech jsou místy rozdělená slova obsahující ligatury fi a fl. Před zpracováním korpusu část těchto chyb opravíme a opravené XML soubory nakonec odevzdáme i s korpusem.

cd NEWTON2020
parallel-filter.sh -C "repair_control_chars.pl | repair_xml.pl" -s orig_old -t orig_new -v -p45

Zkontrolujeme provedené opravy:

sort -u stat_repair.txt | perl -pe 's/<p>//' | perl -pe 's:</p>?::' | perl -pe 's/^(OCR_[0-9][0-9]:)[\s[:punct:]“„…«»]+/$1/' \
| perl -pe 's/[[:punct:]“„…«»]+$//' | sort -u | l

a případně přizpůsobíme skript repair_xml.pl. Před novým spuštěním nezapomeneme smazat stat_repair.txt.

Opravy repair_xml.pl

Kontrolu provedeme obarveným diffem:

for dd in *; do cd $dd/2023; for ff in *; do \
git diff --no-index --color=always $ff ../../../../../11_step/newton/03461/$dd/2023/$ff | diff-highlight; done; cd ../..; done \
| l -r

nebo

for dd in *; do cd $dd/2023; for ff in *; do \
diff -u --color=always $ff ../../../../../11_step/newton/03461/$dd/2023/$ff | diff-highlight; done; cd ../..; done \
| l -r

Zkontrolovat:

  • vod
  • š kol
  • - (konfi -gurátor podle ofi -ciální)
  • UEFI X
  • škole.Honza
  • portugalskou školoua

Dodat:

  • Th ompson
  • rovno váh?
  • airsoft ov

Odstranění XML značek

  • Původní XML soubory jsou umístěny v adresáři orig. Žádné odstraňování url a e-mailů neprovádíme.
  • Použijeme Vondřičkův script:
    cd orig
    for ff in *.xml; do echo $ff; xml2standoff $ff; done

    anebo paralelně

    parallel-mask.sh -C xml2standoff -d . -m ".*\.xml$" -p45 -v
  • Holé texty .txt zkopírujeme do adresáře in-utf8.

Tokenizace, segmentace, morfologie, pravidla a MorphoDiTa

  • Pro provedení segmentace, tokenizace a morfologické analýzy používáme skript process_text.sh.
  • Pokud potřebujeme znát všechny mezikroky, použijeme přepínč -D, jinak se uloží pouze některé mezikroky.
  • Vývojová verze se pouští rovnou, zmrazená po nastavení prostředí příkazem versyn2020.
  • Standardní spuštění skriptu:
    screen process_text.sh -p45 -v

    Defaultní vstup je in-utf8, defaultní výstup je vert-rules-mdita-sublm-agr. Zachovají se tyto adresáře s mezivýsledky:

    • vert-morf-simp-nosp-sgcr-con — nutné pro závěrečné úpravy
    • vert-vrbtg8 — výsledek morfologické analýzy
    • vert-rules — výsledek pravidel
    • vert-rules-mdita — výsledek MorphoDiTy
  • Pokud potřebujeme adresář vert-rules-mdita-correct pro spuštění kolokací, můžeme buď použít přepínač -D, nebo jako target zadat adresář vert-rules-mdita-conllu-in:
    process_text.sh -p45 -t in -v
  • Při použití přepínače -D se zachovají tyto adresáře s mezivýsledky:
    • vert — segmentace a tokenizace
    • vert-morf-simp — morfologie
    • vert-morf-simp-nosp — vyznačení (ne)mezer a odstavců podle holého textu
    • vert-morf-simp-nosp-sgcr — opravená segmentace
    • vert-morf-simp-nosp-sgcr-con — opravená tokenizace
    • vert-morf-simp-nosp-sgcr-con-sublm — dodaná sublemmata
    • vert-rules-mdita-correct — výsledek MDiTy opravený podle původní nabídky morfologie
  • Chceme-li použít i frazrl, spustíme skript takto:
    screen process_text.sh -f -p45 -t in -v

Syntax

Kolokace

Kolokace se vyrábějí skriptem process_kolok.sh:

cd NEWTON2020
process_kolok.sh -p 80 -v

pokud jsme dělali pouze pravidla a máme adresář vert-rules-mdita-correct, anebo příkazem

process_kolok.sh -p 80 -s vert-rules0-frazrl-rules-mdita-correct -v

Vytvoření mezivýsledku vert-rules0-frazrl-rules-mdita-kolok

Pokud jsme nepustili kolokace s přepínačem -D a potřebujeme výsledek FRANTy před závěrečnými skripty, můžeme si chybějící data vyrobit:

cd NEWTON2019
parallel-filter.sh -C "cut -f2- | split-subl-agreg.pl | cut -f1,2,4- | perl -pe 's/^([^\t]+\t[^\t]+\t[^\t]+)\t/\1/'" \
-s vert-rules0-frazrl-rules-mdita-kolok-sublm-agr -t vert-rules0-frazrl-rules-mdita-kolok -v -p100

Druhé kolo final_corrections

  • V adresáři vyrobíme nový adresář Final_Corr a v něm podadresáře:
    mkdir -p Final_Corr/vert-rules0-frazrl-rules-mdita-kolok
    mkdir -p Final_Corr/vert-rules0-frazrl-rules-mdita-kolok-sublm-agr
    mkdir -p Final_Corr/vert-morf-simp-nosp-sgcr-con
    mkdir -p Final_Corr/orig
    mkdir -p Final_Corr/in-utf8

    a vyrobíme v nich linky:

    cd Final_Corr/vert-rules0-frazrl-rules-mdita-kolok/
    for ff in ../../vert-rules0-frazrl-rules-mdita-kolok-sublm-agr/*; do ln -s $ff; done
    cd ../vert-morf-simp-nosp-sgcr-con/
    for ff in ../../vert-morf-simp-nosp-sgcr-con/*; do ln -s $ff; done
    cd ../in-utf8/
    for ff in ../../in-utf8/*; do ln -s $ff; done
    cd ../orig/
    for ff in ../../[../../SYNv10/<korpus>/]orig/*; do ln -s $ff; done
  • V tomto novém adresáři pustíme (ve screenu) poslední dva příkazy:
    cd ../vert-rules0-frazrl-rules-mdita-kolok/
    screen
    ls | parallel -j45 "cat {} | final_correct_segmentation.pl ../vert-morf-simp-nosp-sgcr-con/{} \
    | final_corrections.pl | perl -pe 's/[\t]+$//' > ../vert-rules0-frazrl-rules-mdita-kolok-sublm-agr/{}"

Závěrečné kontroly

Musíme zkontrolovat:

  1. Počet zpracovaných souborů
  2. Korektnost řádků včetně tagů
  3. Úplnost souborů
  4. Kompatibilitu s původními XML texty
  • Počet souborů:
    cd <korpus>
    comm -3 <(ls in-utf8) <(ls vert-rules0-frazrl-rules-mdita-kolok-sublm-agr)

    nebo

    comm -3 <(ls in-utf8) <(ls vert-rules0-frazrl-rules-mdita-correct)
  • Korektnost řádků po kolokacích:
    cd vert-rules0-frazrl-rules-mdita-kolok
    for ff in *; do check-vert-tag-v2020.pl -k -t -l21 < $ff > /dev/null; done

    nebo paralelně

    parallel-filter.sh -C "check-vert-tag-v2020.pl -k -t -l21" -n -s vert-rules0-frazrl-rules-mdita-kolok -p45

    Nebo po pravidlech

    parallel-filter.sh -C "check-vert-tag-v2020.pl" -n -s vert-rules0-frazrl-rules -p80

    Nebo po tagování:

    parallel-filter.sh -C "check-vert-tag-v2020.pl -t -l21" -n -s vert-rules0-frazrl-rules-mdita-correct -p80

    Nebo na úplném konci:

    parallel-filter.sh -C "check-vert-tag-v2020.pl -c5 -k -t -V" -n -s vert-rules0-frazrl-rules-mdita-[kolok-]sublm-agr -p45
  • Pro kontrolu úplnosti souborů potřebujeme adresář in-utf8:
    cd vert-prislovi-kolok
    for ff in *; do no_space_after_token_morphanal.pl ../in-utf8/$ff /dev/null < $ff > /dev/null; done

    nebo paralelně:

    cd vert-prislovi-kolok
    ls | parallel -j45 "no_space_after_token_morphanal.pl ../in-utf8/{} /dev/null < {} > /dev/null"

Opravy chybějících nebo vadných souborů

  • Vytvoříme adresář oprava, ve kterém znovu zpracujeme vadné soubory. Nejdřív ale vytvoříme soubor missing-files.txt (pomocí příkazů pro kontrolu uvedených výše).Následující příklad je pro předělání kolokací:
    cd <korpus>
    mkdir -p oprava/in-utf8
    mkdir -p oprava/vert-morf-simp-nosp-sgcr-con/
    mkdir -p oprava/vert-rules0-frazrl-rules-mdita-correct/
    rsync -avz --files-from=missing-files.txt in-utf8/ oprava/in-utf8/
    rsync -avz --files-from=missing-files.txt vert-morf-simp-nosp-sgcr-con/ oprava/vert-morf-simp-nosp-sgcr-con/
    rsync -avz --files-from=missing-files.txt vert-rules0-frazrl-rules-mdita-correct/ oprava/vert-rules0-frazrl-rules-mdita-correct/
    cd oprava
    process_kolok.sh -p20 -s vert-rules0-frazrl-rules-mdita-correct -v
  • Závěrečné kolo final_corrections:
    cd <korpus>
    parallel-filter.sh -C "final_corrections.pl | perl -pe 's/[\t\ ]+$//'" -s vert-rules0-frazrl-rules-mdita-kolok-sublm-agr \
    -t vert-final-corrections -p100 -v -e

Převod do formátu pro ČNK

  • Převod do formátu ČNK (a kontrolu kompatibility) provedeme pomocí Vondřičkových skriptů. Potřebujeme k tomu adresář orig.
    • Pokud jsme vyráběli korpus se strukturami, musíme je nejdřív odstranit:
      cd NEWTON2020
      parallel-filter.sh -C "perl -pe 's/^<[ps]>$//' | perl -pe 's:^</[ps]>$::' | grep -v \"^<g\/>$\" | cat -s | sed '1{/^$/d}'" \
      -v -p100 -s vert-rules0-frazrl-rules-mdita-kolok-sublm-agr -t vert-corr
      cd vert-corr
      for ff in *.txt; do mv $ff ${ff%.txt}.vrt
    • Pokud vytváříme korpus s nedokončenou desambiguací, musíme si vytvořit vlastní .vrt soubory pomocí programu vert2vertbar.pl (z grimma):
      cd .../korpus
      vert2vertbar.pl vert-rules0-frazrl-rules vert-r0-f-r
    • Pokud máme kolokace začínající na W, odstraníme je:
      cd vert-rules0-frazrl-rules-mdita-kolok-sublm-agr
      for ff in *.txt; do perl -pe 's/\tW([^\t\ ]+)$/\t$1/' $ff > ../vert-corr/${ff%.txt}.vrt; done

      anebo paralelně:

      ls | parallel -j45 "perl -pe 's/\tW([^\t\ ]+)$/\t\1/' {} > ../vert-corr/{.}.vrt"
    • Jinak soubory jenom zkopírujeme a přejmenujeme:
      cd vert-rules0-frazrl-rules-mdita-kolok-sublm-agr
      for ff in *.txt; do cp -p $ff ../vert-corr/${ff%.txt}.vrt; done
  • Pak můžeme spustit Vondřičkův skript:
    cd vert-corr
    for ff in *.vrt; do ln -s ../orig/${ff%.vrt}.txt; done
    for ff in *.vrt; do ln -s ../orig/${ff%.vrt}.json; done
    # parallel-mask.sh -C "vrt2standoff.py -v cnk2020lemur" -m ".*\.vrt$" -v -p45 -d.
    parallel-mask.sh -C "ann2standoff -p cnk2020lemur -P none" -m ".*\.vrt$" -v -p45 -d.
    ls *.vrt | wc -l
    ls *.ann.json | wc -l

    nebo pro samotná pravidla:

    parallel-mask.sh -C "ann2standoff -c ../../ann2standoff.ini -p rules -P none" -m ".*\.vrt$" -v -p45 -d.
  • Zabalení hotových souborů k odeslání:
    cd vert-prislovi-kolok-CNK
    tar czvf /cnk/work/korpusy/SYNv13/<korpus>-vrt.tgz *.vrt
    tar czvf /cnk/work/korpusy/SYNv13/<korpus>-ann.json.tgz *.ann.json
    tar czvhf /cnk/work/korpusy/SYNv13/<korpus>-txt.tgz *.txt
    tar czvhf /cnk/work/korpusy/SYNv13/<korpus>-json.tgz $(ls *.json | grep -v "ann.json$")

    anebo

    tar czvf /cnk/work/korpusy/SYNv13/SYN2020-vrt.tgz *.vrt; tar czvf /cnk/work/korpusy/SYNv13/SYN2020-ann-json.tgz *.ann.json; tar czvhf /cnk/work/korpusy/SYNv13/SYN2020-txt.tgz *.txt; tar czvhf /cnk/work/korpusy/SYNv13/SYN2020-json.tgz $(ls *.json | grep -v "ann.json$")
    tar czvf /cnk/work/korpusy/SYNv13/NEWTON2020-vrt.tgz *.vrt; tar czvf /cnk/work/korpusy/SYNv13/NEWTON2020-ann-json.tgz *.ann.json; tar czvhf /cnk/work/korpusy/SYNv13/NEWTON2020-txt.tgz *.txt; tar czvhf /cnk/work/korpusy/SYNv13/NEWTON2020-json.tgz $(ls *.json | grep -v "ann.json$")
  • Odeslání:<code>rsync -avz *.tgz trnka:/cnk/work/korpusy/<korpus>/</code>

Výroba vlastních korpusů

  • Příprava souborů pro vlastní korpus:
    cd .../vert-corr
    parallel-mask.sh -C "standoff2xml" -m ".*\.txt$" -v -p45 -d.

    s FRANTOU:

    for ff in *.ann.xml; do gg=${ff%.ann.xml}.txt; xml2vrt -c ../../../Frazeologie/ann2standoff.ini -p cnk2020lemur $ff | perl -pe "s/^(<doc) .*>$/\1 id=\"$gg\">/"; done > /cnk/common/korpus/vertikaly/NEWTON2023/vertikala

    s FRANTOU a Lemurem:

    for ff in *.ann.xml; do gg=${ff%.ann.xml}.txt; xml2vrt -c ../../../Frazeologie/ann2standoff.ini -p frantalemur $ff | perl -pe "s/^(<doc) .*>$/\1 id=\"$gg\">/"; done > /cnk/common/korpus/vertikaly/NEWTON2023/vertikala

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