====== Výroba korpusu SYN2020 a dalších ve stejném formátu a stejnými nástroji ======
* Pracujeme v ''UTF-8'' a převážně ve vertikále.
* Vstup dostáváme v XML, musíme si ho převést na plain text Pavlovým (Vondřičkovým) programem.
* Na morfologii používáme ''morfflex'' s našimi vylepšeními.
* Pravidla používají 23-místný tag.
* Po pravidlech vše dorazíme ''MorphoDiTou''.
* U vybraných korpusů ještě provedeme syntaktickou analýzu a/nebo frazeologii.
* Na závěr dodáme sublemmata, ošetříme agregáty a provedeme některé jednoduché opravy.
* Výsledek je buď zcela bez mark-up (pro ČNK), nebo s úplným mark-upem (pro Bonito).
===== Přípravná fáze =====
==== Příprava korpusu z Tomášových dat ====
=== Cvičný SYN2015 ===
* data u Tomáše: ''~tomas/syn2020/vert-bonito''
* data u mě: ''~/PROJEKTY/INFRASTRUKTURA/syn2020/vert-SYN2015''
* převod od Tomáše do formátu s mark-upem:cd ~tomas/syn2020/vert-bonito
for ff in *; do echo $ff; ~/PROJEKTY/INFRASTRUKTURA/syn2020/bin/add-struct.pl $ff < $ff \
> ~/PROJEKTY/INFRASTRUKTURA/syn2020/vert-SYN2015/$ff; done
* vytvoření korpusu:cd ~/PROJEKTY/INFRASTRUKTURA/syn2020
manatee-registry.sh -c. -f vert-SYN2015 -C
config:
PATH /net/chomsky/store/manatee-registry/syn2020-SYN2015-data
ENCODING utf-8
INFO "Korpus SYN2015 s tokenizací a značkováním pro SYN2020, 20.6.2020"
ATTRIBUTE word {
TYPE "FD_FGD"
}
ATTRIBUTE space {
TYPE "FD_FGD"
}
ATTRIBUTE lemma {
TYPE "FD_FGD"
MULTIVALUE y
MULTISEP " "
}
ATTRIBUTE sublemma {
TYPE "FD_FGD"
MULTIVALUE y
MULTISEP " "
}
ATTRIBUTE tag {
TYPE "FD_FGD"
MULTIVALUE y
MULTISEP " "
}
ATTRIBUTE verbtag {
TYPE "FD_FGD"
MULTIVALUE y
MULTISEP " "
}
ATTRIBUTE clspstpos {
TYPE "FD_FGD"
MULTIVALUE y
MULTISEP " "
}
STRUCTURE doc {
ATTRIBUTE name
}
STRUCTURE p
STRUCTURE s
===== Ostrá fáze =====
==== Odstranění XML značek ====
* Stejně jako u SYNv8
* Již nenahrazujeme chybějící emaily a url entitami. Nejdřív je třeba dostat do textů entity ''&url;'' a ''&email;'' a odlepit ''<'' a ''>'' od okolních slov:
* Skript na odstranění XML značek je u nás umístěn v ''/usr/local/corp/xml2standoff'' (na grimmovi).
* Nejnovější verze je na trnkovi v adresáři ''/cnk/common/tools/xml2standoff''.
* Jako vstup očekává příponu ''.xml''.
* ''XML'' -> plain text:for ff in *.xml; do echo $ff; python3 xml2standoff.py $ff; done
Nebo paralelně:
parallel-mask.sh -C xml2standoff.py -d . -m ".*\.xml$" -p45 -v
Kromě ''.xml'' souborů dostaneme ''.txt'' (plain text) a ''.json''.
==== process_text.sh ====
* Skript pro celý proces:
* Morfologie
* [Pravidla]
* MorphoDiTa
* Závěrečné úpravy (vzájemně se vylučující):
* Sublemma, agregáty a závěrečné opravy po MorphoDitě
* ''mdita-correct'' a ''conllu-in''
* Sublemma, agregáty a závěrečné opravy po syntaxi
* Úprava mark_upu
=== Vstupní data ===
* XML soubory jsou uložené v adresáři ''orig'', extrahované ''.txt'' soubory jsou zkopírované do ''in-utf8''
* Neprovádíme doplňování ''&email;'' a ''&url;''
=== Přepínače ===
* Skript ''process_text.sh'' používá tyto přepínače:
-a add structures to the final corpus instead of removing them
-D debug; save all intermediate results
-h print this help and exit
-l add 8 positions to tag (for LanGR - default)
-L LanGR mode: in-utf8 is created from STDIN input
intermidiate results and errors are saved in /tmp or work_dir
result is sent to STDOUT
do not use existing corp_dir as work_dir---it will be ERASED!
-m add 6 positions to tag (for MDiTa)
-n no syntax: script remove_structures doesn't expect synt columns
-p number of parallel threads; default is 1
-s start the process in one of these dirs:
in-utf8 (default)
vert
[vert-]morf
[vert-morf-]simp
[vert-morf-simp-]nosp
[vert-morf-simp-nosp-]sgcr
[vert-morf-simp-nosp-sgcr-]con
[vert-morf-simp-nosp-sgcr-con-]sublm
[vert-]vrbtg8
[vert-]rules
[vert-rules-]mdita
[vert-rules-mdita-conllu-]out
-t stop the process in one of these dirs (targets):
[vert-]vrbtg8
[vert-]rules
[vert-rules-]mdita
[vert-rules-mdita-sublm-]agr (default)
[vert-rules-mdita-conllu-]in
-v be verbose: print the names of processed files, etc.
* Typické použití přepínačů pro různé průběhy:
* Začni v ''in-utf8'', proveď morfologii, pravidla, Mditu a závěrečné úpravy s finálními opravami a odstraněním mark-upu:
process_text.sh -p45 -v
* Začni výsledkem Mdity (před kterou běžela pravidla), připrav vstup pro syntax:
process_text.sh -p45 -v -s mdita -t in
* Začni v ''in-utf8'', bez pravidel, připrav vstup pro syntax:
process_text.sh -p45 -v -m -t in
* Proveď závěrečné úpravy po syntaxi:
process_text.sh -p45 -v -s out
* Spusť skript jako filtr, pouze morfologii, zachovej mezikroky (používá se ve webovém rozhraní):
process_text.sh -L -D
=== Kontroly a finální úpravy pro předání ===
* Provádíme 3 druhy kontrol:
* ''no_space_after_token_morphanal.pl''
* kontrolu syntaktické správnosti řádků a tagů
* Vondřičkův skript
== Kontroly ==
* ''no_space_after_token_morphanal.pl'':cd vert-final
for ff in *; do no_space_after_token_morphanal.pl ../in-utf8/$ff /dev/null < $ff > /dev/null; done
* syntaktická správnost:
parallel-filter.sh -C check-vert-tag-v2020.pl -n -p10 -s vert-rules
== Finální úpravy a kontrola Vondřičkou ==
* Vytvoříme adresář ''CNK'', do kterého zkopírujeme hotové soubory a přejmenujeme je na ''.vrt'':mkdir CNK
cd vert-final
for ff in *.txt; do cp -p $ff ../CNK/${ff%.txt}.vrt; done
cd ../CNK
for ff in *.vrt; do ln -s ../orig/${ff%.vrt}.txt
for ff in *.vrt; do ln -s ../orig/${ff%.vrt}.json
* Kontrola Vondřičkou:cd CNK
parallel-mask.sh -C vrt2standoff.py -m ".*\.vrt$" -v -p45 -d.
* Soubory, které mají ''.vrt.json'', se mohou odeslat.
==== Korpus SYN2020_predvyber-sublemma ====
* Korpus obsahuje ''word'', ''space'', ''lemma'', ''sublemma'', ''tag'' a ''verbtag''
* Použije se Tomášův program ''~tomas/syn2020/bin/Tools/priprav_morfanal_pro_bonito.pl'':
cd /store/corp/SYNv9/SYN2020_predvyber/vert-morf-simp-nosp-sgcr-con-sublm-vrbtg8-rules
for ff in *; do echo $ff; \
~tomas/syn2020/bin/Tools/priprav_morfanal_pro_bonito.pl \
../vert-morf-simp-nosp-sgcr-con/$ff < $ff > ../bonito/$ff; done
==== Korpus SYN2020_predvyber-rules-MorphoDiTa, kontrola souborů pro ČNK ====
* Texty jsou na grimmovi v adresáři ''store/corp/SYNv9/SYN2020_predvyber''.
* Pustí se skript ''process_text_grimm.sh'', který provede morfologickou analýzu, pravidla z rootu a potom tagování MorphoDiTou.
* Výsledek, který je v adresáři ''vert-rules-mdita-sublm-agr'', se zbaví entit ''&email;'' a ''&url;'' a zkontroluje programem ''vrt2standoff.py'':cd vert-rules-mdita-sublm-agr
rm -f ../vert-CNK/*.vrt*
for ff in *; do echo $ff; perl -pe 's///' $ff | grep -vP "^?[gps]/?>$" | grep -v '&url;' | grep -v '&email;' > ../vert-CNK/${ff%.txt}.vrt; done
a potom se známým způsobem zkontrolují soubory (''.txt'' a ''.json'' musí být z adresáře ''../orig''):cd ../vert-CNK
parallel-mask.sh -C "vrt2standoff.py" -m ".*\.vrt$" -v -p40 -d.
Ty, které prošly, se převedou do formátu pro ''manatee-registry.sh'' tímto příkazem:
for ff in *.vrt.json; do echo $ff; echo "" | cat - ../vert-rules-mdita-sublm-agr/${ff%.vrt.json}.txt \
| cat - <(echo "") | grep -v "&(url|email);" > ../vert-rules-MorphoDiTa/${ff%.vrt.json}; done
* Korpus se pak vyrobí příkazem
manatee-registry.sh -c. -f vert-rules-MorphoDiTa -C
==== Vertikály pro ČNK ====
* Odevzdáváme soubory z adresáře ''vert-rules-mdita-sublm-agr'', ale jenom ty, které prošly skriptem ''vrt2standoff.py'':
cd vert-CNK
for ff in *.vrt.json; do ln -s ../vert-rules-mdita-sublm-agr/${ff%.vrt.json}.txt ../vert-CNK-odeslat/${ff%.json}; done
* Provedeme kontrolu, jestli něco není ukousnuté. Buďcd vert-rules-mdita-sublm-agr
nebocd vert-CNK-odeslat
Podle toho, jestli kontrolujeme všechno, nebo jenom to, co prošlo Vondřičkou. Potom:
rm ../vert-CNK-corr/*
for ff in *; do echo $ff; perl -pe 's///' $ff | grep -vP "^?[gps]/?>$" > ../vert-CNK-corr/${ff%.txt}.vrt; done
cd ../vert-CNK-corr
ls *.vrt | parallel -j 45 "cat {} | no_space_after_token_morphanal.pl ../orig/{.}.txt /dev/null > /dev/null" 2>../errlog/short-files.log
for ff in $(cut -c 6- ../errlog/short-files.log | cut -f1 -d':'); do echo $ff; rm ../vert-CNK-odeslat/${ff%.txt}.vrt; done
* Seznam ukousnutých vyrobíme takto:cd ../errlog
cut -c6- short-files.log | cut -f1 -d':' | sort > short-files.lst
* Všechny vadné zkopírujeme do adresáře pro opravu:cd ../in-utf8
for ff in $(comm -3 <(ls) <(ls ../vert-CNK-odeslat/ | perl -pe 's/\.vrt/.txt/')); do cp -p $ff ../../SYN2020_oprava/in-utf8/; done
===== Zmrazené a distribuční verze =====
==== Zmrazená verze ====
* Soupis programů a souborů, které jsou zapotřebí pro běh zmrazené verze
* Vytvoření zmrazené verze
* Program
* Kontroly
* Spouštění zmrazené verze
==== Distribuční verze ====
Programy se dají distribuovat na systémy, které splňují následující SW požadavky:
* Perl
* List/MoreUtils.pm
* Python3
* numpy
* tensorflow
* parallel
* Nainstalovaná MorphoDiTa
Distribuce se provádí v zazipovaném souboru, který vznikne spuštěním programu ''make-ver2020-distr.sh'' v adresáři se zmrazenou verzí:
cd /usr/local/syn2020/versions/202105
make-ver2020-distr.sh
Archiv ''disamb-2020-distr-202105.zip'' se zkopíruje na vzdálený stroj a rozbalí do adresáře, ve kterém má být umístěn celý balík. Potom se spustí program ''set-env.sh'':cd distr_home/202105
bin/set-env
a objeví se hláška
Put .versyn2020.rc to your HOME and use the command
bash --rcfile ${HOME}/.versyn2020.rc
Ještě je třeba zkontrolovat, jestli se správně přepsal soubor ''options.json'':
lh syn2020/morphodita-research/models/Current_Model/options.json
Pro běh programu je třeba nastavit prostředí a v případě, že lokální instalace MorphoDiTy vyžaduje ještě vlastní nastavení, je třeba spustit i to. Na ''sag.korpus.cz'' je tosource /usr/local/morphodita-research/env/bin/activate