====== 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_.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 -p45Zkontrolujeme provedené opravy: sort -u stat_repair.txt | perl -pe 's/

//' | perl -pe 's:

?::' | 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 -rnebo 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'' 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; doneanebo 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 -vDefaultní 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 -vpokud 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-utf8a 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//]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 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; donenebo paralelně parallel-filter.sh -C "check-vert-tag-v2020.pl -k -t -l21" -n -s vert-rules0-frazrl-rules-mdita-kolok -p45Nebo po pravidlech parallel-filter.sh -C "check-vert-tag-v2020.pl" -n -s vert-rules0-frazrl-rules -p80Nebo po tagování: parallel-filter.sh -C "check-vert-tag-v2020.pl -t -l21" -n -s vert-rules0-frazrl-rules-mdita-correct -p80Nebo 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; donenebo 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 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 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:^$::' | grep -v \"^$\" | 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; doneanebo 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 -lnebo 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/-vrt.tgz *.vrt tar czvf /cnk/work/korpusy/SYNv13/-ann.json.tgz *.ann.json tar czvhf /cnk/work/korpusy/SYNv13/-txt.tgz *.txt tar czvhf /cnk/work/korpusy/SYNv13/-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í:rsync -avz *.tgz trnka:/cnk/work/korpusy// ===== 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/^($/\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/^($/\1 id=\"$gg\">/"; done > /cnk/common/korpus/vertikaly/NEWTON2023/vertikala