Column Type Comment
id char(100)
author char(255)
title char(255)
subtitle char(255)
publisher char(200)
pubplace char(100)
pubyear char(4)
issue char(100)
first_published char(4)
isbnissn char(100)
translator char(100)
medium char(100)
srclang char(20)
txtype char(100)
genre char(100)
audience char(100)
date char(100)
media_type char(100)
resource char(255)
subcorpus char(20)
t.id char(100)
t.author char(255)
t.title char(255)
t.resource char(255)
Každý dokument má jeden tag ''
text...
...
anebo
text...
...
Tag ''cd source
source2xml-tot.pl ../../../databaze/totalita.csv .
nebocd source-text
source2xml-tot.pl -t ../../../databaze/totalita.csv .
V adresáři přibudou soubory ''.xml'', které přesuneme do adresáře ''orig'':mv *.xml ../../orig/
==== Subkorpus SYN2020 ====
Zdrojáky jsou umístěny v adresáři ''/cnk/work/skoumal/Frazeologie/SYN2020''
Anotace se provádí v adresáři ''/home/skoumal/PROJEKTY/GACR2426/zdroje/subkorp_syn2020''.
=== Metadata ===
Metadata jsou vytažena z vertikály: ''/cnk/common/korpus/vertikaly/syn2020/vertikala'' pomocí programu:
cd ~/PROJEKTY/GACR2426/zdroje/subkorp_syn2020/metadata
meta-syn2020.pl < /cnk/common/korpus/vertikaly/syn2020/vertikala > vertikala.tsv
Nová tabulka v ''Admineru'' se vyrobí tak, že se exportuje tabulka ''totalita'', vybere se začátek:
SET NAMES utf8;
SET time_zone = '+00:00';
SET foreign_key_checks = 0;
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
SET NAMES utf8mb4;
DROP TABLE IF EXISTS `totalita`;
CREATE TABLE `totalita` (
`id` char(100) NOT NULL,
`author` char(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_nopad_ci NOT NULL,
`title` char(255) NOT NULL,
`subtitle` char(255) NOT NULL,
`publisher` char(200) NOT NULL,
`pubplace` char(100) NOT NULL,
`pubyear` char(4) NOT NULL,
`issue` char(100) NOT NULL,
`first_published` char(4) NOT NULL,
`isbnissn` char(100) NOT NULL,
`translator` char(100) NOT NULL,
`medium` char(100) NOT NULL,
`srclang` char(20) NOT NULL,
`txtype` char(100) NOT NULL,
`genre` char(100) NOT NULL,
`audience` char(100) NOT NULL,
`date` char(100) NOT NULL,
`media_type` char(100) NOT NULL,
`resource` char(255) NOT NULL,
`subcorpus` char(20) NOT NULL,
`t.id` char(100) NOT NULL,
`t.author` char(255) NOT NULL,
`t.title` char(255) NOT NULL,
`t.resource` char(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
a uloží se do souboru ''MySQL.txt''. V editoru se přepíše ''totalita'' na nové jméno a SQL příkaz se provede příkazem ''Import'' (v levém menu). Následně se tabulka vybere a provede se import dat ze souboru ''vertikala.tsv''.
Metadata jsou uložena v databázi ''Adminer'' a byly v nich provedeny drobné opravy:
* chybně uvedený jazyk
Po provedené oprav se metadata exportují příkazem Export ve formátu TSV do souboru ''syn2020.csv.gz''.
=== Data ===
Zdrojové texty pocházejí jednak z kolekce ''SYN2020'' (1621 souborů) a jednak z kolekce ''NEWTON2019'' (2289 souborů)
Soubory jsou rozděleny do adresářů ''.../subkorp_syn2020/author/'' a ''.../subkorp_syn2020/noauthor/'' podle toho, jestli mají ''texty'' různé autory nebo ne. Adresář ''noauthor'' se shoduje se soubory z kolekce ''SYN2020'' -- jde o knihy, u kterých je autor uveden v tagu ''cd metadata
cut -f1 ../db0401.tsv > title
cut -f2 ../db0401.tsv > subtitle
cut -f3 ../db0401.tsv > author
cut -f4 ../db0401.tsv > issue
cut -f5 ../db0401.tsv > publisher
cut -f6 ../db0401.tsv > pubplace
cut -f7 ../db0401.tsv > pubyear
cut -f8 ../db0401.tsv > first_published
cut -f9 ../db0401.tsv > translator
cut -f10 ../db0401.tsv > srclang
cut -f11 ../db0401.tsv > authsex
cut -f12 ../db0401.tsv > transsex
cut -f13 ../db0401.tsv > txtype_group
cut -f14 ../db0401.tsv > txtype
cut -f15 ../db0401.tsv > genre_group
cut -f16 ../db0401.tsv > genre
cut -f17 ../db0401.tsv > medium
cut -f18 ../db0401.tsv > periodicity
cut -f19 ../db0401.tsv > audience
cut -f20 ../db0401.tsv > isbnissn
cut -f21 ../db0401.tsv > biblio
cut -f22 ../db0401.tsv > syn
cut -f23 ../db0401.tsv > id
Je třeba dodat ještě soubor ''empty'' obsahující jenom tabulátor.
Tyto hodnoty se použijí pro nové hlavičky souborů:cd metadata
paste id author title subtitle publisher pubplace pubyear issue first_published isbnissn translator medium srclang txtype genre audience empty empty empty empty empty empty empty empty > ../syn-pub.meta
Je třeba ještě doplnit záhlaví s atributy:date media_type resource subcorpus t.id t.author t.title t.resource
a dát prázdné hodnoty do uvozovek:perl -i.bak -pe 's/\t\t/\t""\t/g' syn-pub.meta
perl -i.bak -pe 's/\t\t/\t""\t/g' syn-pub.meta
perl -i.bak -pe 's/\t$/\t""/' syn-pub.meta
Opravený soubor zkopírujeme do adresáře ''~/cnk-work/Frazeologie/SYN-pub'', kde anotujeme korpus:
cp -p syn-pub.meta ~/cnk-work/Frazeologie/SYN-pub/
=== Oprava hlaviček ve zdrojových souborech ===
Pracujeme v adresáři ''~/cnk-work/Frazeologie/SYN-pub/''.
Je třeba odstranit první řádku (''%%%%'') a opravit řádek ''%%cd archive
for ff in *.xml; do gg=${ff%.xml}; echo $gg; \
grep -v '( \n\1/g" | perl -pe 's/>
\n/cd quasi-xml
for ff in *; do echo $ff; ~/bin/totalita/add-textattr.pl < $ff > ../source-text/$ff; done
* Převedeme texty do XML formátu se správnými hlavičkami:
~/bin/totalita/source2xml-tot.pl -t syn-pub.meta source-text/ orig/ xml
==== Subkorpus ONLINE ====
=== Aktuální ONLINE ===
Existuje verze s "našimi" hlavičkami ve vertikále. Ta se zpracovává jako starý ONLINE (viz níže).
Zdroje k aktuálnímu ''ONLINE'' jsou umístěny v adresáři ''/cnk/common/korpus/zdroje/monitora'' a jsou uloženy jako ''JSON''.
* Na strojích ''chomsky'', ''trnka'' a ''lovelace'' existují programy na jejich převedení do ''XML''.
* Každý stroj má vlastní adresář s pythonovskými moduly a vlastní nastavení v ''.bashrc_profile'' nebo ''.profile'':
* ''chomsky'':PATH=/home/skoumal/bin/local_python/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/syn2020/bin:/usr/local/syn2020/xml2standoff:/home/skoumal/bin
PYTHONPATH=/home/skoumal/bin/local_python/lib/python3.10/site-packages
* ''trnka'':PATH=/home/skoumal/local_python/bin:/home/skoumal/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/go/bin
PYTHONPATH=/home/skoumal/local_python/lib/python3.8/site-packages
* ''lovelace'':PATH=/home/skoumal/local_python/bin:/cnk/local/ssd/vitovec/lemurizer/target/release:/home/skoumal/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
PYTHONPATH=/home/skoumal/local_python/lib/python3.8/site-packages
* Program ''read_json_keys.py'' vypíše metainformace:python ~/.local/bin/totalita/read_json_keys.py < 2024-01-21.json
* Program ''read_json.py'' převede ''JSON'' na ''XML'':cd .../Monitora
ls *.json | parallel -j100 "json2xml.sh < {} > /cnk/work/skoumal/Frazeologie/Monitora/orig/{.}.xml"
=== Starý i nový ONLINE ve vertikále ===
Je uložen pouze v adresáři ''/cnk/common/korpus/vertikaly/online_old'', resp. ''/cnk/common/korpus/vertikaly/monitora''.
Usage: pick-doc-online.pl type typval [out_dir]
types: date pubyear media_type source resource txtype_group txtype genre_group genre medium cnk_crawl_date id
* Antisystémové weby vybereme takto:cd .../Online
mkdir -p Antisyst/zdroj
cd zdroj
cat vert_20* | pick-doc-online.pl media_type Antisystémové ../Antisyst/zdroj
cd ../Antisyst/zdroj
for ff in *; do mv $ff ${ff}.xml; done
* Odstraníme slovenské soubory:cd zdroj
grep "[ĺľŕ]" *.xml | grep -v "Biľak" | cut -f1 -d ':' | sort -u > ../slovak-letters.txt
grep -Pl "^sa\t" *.xml > ../slovak-sa.txt
..
sort -u slovak-letters.txt slovak-sa.txt > slovak-files.txt
cd zdroj
for ff in $(cat ../slovak-files.txt); do echo $ff; rm $ff; done
* V některých souborech je ''e-breve'' (**ĕ**) místo ''e-caron'' (**ě**). Opravíme je takto:cd zdroj
fgrep -l ĕ * > ../breve.txt
..
perl -i -pe 's/\.xml$//' breve.txt
for ff in $(cat ../breve.txt); do echo $ff; perl -i -pe 's/ĕ/ě/g' $ff.xml; done
* Přepíšeme ''&'' na ''&'':cd zdroj
fgrep -l "&" * > ../ampersand.txt
for ff in $(cat ../ampersand.txt); do echo $ff; perl -i -pe 's/&/&/g' $ff; done
* Vyrobíme ''.xml'' soubory:cd .../Online/Antisyst/zdroj
parallel-filter.sh -C "perl -pe 's:^([^\t]+)\t[^\t]+\t[^\t]+$:\1 :g' | perl -pe 's/ \" ([^\"]+) \" / "\1" /g' \
| perl -pe 's: ([,\.\)\;\!\?\:]):\1:g' | perl -pe 's:( \() :\1:g' | perl -pe 's: $:\n:'" -p50 -s . -t ../orig -v
cd source
for ff in *.vrt; do echo $ff; remove-dupl-text.pl ${ff%.vrt} < $ff > ../source-nodupl/${ff%.vrt}
nebo paralelně
ls *.vrt | parallel -j40 "echo {}; remove-dupl-text.pl {.} < {} > ../source-nodupl/{.}"
* Soubory v ''/home/skoumal/PROJEKTY/GACR2426/zdroje/subkorp_online/online_old/source[-nodupl]'' naporcujeme na jednotlivé docy pomocí programu ''splitdoc-xml'':cd .../source
for ff in vert_2020-*; do splitdoc-xml ${ff%.vrt} < $ff; done
nebo paralelně
ls -S | parallel -j40 "splitdoc-xml {} < {}"
a hotové soubory přesuneme do ''source-split''. Je-li souborů moc, uděláme několik adresářů a přesouvíme podle ročníku:cd source-nodupl
for ff in 2021*.?????; do mv $ff ../source-split-2021/; done
for ff in 2022*.?????; do mv $ff ../source-split-2022/; done
for ff in 2023*.?????; do mv $ff ../source-split-2023/; done
for ff in 2024*.?????; do mv $ff ../source-split-2024/; done
for ff in 2025*.?????; do mv $ff ../source-split-2025/; done
* Vybereme typ textu (např. Antisyst) a vyrobíme si seznamy:cd .../source-split-2021
ls | xargs grep -l "media_type=\"Antisyst" - > ../2021-Antisyst.txt
cd ../source-split-2022
ls | xargs grep -l Antisyst - > ../2022-Antisyst.txt
cd ../source-split-2023
ls | xargs grep -l Antisyst - > ../2023-Antisyst.txt
cd ../source-split-2024
ls | xargs grep -l Antisyst - > ../2024-Antisyst.txt
cd ../source-split-2025
ls | xargs grep -l Antisyst - > ../2025-Antisyst.txt
* Přesuneme vybraný typ do zvláštního adresáře a zároveň do hlaviček připíšeme počet tokenů a slov:
cd .../monitora
mkdir Antisyst
cat 2021-Antisyst.txt | parallel -j45 'echo {}; tok=$(grep -c -v "^<" source-split-2021/{}); \
wrd=$(grep -v "^<" source-split-2021/{} | grep -cv -P "\tZ[0:]-------"); \
sed "1s/>$/ word_count=\"$wrd\" token_count=\"$tok\">/" < source-split-2021/{} > Antisyst/{}'
cat 2022-Antisyst.txt | parallel -j45 'echo {}; tok=$(grep -c -v "^<" source-split-2022/{}); \
wrd=$(grep -v "^<" source-split-2022/{} | grep -cv -P "\tZ[0:]-------"); \
sed "1s/>$/ word_count=\"$wrd\" token_count=\"$tok\">/" < source-split-2022/{} > Antisyst/{}'
cat 2023-Antisyst.txt | parallel -j45 'echo {}; tok=$(grep -c -v "^<" source-split-2023/{}); \
wrd=$(grep -v "^<" source-split-2023/{} | grep -cv -P "\tZ[0:]-------"); \
sed "1s/>$/ word_count=\"$wrd\" token_count=\"$tok\">/" < source-split-2023/{} > Antisyst/{}'
cat 2024-Antisyst.txt | parallel -j45 'echo {}; tok=$(grep -c -v "^<" source-split-2024/{}); \
wrd=$(grep -v "^<" source-split-2024/{} | grep -cv -P "\tZ[0:]-------"); \
sed "1s/>$/ word_count=\"$wrd\" token_count=\"$tok\">/" < source-split-2024/{} > Antisyst/{}'
cat 2025-Antisyst.txt | parallel -j45 'echo {}; tok=$(grep -c -v "^<" source-split-2025/{}); \
wrd=$(grep -v "^<" source-split-2025/{} | grep -cv -P "\tZ[0:]-------"); \
sed "1s/>$/ word_count=\"$wrd\" token_count=\"$tok\">/" < source-split-2025/{} > Antisyst/{}'
* Soubory je třeba ještě přejmenovat a zároveň změnit ''doc.id'' na nový název souboru. Výsledek bude v adresáři ''source-rename''. Dále už pracujeme v něm.
* Je třeba vytahat z dokumentů metainformace pro databázi. Metainformace z tagu ''cd .../xml-anti
for ff in *.xml; do perl -pe 's/( &symbol;)+([ ,\.\!\?;\)])/$2/g' $ff \
| perl -pe 's/^&symbol; //' > ~/cnk-work/Frazeologie/Online/Antisyst-slovak/orig-mix/$ff; done
* Dále je třeba odpreparovat slovenské texty. K tomu slouží program ''remove-slovak.pl'':cd .../orig-mix
ls -S | parallel --compress --tmpdir /store/tmp/ -j40 "echo {}; remove-slovak.pl {} ../orig ../orig-slovak < {}"
anebo metoda ŽAVES
cd .../Antisyst
grep -v "(Biľak|Ľubo)" * | grep "[ľĺŕô]" | cut -f1 -d':' | sort -u > ../slovak.txt
for ff in $(cat ../slovak.txt); do rm $ff; done
* Z xml-vertikál je zapotřebí udělat klasické ''XML'', ze kterého budeme dělat ''in-utf8'':cd .../orig-vrt
cut -f1 zvedavec.org_2022-02-26.xml | tr "\n" " " | perl -pe "s:
* Obojí se dělalo v adresáři ''/home/skoumal/cnk-work/Frazeologie/Online'', je třeba to
process_kolok.sh -s vert-kolok -v -p40
* Chceme-li přidat pro porovnání anotaci LEMURem, provedeme [[wiki:user:skoumal:tacr23#anotace_lemurem|lemurizaci]] na výsledné vertikále. Musíme ale utrhnout anotaci kolokací (musíme vytvořit adresář ''vert-kolok-merged''):
mkdir -p mwe-in
mkdir -p mwe-out
parallel-filter.sh -C "cut -f1-6" -s vert-rules0-frazrl-rules-mdita-kolok-sublm-agr/ -t mwe-in/ -p100 -v
mwe_tagger -b -i mwe-in -o mwe-out -c -n 100 -t -m /cnk/work/skoumal/LEMUR/model-250321.msgpack
cd vert-rules0-frazrl-rules-mdita-kolok-sublm-agr
for ff in *; do echo $ff; paste <(cut -f1-6 $ff) <(cut -f7 $ff) <(cut -f8 $ff) <(cut -f7- ../mwe-out/$ff) \
| perl -pe 's/[\t]+$//' > ../vert-kolok/${ff%.txt}.vrt; done
nebo paralelně:
ls | parallel -j100 "echo {}; paste <(cut -f1-6 {}) <(cut -f7 {}) <(cut -f8 {}) <(cut -f7- ../mwe-out/{}) \
| perl -pe 's/[\t]+$//' > ../vert-kolok/{.}.vrt"
* Dále použijeme Vondřičkovy skripty. Musíme si ale připravit vlastní konfigurační soubor:
cp -p /usr/local/corp/xml2standoff/ann2standoff.ini .
a do něj přidat tyto řádky:
[frantalemur]
attributes = sword,lemma,sublemma,tag,verbtag,col_lemma,col_type,mwe_lemma
Pak můžeme použít skripty: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 /cnk/work/skoumal/LEMUR/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 /cnk/work/skoumal/LEMUR/ann2standoff.ini -p frantalemur -g g $ff; done \
> /cnk/common/korpus/vertikaly/frap-totalita/vertikala
* Anotace Frantou se dělá stejně [[wiki:user:skoumal:infra:process_text_run|jako u SYNů]].
* Anotace LEMURem je posána [[wiki:user:skoumal:tacr:lemurizer|na stránce TAČRu]].
===== Kompilace korpusu =====
* Předpokládáme, že máme anotovaný text a správné hlavičky (s naší sadou metadat).
* Je potřeba nachystat data do jednoho adresáře a potom udělat tyto kroky:
cd columns
for ff in *.7; do paste ${ff%.7}.1-6 $ff ${ff%.7}.8 ${ff%.7}.9 | perl -pe 's/[\t]+$//' > ../vert-final/${ff%.txt.7}.vrt; done
cd vert-rules0-frazrl-rules-mdita-kolok-sublm-agr
for ff in *; do echo $ff; paste ../mwe-in/$ff <(cut -f 7 $ff) <(cut -f 8 $ff) <(cut -f 7- ../mwe-out/$ff) > ../vert-kolok/${ff%.txt}.vrt; done
nebo paralelně:
ls | parallel -j100 "echo {}; paste ../mwe-in/{} <(cut -f 7 {}) <(cut -f 8 {}) <(cut -f 7- ../mwe-out/{}) > ../vert-kolok/{.}.vrt"
* Udělat linky:cd .../vert-kolok
for ff in *.vrt; do ln -s ../orig/${ff%.vrt}.txt; done
for ff in *.vrt; do ln -s ../orig/${ff%.vrt}.json; done
for ff in *.vrt; do ln -s ../orig/${ff%.vrt}.xml; done
* Vyrobit ''.ann.json'' z anotace:cd .../vert-kolok
parallel-mask.sh -C "ann2standoff -c /cnk/work/skoumal/LEMUR/ann2standoff.ini -p frantalemur -P none" -m ".*\.vrt" -v -p45 -d.
* Vyrobit ''.ann.xml'':parallel-mask.sh -C "standoff2xml" -m ".*\.txt$" -v -p45 -d.
* Vyrobit vertikálu:mkdir /cnk/common/korpus/vertikaly/frap-synv13-pub
(for ff in *.ann.xml; do >&2 echo $ff; xml2vrt -c /cnk/work/skoumal/LEMUR/ann2standoff.ini -p frantalemur -e hi $ff; done \
> /cnk/common/korpus/vertikaly/frap-synv13-pub/vertikala) 2> ../xml2vrt.err
===== Statistiky =====
==== Četnost kolokačních lemmat ====
Vytvoříme frekvenční seznamy v různých korpusech (viz [[https://jakobson.korpus.cz/dokuwiki/doku.php?id=frape:start|web projektu]]). Seznamy uložíme jako ''CSV'' a vytvoříme čisté (bez uvozovek) ''TSV''.
* Seznamy pro porovnání vytvoříme takto:
join -e0 -a1 -a2 -t " " <(sort kolokace-Totalita-240509.tsv) -o auto <(sort kolokace-SYN2020-240509.tsv) \
| join -e0 -a1 -a2 -t " " - -o auto <(sort kolokace-Antisyst-240509.tsv) > kolokace-join-240509.tsv
* Import do spreadsheetu:
* zaškrtnout oddělovač ''TAB''
* vybrat češtinu
* záhlaví:
Totalita SYN2020 Antisyst
col_lemma freq ipm freq ipm freq ipm
* oddělit záhlaví v LibreOffice: vybrat první buňku s daty a z menu vybrat ''View'' ---> ''Freeze Rows and Columns''
* sloupce s čísly zformátovat //česky//
* buňky s chybějící hodnotou vyplnit **0** (kvůli sortění)