Table of Contents
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ěhuproces_<skript>.log
. Staré verzeerrlog
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:
pů
vod
š
kol
-
(konfi
-gurátor
podleofi
-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ářiorig
. Žá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ářein-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 jevert-rules-mdita-sublm-agr
. Zachovají se tyto adresáře s mezivýsledky:vert-morf-simp-nosp-sgcr-con
— nutné pro závěrečné úpravyvert-vrbtg8
— výsledek morfologické analýzyvert-rules
— výsledek pravidelvert-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 tokenizacevert-morf-simp
— morfologievert-morf-simp-nosp
— vyznačení (ne)mezer a odstavců podle holého textuvert-morf-simp-nosp-sgcr
— opravená segmentacevert-morf-simp-nosp-sgcr-con
— opravená tokenizacevert-morf-simp-nosp-sgcr-con-sublm
— dodaná sublemmatavert-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:
- Počet zpracovaných souborů
- Korektnost řádků včetně tagů
- Úplnost souborů
- 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 soubormissing-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í programuvert2vertbar.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