Zpracování je rozděleno do několika kroků. K jednotlivým krokům byly vytvořeny skripty zjednodušující práci pomocí jednotných argumentů a umožňují zpracování provádět na jednom stroji, nebo paralelně na více strojích.
Veškeré zdrojové texty programů a skripty jsou v repozitáři corpora_processing_sw a případné chybějící závislosti (knihovny) jsou v /mnt/minerva1/nlp/projects/corpproc.
Hledáte-li jinde, najdete obvykle staré nefunkční verze!
Skript umožňuje přerozdělit data (soubory) mezi dané servery. Data to rozděluje na základě jejich velikosti tak, aby všechny servery dostaly podobné množství dat. Přepínačem -a se přerozdělování vypne a každý soubor bude nakopírován na všechny servery. To je vhodné především k distribuci programů pro zpracování.
./processing_steps/1/distribute.py
Usage:
./distribute.py [-i INPUT_DIRECTORY] -o OUTPUT_DIRECTORY -s SERVER_LIST [-a] [-e ERRORS_LOG_FILE] -i --input vstupní adresář/soubor určený distribuci (pokud není nastaven jsou názvy souborů očekávány na stdin oddělené '\n') -o --output výstupní adresář na cílovém serveru, pokud adresář neexistuje, skript se jej pokusí vytvořit -a --all každý soubor bude zkopírován na všechny servery (vhodné pro skripty/programy) -s --servers soubor se seznamem serverů, kde na každém řádku je hostname jednoho stroje, pokud řádek obsahuje tabulátor, je brán jako oddělovač a jako hostname se bere jen text před ním (kvůli kompatibilitě tohoto konfiguračního souboru se skripty, u kterých je možné specifikovat počet vláken pro konkrétní stroj, tam je možný formát: HOSTNAME \t THREADS pro každý řádek) -e --errors pokud je nastaven jsou chyby logovány do tohoto souboru s aktuálním datem a časem
Například:
./distribute.py -i ~/data_to_distribution/ -o /mnt/data/project/data/ -s ~/servers # Všechny soubory z adresáře ~/data_to_distribution/ přerozdelí mezi servery, určenými souborem ~/servers. # Výstupním adresářem je /mnt/data/project/data/. Pokud adresář data na některém stroji neexistuje, pokusí se ho skript vytvořit. ./distribute.py -i ~/NLP-slave-0.0.1-SNAPSHOT-jar-with-dependencies.jar -o /mnt/data/commoncrawl/software/ -s ~/servers -a # Zkopíruje program NLP-slave na servery, určené souborem ~/servers. # Výstupním adresářem je /mnt/data/commoncrawl/software/. Pokud adresář software na některém stroji neexistuje, pokusí se ho skript vytvořit.
Pro extrakci čistého textu z Wikipedie slouží program WikiExtractor
Spouští se:
cd /mnt/minerva1/nlp/corpora_datasets/monolingual/english/wikipedia/ ./download_wikipedia_and_extract_html.sh 20151002
Skript v pracovním adresáři očekává soubor hosts.txt se seznamem serverů (1 na řádek), na kterých se má spustit
/mnt/minerva1/nlp/corpora_datasets/monolingual/english/wikipedia/tools/WikiExtractor.py
Výsledkem je sada cca 100MB souborů rozdělených na uvedené servery v /mnt/data/wikipedia/enwiki-.../html_from_xml/enwiki=...
Pro stažení WARC je potřeba znát označení CommonCrawlu, např. "2015-18"
./processing_steps/1b/download_commoncrawl/dl_warc.sh
stažené soubory jsou v:
/mnt/data/commoncrawl/CC-Commoncrawl_specification/warc/
pomocné soubory do:
/mnt/minerva1/nlp-2/download_commoncrawl/CC-Commoncrawl_specification/download/
Následně je možné vypočítat statistiku URI spuštěním:
./processing_steps/1b/uri_stats.sh
výsledek se uloží do:
/mnt/minerva1/nlp-2/download_commoncrawl/CC-Commoncrawl_specification/uri/
a na jednotlivých strojích jsou data v:
/mnt/data/commoncrawl/CC-Commoncrawl_specification/uri/
K získání url ze zadaného RSS zdroje slouží:
./processing_steps/1c/collect.py
Použití:
./collect.py [-i INPUT_FILE] [-o OUTPUT_FILE [-a]] [-d DIRECTORY|-] [-e ERRORS_LOG_FILE] -i --input vstupní soubor s RSS url oddělenými '\n' (pokud není nastaven jsou očekávány na stdin) -o --output výstupní soubor pro uložení vyparsovaných url (pokud není nastaven jsou tisknuty na stdout) -a --append výstupní soubor je v režimu přidávání -d --dedup deduplikace získávaných odkazů (podle shody url), volitelně může být zadána složka se soubory se seznamem již nasbíraných url, tyto url budou zahrnuty do deduplikace, v režimu -a je výstupní soubor táké zahrnut -e --errors pokud je nastaven jsou chyby logovány do tohoto souboru s aktuálním datem a časem
Například:
./collect.py -i rss -o articles -a # Do souboru articles přidá url z RSS zdrojů v souboru rss
Pro stažení webových stránek dle zadaného seznamu url a ukložení do WARC archívu slouží:
./processing_steps/1c/download.py
Usage:
./download.py [-i INPUT_FILE] -o OUTPUT_FILE [-e ERRORS_LOG_FILE] -i --input vstupní soubor s url (pokud není nastaven jsou očekávány na stdin) -o --output výstupní soubor pro uložení warc archívu -r --requsts limit počtu požadavků za minutu na jednu doménu (výchozí 10) -e --errors pokud je nastaven jsou chyby logovány do tohoto souboru s aktuálním datem a časem
Skript stránky nestahuje v pořadí podle vstupního souboru, ale, aby nedocházelo k "útokům", stahuje rovnoměrně podle domény. Zároveň je možné nastavit limit požadavků na doménu za minut. V případě že je limit vyčerpán u všech domén je stahování pozastaveno, než je limit obnoven. Limit se obnovuje každých 6s (1/10 minuty) a to na 1/10 celkového limitu.
Pokud dojde ke stahování k jakékoliv chybě (cokoliv kromě kódu 200), je celá doména vyřazena ze stahování.
Example:
./download.py -i articles -o today.warc.gz # Stáhne stránky jejichž url jsou v souboru articles do archívu today.warc.gz
Vstupem vertikalizátoru je soubor warc.gz, ze kterého se postupně vybalují jednotlivé záznamy, vyfiltruje se z nich HTML, vyfiltrují se neanglické články a provede se tokenizace. Zpracovat lze také 1 webovou stránku v .html a Wikipedii v předzpracovaném HTML. Výsledek je uložen s příponou vert do cílového adresáře.
Nový vertikalizátor:
./processing_steps/2/vertikalizator/main.py
Přeloží se příkazem:
make
Při překladu může nastat chyba s překladem justextu (aclocal.m4). V takovém případě je potřeba ve složce justextcpp/htmlcxx spustit příkazy:
touch aclocal.m4 configure Makefile.in ./configure
Na Salomonu můžou být potřeba moduly (některé z následujících nebo jejich závislostí):
module load OpenMPI/1.8.8-GNU-4.9.3-2.25 module load Autoconf/2.69 module load Automake/1.15 module load Autotools/20150215 module load Python/2.7.9 module load GCC/4.9.3-binutils-2.25
Pokud je navíc vyžadovaný LZMA komprimovaný WARC výstup, je nutné doinstalovat modul backports.lzma:
pip install --user backports.lzma
Při jeho instalaci může nastat chyba při kompilaci (na serveru není dostupná knihovna lzma), v takovém případě je nutno zavolat:
make lzma
Je potřeba mít nainstalován balíček liblzma-dev:
apt-get install -y liblzma-dev
Usage:
./main.py main.py [-h] [-i INPUT] [-o OUTPUT] [-n] [-t INPUTTYPE] -s STOPWORDS [-l LOG] [-a WARCOUTPUT] [-d] -i --input vstupní soubor určený k vertikalizaci (pokud není nastaveno očekává WARC na stdin) -o --output výstupní soubor, pokud není zadaný, výstup se vypisuje na stdout -n --nolangdetect vypne detekci jazyka, vertikalizace je rychlejší, rozdíl minimální -t --inputtype voľba typu vstupu, ktorý má vertikalizátor očakávať, viz Vstupy vertikalizácie -s --stopwords soubor se seznamem stop slov -l --log soubor pro ukládaní logu (ladících informací). Pro výstup na stdout musí být jeho hodnota STDOUT, pro výstup na stderr musí být hodnota STDERR. Ak parameter nie je prítomný, log sa ukladať ani zobrazovať nebude. -a --warcoutput cesta k výstupnému WARC archívu. Tento archív obsahuje tie záznamy z WARC achívu na vstupe, ktorých obsah nebol úplne odstránený pomocou algoritmu justext alebo na základe detekcie jazyka. Ak parameter nie je prítomný, žiadny WARC výstup sa negeneruje. Parameter nemá žiadny účinok, ak je vstupom Wiki archív alebo jedna webová stránka. Parameter neruší generovanie výstupu vo vertikálnom formáte, vertikalizácia má tak 2 výstupy súčasne. Výstup bude komprimovaný, ak meno súboru končí príponou .gz(GZip) alebo .xz(LZMA). -d --dedup výstupný vertikál je deduplikovaný, do súboru dedup_servers.txt je nutné doplniť mená serverov, na ktorých sa majú spustiť deduplikačné procesy. Po skončení vertikalizácie sa procesy deduplikácie nevynú, aby tak nenastal problém v iných procesoch vertikalizácie, ktoré ešte svoju činnosť neskončili (procesy deduplikačného servera sú zdieľané všetkými procesmi vertikalizátora) -m --map konfigurační mapa pro deduplikaci(aktuálně pouze ve větvi hash redistribution.
Spuštění se stdin vstupem:
Vertikalizátor je rychlejší se stdin vstupem než se vstupním souborem. Př.
xzcat file | python main.py [-o OUTPUT] [-n] -s STOPWORDS [-l LOG] [-a WARCOUTPU] [-d]
Nově se warcreader nachází ve složce vertikalizátoru.
Při přechodu na novější verzi vertikalizátoru, může být nutné přeinstalovat balík warcreader, jehož vývoj probíhá zároveň s vývojem vertikalizéru. Je však zveřejněný na Python Package Indexu jako samostatná knihovna. Tento balík se instaluje do domovského adresáře uživatele při použití příkazu make a nemůže být odstraněný nebo aktualizovaný pomocí příkazu pip. Je nutné ho odstranit manuálně zavoláním:
rm -r ~/.local/lib/pythonX.X/site-packages/warcreader*
kde X.X je použitá verze jazyka Python, většinou 2.7. Potom je možné nainstalovat novou verzi balíku warcreader pomocí nástroje pip:
Vertikalizátor umí zpracovat několik typů vstupu, parametrem -t/--inputtype
mu musí být zdělen typ, možné hodnoty jsou:
warc
- na vstupu se očekává warc archiv. Může být komprimovaný nástrojem gzip, v takovém případě však jméno souboru musí končit příponou .gzwiki
- na vstupu se okčekává archiv stránek Wikipedie ve formátě používaném interně v rámci skupiny KNOThtml
- na vstupu se oekává HTML zdrojový kód jedné webové stránkyuniversal
- na vstupu se očekává Universal Verticalization Format vstup. Může být komprimovaný nástroje gzip, v takovém případě však jméno souboru musí končit příponou .gzStarý vertikalizátor - nepoužívat
Pro vertikalizaci slouží program NLP-slave (závislý na lokálním langdetect), jehož zdrojové kódy jsou v repozitáři v:
./processing_steps/2/NLP-slave
Tento program předpokládá na vstupu (jako první parametr) soubor warc.gz, ze kterého postupně vybaluje jednotlivé záznamy, vyfiltruje z nich HTML, vyfiltruje neanglické články a provede tokenizaci. Zpracovat lze také 1 webovou stránku v .html a Wikipedii v předzpracovaném plaintextu či HTML. Výsledek je uložen s příponou vert do cílového adresáře.
Přeloží se příkazem:
mvn clean compile assembly:single
Použití starého vertikalizátoru:
java -jar package [opts] input_file.html output_dir file_URI [langdetect_profiles] java -jar package [opts] input_file.txt output_dir [langdetect_profiles] java -jar package [opts] input_file-warc.gz output_dir [langdetect_profiles] java -jar package [opts] input_file output_dir [langdetect_profiles]
package
- binární soubor programu, např. ./processing_steps/2/NLP-slave/target/NLP-slave-0.0.1-SNAPSHOT-jar-with-dependencies.jaropts
jsou přepínače:
-d
- zapne výpis ladících informací-z
- zapne nulování URI dokumentů u odkazů-o
- je-li uveden, URI dokumentů u odkazů vůbec nebudouinput_file.html
- je vstupní soubor v nekomprimovaném HTML (přípona .html)input_file-warc.gz
- je vstupní soubor v komprimovaném formátu warc (konec názvu je warc a přípona .gz)input_file.txt
- je vstupní soubor z Wikipedie v předzpracovaném plaintextu (přípona .txt)input_file
- je vstupní soubor z Wikipedie v předzpracovaném HTML (přípona není .html, .txt, ani warc.gz)output_dir
- cesta k výstupnímu adresáři bez lomítka na koncifile_URI
- je URI souboru (nelze ji získat přímo ze souboru, protože se nejedná o warc)langdetect_profiles
- Volitelný parametr s cestou k profilům langdetect - výchozí je /usr/share/langdetect/langdetect-03-03-2014/profilesSkript pro paralelní spuštění na více serverech:
./processing_steps/2/verticalize.py
Použití:
./verticalize.py -i INPUT_DIRECTORY -o OUTPUT_DIRECTORY [-s SERVERS_FILE] [-b BINARY] [-t THREADS] [-l] [-d] [-s STOPWORDS_LIST] [-e ERRORS_LOG] -i --input vstupní adresář se soubory určenými k vertikalizaci -o --output výstupní adresář, pokud adresář neexistuje, skript se jej pokusí vytvořit -s --servers soubor se seznamem serverů, kde je formát: HOSTNAME '\t' THREADS '\n' (jeden řádek pro jeden stroj) -e --errors pokud je nastaven jsou chyby logovány do tohoto souboru s aktuálním datem a časem -b --binary argument specifikující cestu k vetrikalizátoru (výchozí je ./processing_steps/2/vertikalizator/main.py) -t --threads nastavuje počet vláken (výchozí je 6, jsou-li počty vláken v souboru se seznamem serverů, mají vyšší prioritu) -l --no-lang vypne detekci jazyka -d --debug vertikalizátor tiskne ladící informace -w --stopwords soubor se seznamem stop slov (výchozí je ./processing_steps/2/vertikalizator/stoplists/English.txt)
Například:
./verticalize.py -i /mnt/data/commoncrawl/CC-2015-18/warc/ -o /mnt/data/commoncrawl/CC-2015-18/vert/ -s ~/servers -b /mnt/data/commoncrawl/software/NLP-slave-0.0.1-SNAPSHOT-jar-with-dependencies.jar # Data z adresáře /mnt/data/project/CC-2015-18/warc/ vertikalizuje do adresáře /mnt/data/commoncrawl/CC-2015-18/vert/ # Vetrikalizaci provede na všech serverech daných souborem -s ~/servers # Použije k tomu program /mnt/data/commoncrawl/software/NLP-slave-0.0.1-SNAPSHOT-jar-with-dependencies.jar, který musí být na všech strojích
Všechny skripty se nacházejí v profiling ve složce vertikalizátoru
files_compare.py
Jedná se o skript, který je určen pro porovnávání obsahu dvou souborů. Skript očekává dva argumenty, jedná se o cesty ke vstupním souborům.
Spuštění skriptu může být například:
python files_compare.py testregularpuvodni.txt testregular11.vert
profiling.py
Skript slouží pro usnadnění profilování. Funguje na principu, že se do složky jako první nahrají všechny varianty, které se mají profilovat. Pokud se zde nachází více souborů stejného typu jako například tokenizer.py
, tak se na konec před koncovku připíše - a zbytek textu.
Example:
tokenizer-2.py or tokenizer-slouceniVyrazu.py
Jako první vertikalizátor spustí neupravenou verzi vertikalizátoru, kvůli porovnávání výsledku profilování. Poté skript bere jednotlivé soubory, přepíše soubor pro otestování a spustí se vertikalizátor. Až se vertikalizátor ukončí, tak se ze složky reset vezme původní soubor a ten přepíše do vertikalizátoru (Ošetření, kdyby se testoval jako první verticalizate.py
a poté tokenizer.py
, aby se nepoužíval stále ten upravený verticalizate.py
).
Požadavky: Vytvořenou složku reset, kde jsou uloženy původní soubory. Složku profiling, kde se budou ukládat výsledky profilování. Skript i složky musí být ve složce vertikalizator.
Skript potřebuje dva argumenty. První je cesta k souboru, který slouží jako vstupní soubor pro vertikalizátor. Druhý je typ souboru.
Spuštění:
python profiling.py /mnt/data/commoncrawl/CC-2016-40/warc/1474738659833.43_20160924173739-00094-warc.xz warc
profiling_results.py
Poté co profilování doběhne je potřeba zobrazit výsledky. K tomu slouží skript profiling_results.py
. Ten očekává tři argumenty. Prvním argumentem je složka, kde se výsledky nachází. Druhým argumentem je podle čeho se mají výsledky seřadit. A třetím argumentem je kolik položek každého souboru se má zobrazit.
Run example:
python profiling_result.py profiling tottime 20
Nejdůležitější možnosti seřazení jsou:
ncalls
- seřazení podle počtu volánítottime
- podle celkového času stráveného v dané funkci (čas strávený v dalších funkcích, které se volají uvnitř funkce se nepočítá)cumtime
- podle celkového času stráveného ve funkci i všech funkcích, které se zavolaly uvnitř funkceDetailní dokumentace deduplikace je umístěna zde.
K deduplikci slouží programy dedup
a server
dostupné přeložením pomocí Makefilu ve složce:
processing_steps/3/dedup/ in repository corpproc_dedup
Parametry pro spouštění těchto programů jsou následující:
./server -m=~/hashmap.conf [-i=INPUT_FILE] [-o=OUTPUT_FILE [-d]] [-s=STRUCT_SIZE] [-p=PORT] [-j=JOURNAL_FILE] [-k] [a] [-P=RPORT] -i --input vstupní soubor -o --output výstupní soubor -h --help vypíše zoznam spúšťacích argumentov a ich použitie -p --port port serveru (výchozí je 1234) -s --size změna velikosti struktury pro uložení hashů (výchozí velikost je 300,000,000) -d --debug zároveň s výstupním souborem je generován soubor s debug výpisy -j --journal obnovenie hashov zo zálohy (použiť v kombinácii s -j u klienta) -k --keep ponechanie záložného súboru aj po úspešnom uložení hashov do výstupného súboru -m --map serializovaná mapa s rozložením hashov na serveroch -a --altered skontroluje mapu(--map) a odošle cudzie bloky novým vlastníkom. Nutné pri zmene mapy! -P --rport port služby pre migráciu hashov (predvolený je -p + 1)
Server běží do doby než je "killnut". Reakcí na signály SIGHUP a SIGTERM je uložení hashů do výstupního souboru (pokud je zadána cesta).
./dedup -i=INPUT_DIR -o=OUTPUT_DIR -s=SERVERS_STRING [-p=PORT] [-t=THREADS] [-n] [-d] [-wl] [-uf=FILTER_FILE] -i --input vstupní adresář se soubory určenými k deduplikaci -o --output výstupní adresář, pokud adresář neexistuje, skript se jej pokusí vytvořit -p --port port serveru (výchozí je 1234) -t --threads nastavuje počet vláken (výchozí je 6) -n --near použije algoritmus "nearDedup" -d --debug ke každému výstupnímu souboru .dedup je zároveň generován soubor .dedup.debug obsahující debug výpisy -wl --wikilinks deduplikace formátu Wikilinks -dr --dropped ke každému výstupnímu souboru .dedup je generován soubor .dedup.dropped obsahující odstraněné duplicity -f --feedback záznamy v souboru .dedup.dropped obsahující referenci na záznamy kvůli kterým byly vyloučeny (viz. níže) -dd --droppeddoc ku každému výstupnému súboru *.dedup je vytvorený súbor .dedup.dd obsahujúci zoznam URL adries kompletne vylúčených dokumentov -j --journal pokračovanie v deduplikácii po páde - spracované dokumenty budú preskočené, rozpracované budú dokončené - používa sa v kombinácii s -j u servera -h --help vypíše zoznam vstupných argumentov -m --map konfiguračná mapa rozloženia hashov
Pro jejich jednodušší spouštění byly vytvořeny skripty server.py
a deduplicate.py
(popsány níže), které umožnují spustit deduplikaci paralelně na více strojích. Programy musí být předem rozdistribuovány na všechny použité stroje a na nich být ve stejném umístění například: /mnt/data/bin/dedup
Spuštění serverů pro deduplikaci
Skript s argumentem start nejprve spouští screeny a v nich teprve samotné servery. Zadáním argumentu stop naopak screeny ukončuje. Pokud není zadán ani start ani stop ani restart, tak skript testuje nejprve zda běží screeny a poté také servery.
./processing_steps/3/server.py
Usage:
./server.py [start|stop|restart|migrate] -m MAP_FILE [-i INPUT_FILE] [-o OUTPUT_FILE [-d]] [-a] [-t THREADS] [-p PORT] [-e ERRORS_LOG_FILE] [-b BINARY] [-d] [-j] [-k] [-r SPARSEHASH_SIZE] [-P rport] start Spustí servery stop Zastaví servery a počká na serializáciu hashov restart Reštartuje servery migrate Spustí migráciu hashov. Po ukončení migrácie zastaví servery. -i --input vstupní soubor -o --output výstupní soubor -t --threads počet vlákien obsluhujúcich workerov (default = 384) (pozn. odstránené v hash_redistribution) -p --port port serveru (výchozí je 1234) -r --resize změna velikosti struktury pro uložení hashů (výchozí velikost je 300000000) -e --errors pokud je nastaven jsou chyby logovány do tohoto souboru s aktuálním datem a časem -b --binary argument specifikující cestu k deduplikačnímu serveru (výchozí je /mnt/data/commoncrawl/corpproc/bin/server) -d --debug zároveň s výstupním souborem je generován soubor s debug výpisy, povoľuje core dump -j --journal obnovenie hashov zo žurnálového súboru ( použiť v kombinácii s -j u klienta) -k --keep ponechanie záložného súboru aj po úspešnom uložení hashov do výstupného súboru -v --valgrind Spustí server vo valgrinde - iba pre debugovanie v prípade núdze -P --rport Port služby pre migráciu hashov (predvolený je -p + 1) -E --excluded Zoznam vylúčených serverov (vygenerovaný distribučným programom) pre migráciu hashov -a --altered Povolí migráciu hashov. viď. -a pri server -m --map Mapa rozloženia hashov.
Poznámka k -j, --journal: pro obnovení hashů ze zálohy je potřebné uvést cestu k vstupnímu souboru, který byl před pádem serveru zadaný jako výstupní. Skript ověří, zda se u něj nenachází soubor "vstupní_soubor".backup. Pokud vstupní soubor na nějakých serverech neexistuje, bude vytvořený.
Například:
./server.py start -m ~/hashmap # Spustí screeny a v nich servery na strojích určených souborem ~/hashmap # Servery čekají až se připojí workery ./server.py -m ~/hashmap # Otestuje zda jsou spuštěny screeny a servery na strojích určených souborem ~/hashmap ./server.py stop -m ~/hashmap -E ~/excluded.list # Ukončí screeny a v nich spuštěné servery na strojích určených souborem ~/hashmap a ~/excluded.list ./server.py migrate -m ~/hashmap -E ~/excluded.list -i ~/input.hash -o ~/output.hash # Spustí migráciu hashov podľa distribučnej mapy. Po ukončení migrácie zastaví servery a uloží hashe.
Spuštění workerů pro deduplikaci
Před tím je nutné spustit servery se stejnými parametry -m a -p.
./processing_steps/3/deduplicate.py
Usage:
./deduplicate.py -i INPUT_DIRECTORY -o OUTPUT_DIRECTORY -w WORKERS_FILE -m MAP_FILE [-p PORT] [-e ERRORS_LOG_FILE] [-b BINARY] [-n] [-d] [-wl] -i --input vstupní adresář se soubory určenými k deduplikaci -o --output výstupní adresář, pokud adresář neexistuje, skript se jej pokusí vytvořit -w --workers soubor se seznamem workerů, kde je formát: HOSTNAME '\t' THREADS '\n' (jeden řádek pro jeden stroj) (pozn. pozor na nahrádzanie tabov medzerami, nebude fungovať) -p --port port serveru (výchozí je 1234) -e --errors pokud je nastaven jsou chyby logovány do tohoto souboru s aktuálním datem a časem -b --binary argument specifikující cestu k deduplikačnímu programu (výchozí je /mnt/data/commoncrawl/corpproc/bin/dedup) -t --threads nastavuje počet vláken (výchozí je 6, jsou-li počty vláken v souboru se seznamem serverů, mají vyšší prioritu) -n --near použije algoritmus "nearDedup" -d --debug ke každému výstupnímu souboru .dedup je zároveň generován soubor .dedup.dropped obsahující odstraněné duplicity a .dedup.debug obsahující debug výpisy -wl --wikilinks deduplikace formátu Wikilinks -dr --dropped ke každému výstupnímu souboru .dedup je zároveň generován soubor .dedup.dropped obsahující odstraněné duplicity -f --feedback záznamy v souboru .dedup.dropped obsahující referenci na záznamy kvůli kterým byly vyloučeny (viz. níže) -dd --droppeddoc Ve výstupním adresáři bude vytvořený soubor "droppedDocs.dd" obsahující seznam kompletně vyloučených dokumentů -j --journal pokračování v deduplikaci po pádu systému zpracované dokumenty budou přeskočené, rozpracované budou dokončené používat v kombinaci s -j na serveru -m --map Mapa rozložení hashů
Deduplikace formátu wikilinks je implementována tak, že se počítá hash pro konkatenaci sloupců 2, 3, 5, 6, tedy musejí byt všechny sloupce stejné, aby byl řádek vyhodnocen jako duplicitní. Neardedup funguje tak, že výpočet hashů pomocí N-gramů se provádí na konkatecaci sloupců 5, 3, 6 (v tomto pořadí), dále se počítá hash 2. sloupce a aby byl rádek duplicitní, musejí oba předchozí přístupy odhalit shodu.
Například:
./deduplicate.py -i /mnt/data/commoncrawl/CC-2015-18/vert/ -o /mnt/data/commoncrawl/CC-2015-18/dedup/ -w ~/workers-s ~/servers # Data z adresáře /mnt/data/commoncrawl/CC-2015-18/vert/ deduplikuje do adresáře /mnt/data/commoncrawl/CC-2015-18/dedup/ # Deduplikace probíhá na strojích specifikovaných v souboru ~/workers # Očekává, že na strojích určených souborem ~/hashmap je spuštěn server
Jediný tento krok je pro Salomon jiný, protože se jedná o distribuovaný výpočet. Ve standardním provedení se komunikuje přes sokety standardním TCP/IP. Na Salomonu to však není možné (InfiniBand), proto je použita knihovna mpi. Zdrojové kódy jsou v
/mnt/minerva1/nlp/projects/corpproc/corpora_processing_sw/processing_steps/salomon/mpidedup
Doporu4uje se používat výhradně modul OpenMPI/1.8.8-GNU-4.9.3-2.25 kvůli problémům s kompatibilitou s některými verzemi.
Překlad:
module load OpenMPI/1.8.8-GNU-4.9.3-2.25 make
Spuštění na Salomonu
Deduplikaci je nejjednodušší spustit pomocí skriptu v5/start.sh
, spouštěcí parametry se nastavují ve skruptu, doporučuje se použít 4 uzly:
bash start.sh dedup 4 qexp
Parameters:
-h --hash - relativní počet serverů držících jednotlivé podprostory celkového hashovacího prostoru -w --work - relativní počet worker serverů, které provádějí vlastní deduplikaci -i --input - vstupní adresář se soubory určenými k deduplikaci -o --output - výstupní adresář -l --load - volitelný adresář odkud se nahrají existující hashe (pro inkrementální deduplikaci - musí se to samozřejmě pustit stejným způsobem (infrastruktura, počet workerů a serverů s hashovacím prostorem), jakým byly hashe dříve uloženy) -s --store - volitelný adresář pro uložení hashů -r --resize - volitelný parametr pro změnu velikosti struktury pro uložení hashů -d --debug - zapne ladící režim (generuje logy) -p --dropped - ku každému vertikálu generuje súbor *.dropped s odstránenými paragrafmi -c --droppeddoc - ku každému vertikálu generuje súbor *.dd so zoznamom spracovaných dokumentov a ich stavom. -n --near - přepne na neardedup algoritmus -j --journal - zohlední zpracované soubory a žurnály (neuložené hashe a nedokončené soubory) - pokusí se zotavit po pádu a pokračovat v deduplikaci -m --map - načítá konfigurační mapu rozložení hashů na serverech KNOT a použije toto rozložení
Čo robiť pri páde?
Preskúmať čo pád spôsobilo (súbory dedup.eXXXXX
and dedup.oXXXXX
) a spustiť znova.
Pri spúšťaní cez v5/start.sh
, ktorý po nastavení premenných prostredia volá v5/dedup.sh
je prednastavený parameter -j
, ktorý sa postará o pokračovanie v rozpracovanej deduplikácii nezávisle od toho, či bola ukončená správne alebo nie. Treba mať na pamäti, že použitie parametra -j
spôsobí, že už spracované vertikály sa preskočia, teda ak požadujete nové/čisté spustenie, je dôležité vymazať obsah výstupného priečinka s deduplikovanými vertikálmi. Režim obnovy je možné vypnúť v súbore v5/dedup.sh
.
Ako presne funguje režim obnovy(-j)?
Spustenie na serveroch KNOT:
mpiexec dedup -h H -w W -i ~/vert/ -o ~/dedup/ -s ~/hash/
Více informací zde.
Hashe rozložené podľa distribučnej mapy na KNOT serveroch je možné importovať na salomon, použiť a exportovať naspäť. Slúžia na to skripty v zložke processing_steps/salomon/migration.
Import hashov:
python3 importhashes.py [-h] [-s SERVERS] [-m MAP] FILE TARGET FILE Cesta k hashmape na KNOT serveroch, napr. /tmp/dedup/server.hashes TARGET Cieľový adresár na salomone, napr. /scratch/work/user/$(whoami)/deduphashes -h --help Vypíše tieto informácie -s SERVERS Cesta k súboru so zoznamom serverom na import 1 hostname na riadok (bez .fit.vutbr.cz), napr. athena5 -m MAP Cesta k distribučnej mape, alternatíva ku -s zoznam serverov na import vytiahne z distribučnej mapy
Export hashov:
python3 exporthashes.py [-h] SOURCE TARGET SOURCE Zdrojový adresár napr. /scratch/work/user/$(whoami)/deduphashes TARGET Cieľový súbor na serveroch KNOT, napr. tmp/dedup/dedup.hash
Hostname servera je zistený z mena hashmapy.
Použitie importovaných hashov na salomone
Nastaviť premennú MAP_PATH
, pri spúštaní úlohy, napríklad v súbore v5/start.sh
:
MAP_PATH="/scratch/work/user/${LOGIN}/hashmap.conf"
Deduplikácia prispôsobí počet hashholderov počtu serverov v distribučnej mape. Teda ak distribučná mapa obsahuje 46 serverov KNOT, tak je potrebných minimálne 47 jadier (46 hashholderov a 1 worker), optimálne aspoň dvojnásobok. Premenné NUM_HASHES
a NUM_WORKERS
sú v tomto prípade ignorované.
Tagging se provádí programem TT-slave (závislý na /opt/TreeTagger), který lze najít v:
./processing_steps/4/TT-slave
Přeloží se příkazem:
mvn clean compile assembly:single
Použití:
java -jar package [opts] input_file output_dir [treetagger.home]
package
- binární soubor programu, např. ./processing_steps/4/TT-slave/target/TT-slave-0.0.1-SNAPSHOT-jar-with-dependencies.jarops
- jsou přepínače:
-d
- zapne výpis ladících informací-o
- zapne odstraňování URI z odkazůinput_file
- je vstupní soubor ve vertikálním formátu (přípona je .vert)output_dir
- cesta k výstupnímu adresáři bez lomítka na koncitreetagger.home
- je cesta k instalačnímu adresáři TreeTagger, výchozí je /opt/TreeTaggerSkript pro paralelní spuštění na více serverech:
./processing_steps/4/tag.py
Použití:
./tag.py -i INPUT_DIRECTORY -o OUTPUT_DIRECTORY [-s SERVERS_FILE] [-e ERRORS_LOG_FILE] [-b BINARY] [-t THREADS] [-d] [-u] -i --input vstupní adresář se soubory určenými k tagování -o --output výstupní adresář, pokud adresář neexistuje, skript se jej pokusí vytvořit -s --servers soubor se seznamem serverů, kde je formát: HOSTNAME '\t' THREADS '\n' (jeden řádek pro jeden stroj) -e --errors pokud je nastaven jsou chyby logovány do tohoto souboru s aktuálním datem a časem -b --binary argument specifikující cestu k tagovacímu .jar programu (výchozí je ./processing_steps/4/TT-slave/target/TT-slave-0.0.1-SNAPSHOT-jar-with-dependencies.jar) -t --threads nastavuje počet vláken (výchozí je 6, jsou-li počty vláken v souboru se seznamem serverů, mají vyšší prioritu) -d --debug ladící výpisy -u --uri zapne odstraňovaní URI z odkazů
Například:
./tag.py -i /mnt/data/commoncrawl/CC-2015-18/dedup/ -o /mnt/data/commoncrawl/CC-2015-18/dedup/tagged/ -s ~/servers # taguje soubory ze složky /mnt/data/commoncrawl/CC-2015-18/dedup/ a uloží do # složky /mnt/data/commoncrawl/CC-2015-18/dedup/tagged/ na strojích určených souborem ~/servers
Parsing se provádí upraveným MDParserem, který lze nalézt v:
./processing_steps/5/MDP-package/MDP-1.0
Přeloží se příkazem:
ant make-mdp
Použití:
java -jar package [opts] input_file output_dir [path_to_props]
package
- je binární soubor programu, např. ./processing_steps/5/MDP-package/MDP-1.0/build/jar/mdp.jaropts
- přepínače:
-o
- zapne odstraňování nadbytečných URI dokumentů z odkazůinput_file
- je otagovaný vstupní soubor (přípona je .tagged)output_dir
- cesta k výstupnímu adresáři bez lomítka na koncipath_to_props
- Cesta k .xml súboru s parametrami programu (v prípade neuvedenia sa použijú parametre zo súboru ./processing_steps/5/MDP-package/MDP-1.0/resources/props/props.xml) (na serverech knot a athena je vhodným souborem ./processing_steps/5/MDP-package/MDP-1.0/resources/props/propsKNOT.xml)Důležité soubory, pokud by se něco měnilo:
./processing_steps/5/MDP-package/MDP-1.0/src/de/dfki/lt/mdparser/test/MDParser.java ./processing_steps/5/MDP-package/MDP-1.0/src/de/dfki/lt/mdparser/outputformat/ConllOutput.java
Skript pro paralelní spuštění na více serverech:
./processing_steps/5/parse.py
Použití:
./parse.py -i INPUT_DIRECTORY -o OUTPUT_DIRECTORY [-s SERVERS_FILE] [-e ERRORS_LOG_FILE] [-b BINARY] [-t THREADS] [-u] [-p XML_FILE] -i --input vstupní adresář se soubory určenými k parsování -o --output výstupní adresář, pokud adresář neexistuje, skript se jej pokusí vytvořit -s --servers soubor se seznamem serverů, kde je formát: HOSTNAME '\t' THREADS '\n' (jeden řádek pro jeden stroj) -e --errors pokud je nastaven jsou chyby logovány do tohoto souboru s aktuálním datem a časem -b --binary argument specifikující cestu k parsovacímu .jar programu (výchozí je ./processing_steps/5/MDP-package/MDP-1.0/build/jar/mdp.jar) -t --threads nastavuje počet vláken (výchozí je 6, jsou-li počty vláken v souboru se seznamem serverů, mají vyšší prioritu) -u --uri zapne odstraňovaní URI z odkazů -p --props Cesta k .xml súboru s parametrami programu (výchozí je ./processing_steps/5/MDP-package/MDP-1.0/resources/props/propsKNOT.xml)
Například:
./parse.py -i /mnt/data/commoncrawl/CC-2015-18/tagged/ -o /mnt/data/commoncrawl/CC-2015-18/parsed/ -s ~/servers # parsuje soubory ze složky /mnt/data/commoncrawl/CC-2015-18/tagged/ do # složky /mnt/data/commoncrawl/CC-2015-18/parsed/ na strojích určených souborem ~/servers ./parse.py -i /mnt/data/commoncrawl/CC-2015-18/tagged/ -o /mnt/data/commoncrawl/CC-2015-18/parsed/ -s ~/servers \ -p ./processing_steps/5/MDP-package/MDP-1.0/resources/props/propsKNOT.xml # parsuje soubory ze složky /mnt/data/commoncrawl/CC-2015-18/tagged/ do # složky /mnt/data/commoncrawl/CC-2015-18/parsed/ na strojích určených souborem ~/servers # zároveň MDParseru předá konfigurační soubor propsKNOT.xml (musí být dostupný na všech strojích kde spouštíme)
Pro rozpoznání pojmenovaných entit se používá SEC (viz SEC). Klienta sec.py lze paralelně na více serverech spustit pomocí:
./processing_steps/6/ner.py
Použití:
./ner.py -i INPUT_DIRECTORY -o OUTPUT_DIRECTORY [-s SERVERS_FILE] [-e ERRORS_LOG_FILE] [-b BINARY] -i --input vstupní adresář -o --output výstupní adresář -s --servers soubor se seznamem serverů, kde na každém řádku je hostname jednoho stroje, pokud řádek obsahuje tabulátor, je brán jako oddělovač a jako hostname se bere jen text před ním (kvůli kompatibilitě tohoto konfiguračního souboru se skripty, u kterých je možné specifikovat počet vláken pro konkrétní stroj, tam je možný formát: HOSTNAME \t THREADS pro každý řádek) -e --errors pokud je nastaven jsou chyby logovány do tohoto souboru s aktuálním datem a časem -b --binary změna cesty k SEC klientovi (výchozí je /var/secapi/SEC_API/sec.py)
Například:
./ner.py -i /mnt/data/commoncrawl/CC-2015-18/parsed/ -o /mnt/data/commoncrawl/CC-2015-18/secresult/ -s ~/servers # zpracovává soubory ze složky /mnt/data/commoncrawl/CC-2015-18/parsed/ do # složky /mnt/data/commoncrawl/CC-2015-18/secresult/ na strojích určených souborem ~/servers
Příklad konfigurace SEC s mapováním vstupního vertikálu na výstupní, jenž anotuje vertikál do formátu MG4J
{ "annotate_vertical": { "annotation_format": "mg4j", "vert_in_cols": [ "position", "token", "postag", "lemma", "parabspos", "function", "partoken", "parpostag", "parlemma", "parrelpos", "link", "length" ], "vert_out_cols": [ "position", "token", "postag", "lemma", "parabspos", "function", "partoken", "parpostag", "parlemma", "parrelpos", "link", "length" ] }
Intro do MG4J: http://www.dis.uniroma1.it/~fazzone/mg4j-intro.pdf
Zdrojové soubory programu určeného pro sémantické indexování se nacházejí v adresáři:
./processing_steps/7/corpproc
Přeloží se příkazem:
mvn package
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
mkdir /mnt/data/indexes/CC-2015-18/collPart001
-c <CONFIG_FILE>
):
java -jar processing_steps/7/corpproc/target/corpproc-1.0-SNAPSHOT-jar-with-dependencies.jar -i
java -jar processing_steps/7/corpproc/target/corpproc-1.0-SNAPSHOT-jar-with-dependencies.jar index /mnt/data/indexes/CC-2015-18/collPart001 /mnt/data/indexes/CC-2015-18/final
Skript pro paralelní spuštění na více serverech: (pozor, zatím nefunguje s novým serverem)
Skript spouští indexaci tak, že vytvoří 6 shardů, ty naplní a z nich vytvoří kolekce a nad nimi spustí indexaci. K tomu je potřeba zadat argument start. Pokud není zadán, bude vypsán stav jednotlivých screenů a stav programů v nich. Argumentem stop budou screeny ukončeny.
./processing_steps/7/index.py
Použití:
./index.py [start|stop] -i INPUT_DIRECTORY -o OUTPUT_DIRECTORY [-s SERVERS_FILE] [-e ERRORS_LOG_FILE] [-b BINARY] -i --input vstupní adresář -o --output výstupní adresář -s --servers soubor se seznamem serverů, kde na každém řádku je hostname jednoho stroje, pokud řádek obsahuje tabulátor, je brán jako oddělovač a jako hostname se bere jen text před ním (kvůli kompatibilitě tohoto konfiguračního souboru se skripty, u kterých je možné specifikovat počet vláken pro konkrétní stroj, tam je možný formát: HOSTNAME \t THREADS pro každý řádek) -e --errors pokud je nastaven jsou chyby logovány do tohoto souboru s aktuálním datem a časem -b --binary cesta do složky obsahující .jar soubory (výhozí je /mnt/data/wikipedia/scripts/mg4j/)
Například:
./index.py -s ~/servers # zobrazí stav spuštění screenů a programu v nich na všech serverech ze souboru ~/servers ./index.py -i /mnt/data/commoncrawl/CC-2015-18/secresult/ -o /mnt/data/indexes/CC-2015-18/ -s ~/servers start # spustí indexaci na zvolených serverech ./index.py -s ~/servers stop # ukončí screeny a tím i procesy v nich na všech serverech ze souboru ~/servers
Sloupce:
https://docs.google.com/spreadsheets/d/1S4sJ00akQqFTEKyGaVaC3XsCYDHh1xhaLtk58Di68Kk/edit#gid=0
Pozn.: Zatím není jasné, jestli mají být speciální znaky XML ve sloupcích escapované. Současná implementace SEC je neescapuje, resp. případné escapování odstraní. tagMG4JMultiproc.py
je také neescapuje, ale escapování, které je na vstupu (pouze částečné - pravděpodobně jen některé sloupce) ponechá.
Pokud se sloupce změní, je třeba změnit následující parametry:
Daemon vyžaduje soubor .collection ve složce s indexem, nový indexer ho vytváří automaticky. Je možné ale použít i indexy vytvořené starým indexerem, tam se soubor .collection automaticky převede do nového formátu. Při přesunu indexu nebo datových souborů do nového umístění stačí pouze změnit cesty k datovým souborům v souboru .collection - jedná se pouze o jednoduchý JSON. (Ve staré verzi by bylo nutné data přeindexovat.)
Spuštění pomocí následujících příkazů:
cd /mnt/data/indexes/CC-2015-18/final java -jar processing_steps/7/mg4j/corpproc-1.0-SNAPSHOT-jar-with-dependencies.jar serve /mnt/data/indexes/CC-2015-18/final
Skript pro paralelní spuštění na více serverech: (pozor, zatím nepracuje s novým serverem)
Spouští daemony odpovídající na dotazy. Spouštění probíhá ve screenech a musí být zadán parametr start. Bez parametru vypíše stav screenů a daemonů. Parametr stop ukončí screeny.
./processing_steps/7/daemon.py
Použití:
./daemon.py [start|stop|restart] -i INPUT_DIRECTORY [-s SERVERS_FILE] [-e ERRORS_LOG_FILE] [-b BINARY] -i --input vstupní adresář (automaticky přidává na konec cesty /final/) -p --port port (defaut is 12000) -s --servers soubor se seznamem serverů, kde na každém řádku je hostname jednoho stroje, pokud řádek obsahuje tabulátor, je brán jako oddělovač a jako hostname se bere jen text před ním (kvůli kompatibilitě tohoto konfiguračního souboru se skripty, u kterých je možné specifikovat počet vláken pro konkrétní stroj, tam je možný formát: HOSTNAME \t THREADS pro každý řádek) -e --errors pokud je nastaven jsou chyby logovány do tohoto souboru s aktuálním datem a časem -b --binary cesta do složky obsahující .jar soubory (výhozí je /mnt/data/wikipedia/scripts/mg4j/)
Například:
./daemon.py -i /mnt/data/indexes/CC-2015-18/final -s ~/servers start # spustí screeny a v nich daemon nad kolekcemi ve složce /mnt/data/indexes/CC-2015-18/final # na strojích v souboru ~/servers ./daemon.py -s ~/servers # zobrazí stav spuštěných screenů a daemonů na strojích v souboru ~/servers ./daemon.py -s ~/servers stop # ukončí screeny na strojích v souboru ~/servers
Zdrojové soubory programu jsou v adresáři:
./processing_steps/8a/mg4jquery
Lze je přeložit příkazem:
JAVA_HOME=/usr/lib/jvm/java-8-oracle/; mvn clean compile assembly:single
Příklady spuštění:
JAVA_HOME=/usr/lib/jvm/java-8-oracle/; java -jar mg4jquery-0.0.1-SNAPSHOT-jar-with-dependencies.jar -h ../../servers.txt -m ../src/main/java/mg4jquery/mapping.xml -s ../src/main/java/mg4jquery/config.xml -q "\"was killed\"" JAVA_HOME=/usr/lib/jvm/java-8-oracle/; java -jar mg4jquery-0.0.1-SNAPSHOT-jar-with-dependencies.jar -h ../../servers.txt -m ../src/main/java/mg4jquery/mapping.xml -s ../src/main/java/mg4jquery/config.xml -q "1:nertag:person < 2:nertag:person" -c "1.nerid != 2.nerid"
Tohle by například vrátilo dokumenty, kde jsou alespoň dva různí lidé. Soubor se servery na očekává na každém řádku adresu serveru s portem, např.:
knot01.fit.vutbr.cz:12000
Skript na prípravu:
./prepare_webGUI.py
Použitie:
python ./prepare_webGUI.py -po PORT -pa PATH -n NAME [-a] [-e ERRORS_LOG_FILE]
-po --port
- port, na ktorom bude spustená DB-pa --path
- cesta k adresáru, kde bude vytvorená DB-n --name
- názov DB-a --artifacts
- nainštaluje potrebné artefakty-e --errors
- errors log súbor. Logy sú ukladané s dátumom a časom. Ak nie je špecifikovaný, logy sa vypisujú na STDERRNapríklad:
python ./prepare_webGUI.py -po 9094 -pa ./src/main/webapp/WEB-INF/ -n users -a # nainštaluje potrebné artefakty, preloží zdrojové súbory a pripraví DB v adresári ./src/main/webapp/WEB-INF/ s náznom mem:users na porte 9094
Spuštění na portu 8086:
mvn jetty:run -Djetty.port=8086
Ukončenie:
./stop_webGUI.py
Použitie:
python ./stop_webGUI.py # potrebné spustiť vždy pri ukončovaní webového GUI
V podadresáři maven_deps/src
jsou obsaženy i zdroje vlastní gwt komponenty pro zobrazení dynamických tooltipů. Pro úspěšné navrácení výsledků dotazu ze serveru je nutné v nastavit v možnostech adresy těchto serverů (v klasickém formátu doménové_jméno_serveru:port). Dále lze nastavit počet výsledků na stránku, chování info oken (dynamické - po odjetí kurzoru myši z entity se info okno skryje, statické - zůstane viditelné, dokud uživatel nenajede kurzorem nad jinou entitu, či jiným způsobem nezmění stav aplikace) a typ zobrazení (defaultní je corpus based, ale lze zapnout i document based).
Probíhá podobným způsobem, jako v MG4J, sémantický index automaticky přemapuje dotazy do stejného indexu, není tedy třeba psát:
"(nertag:person{{nertag-> token}}) killed"
Stačí takovýto dotaz:
"nertag:person killed"
Oproti mg4j je zde rozšířeí "Global constraints", které umožňuje označit token a provést na něm post-filter.
1:nertag:person < 2:nertag:person 1.fof != 2.fof AND 1.nerid = 2.nerid
Toto by například vrátilo dokumenty, kde je tatáž osoba v různých formách (nejčastěji asi jméno a koreference). V případě potřeby dotazování se na výskyty v rámci jedné věty lze použít operátor diference.
nertag:person < nertag:person - _SENT_ nertag:person < nertag:person - _PAR_
Tyto dotazy hledají dva lidi uvnitř věty, resp. odstavce. Diference znamená, že se má vzít takový úsek textu, ve kterém se daný token nevyskytuje.
Existuje množství indexů, do kterých se dá dotazovat:
position token tag lemma parpos function parword parlemma paroffset link length docuri lower nerid nertag person.name person.gender person.birthplace person.birthdate person.deathplace person.deathdate person.profession person.nationality artist.name artist.gender artist.birthplace artist.birthdate artist.deathplace artist.deathdate artist.role artist.nationality location.name location.country artwork.name artwork.form artwork.datebegun artwork.datecompleted artwork.movement artwork.genre artwork.author event.name event.startdate event.enddate event.location museum.name museum.type museum.estabilished museum.director museum.location family.name family.role family.nationality family.members group.name group.role group.nationality nationality.name nationality.country date.year date.month date.day interval.fromyear interval.frommonth interval.fromday interval.toyear interval.tomonth interval.today form.name medium.name mythology.name movement.name genre.name nertype nerlength
Jen upozornění, že všechny dotazy začínající na číslo nebo obsahující hvězdičku se musí závorkovat, jinak je to syntaktická chyba dotazu.
nertag:event ^ event.startdate: (19*)
Také je dobré vědět, že dotazy na atributy nějaké pojmenované entity by se měly uvádět v kombinaci s dotazem do indexu nertag (to protože se indexy překrývají z důvodu úspory místa). Pro "Global constraints" lze navíc použít dotaz "fof", což je zkratka pro "full occurrence form".
Skript umožňuje přerozdělit data (soubory) mezi dané servery tak, aby byla rovnoměrně využitá kapacita diskových polí (přerozděluje i z N serverů na M serverů, kde M je větší než N).
Script location:
./processing_steps/1/redistribute.py
Použití:
./redistribute.py -i INPUT_DIRECTORY [-o OUTPUT_DIRECTORY [-d DISTRIB_DIRECTORY]] -s SERVER_LIST [-p RELATED_PATHS] [-x EXTENSION] [-r] [-m] [-e ERRORS_LOG_FILE]
-i --input
- vstupní adresář určený k redistribuci-o --output
- výstupní adresář pro generované skripty-d --distrib
- výstupní adresář na všech serverech, do kterého se rozdistribuují vygenerované skripty-s --servers
- soubor se seznamem serverů, kde na každém řádku je hostname jednoho stroje-p --paths
- soubor s cestami a příponami souvisejících souborů ve formátu PATH \\t EXTENSION \\n-x --extension
- přípona v INPUT_DIRECTORY (výchozí je bez přípony)-m --moves
- vypsat přesuny na stdout-e --errors
- pokud je nastaven jsou chyby logovány do tohoto souboru s aktuálním datem a časemVýsledné rozdistribuované skripty je potřeba spustit paralelním ssh a pak odstranit.
Například:
python /mnt/minerva1/nlp/projects/corpproc/corpora_processing_sw/processing_steps/1/redistribute.py -i /mnt/data/commoncrawl/CC-2015-14/warc -s /mnt/minerva1/nlp/projects/corpproc/corpora_processing_sw/processing_steps/servers.txt -m -o /home/idytrych/redistributionScripts -d /mnt/data/commoncrawl/software/redistributionScripts -x "-warc.gz" -p /home/idytrych/CC-2015-14-rel.txt >moves.txt
kde CC-2015-14-rel.txt obsahuje:
/mnt/data/commoncrawl/CC-2015-14/uri -warc.domain /mnt/data/commoncrawl/CC-2015-14/uri -warc.domain.srt /mnt/data/commoncrawl/CC-2015-14/uri -warc.netloc ...
následně se skripty ve screenu spustí:
parallel-ssh -h servery_b9_idytrych.txt -t 0 -A -i "bash /mnt/data/commoncrawl/software/redistributionScripts/\$HOSTNAME.sh"
a odstraní:
parallel-ssh -h servery_b9_idytrych.txt -t 0 -A -i "rm /mnt/data/commoncrawl/software/redistributionScripts/\$HOSTNAME.sh"
Na serverech, na které se nebude nic přesouvat, není žádný skript, takže to vypíše chybu.
Aktuálně běží vyhledávač na serveru athena1, lze vyzkoušet např. zde.
Indexy pro tento vyhledávač běží téměř na všech serverech. Pro Wikipedii lze démony restartovat takto (může udělat jen ten, kdo je spustil):
python daemon.py restart -i /mnt/data/indexes/wikipedia/enwiki-20150901/ -s /mnt/minerva1/nlp/projects/corpproc/serverLists/serversIW.txt -b /mnt/data/wikipedia/software/mg4j
Pro CC (v pořadí dle inkrementální deduplikace):
python daemon.py restart -i /mnt/data/indexes/CC-2015-32/ -s /mnt/minerva1/nlp/projects/corpproc/serverLists/serversIC32.txt -b /mnt/data/commoncrawl/software/mg4j -p 12001 python daemon.py restart -i /mnt/data/indexes/CC-2015-35/ -s /mnt/minerva1/nlp/projects/corpproc/serverLists/serversIC35.txt -b /mnt/data/commoncrawl/software/mg4j -p 12002 python daemon.py restart -i /mnt/data/indexes/CC-2015-40/ -s /mnt/minerva1/nlp/projects/corpproc/serverLists/serversIC40.txt -b /mnt/data/commoncrawl/software/mg4j -p 12003 python daemon.py restart -i /mnt/data/indexes/CC-2015-27/ -s /mnt/minerva1/nlp/projects/corpproc/serverLists/serversIC27.txt -b /mnt/data/commoncrawl/software/mg4j -p 12004
Indexy dělané na Salomonu potřebují symlinky - jsou tam cesty jako /scratch/work/user/idytrych/CC-2015-32/mg4j_index
Skript umožňuje prebaliť vstupný warc.gz
súbor podľa príslušného vertikálu. Z pôvodneho warc.gz
súboru sú vybrané len dokumenty, ktoré sa nachádzaju vo vstupnom vertikále a výsledok je uložený do súboru warc.xz
. Skript je možné spustiť pre jeden warc.gz
súbor a konkrétny vertikál, alebo pre zložku v ktorej sa nachádzaju vstupné warc.gz
súbory a zložku v ktorej sa nachádzaju vertikály. Iná kombinácia nie je možná.
Umístění skriptu:
./processing_steps/1/warc_from_vert/warc_from_vert.py
Spuštění
-i --input vstupný warc.gz súbor/zložka -v --vertical vstupný vertikál/zložka -o --output výstupna zložka, do ktorej budú uložené výsledky
Skript umožnuje zabaliť predspracovanú wikipediu do warc.gz
alebo warc.xz
súboru. Vstupom môže byť jeden súbor alebo zložka obsahujúca súbory na spracovanie.
Umistenie skriptu:
./processing_steps/1/pack_wikipedia/pack_wiki.py
Spustenie:
-i --input vstupný súbor/zložka -o --output výstupná zložka -d --date dátum stiahnutia wikipedie vo formáte DD-MM-YYYY -f --format formát výstupného súboru. Možnosti sú gz alebo xz.
Skript network_monitor.py
, umožňuje zisťovať aktuálne vyťaženie liniek CESNET. Je možné ho spustiť ako samostatný skript, alebo použiť ako knižnicu pre python. Pri použití ako knižnice je dostupná trieda NetMonitor, ktorej je možné predať názov siete, ktorú chceme monitorovať. Instancia tejto triedy poskytuje funkciu get_status, ktorá vráti výsledok vo formáte JSON, obsahujúci počet prichadzajúcich a odchadzajúcich bitov za sekundu a prichadzajúcu a odchadzajúcu zátaž v %.
Pri spustení ako samostatného skriptu sa na terminál podľa parametrov vypíše prichadzajúca/odchadzajúca záťaž v % alebo sa vypíše najhoršia z nich.
Hodnoty sú aktualizované raz za minútu. Frekventovanejšie zisťovanie stavu nemá zmysel.
Values are refreshed every minute. More frequent refresh rate is pointless.
Cesta k skriptu:
./processing_steps/1/network_monitor.py
Spustenie:
-i --datain Zobrazí prichadzajúcu záťaž v % -o --dataout Zobrazí odchadzajúcu zátaž v % -w --worst Zobrazí najhoršiu zátaž v % -l --link Linka, ktorú chceme monitorovať, bez udania sa monitoruje linka Telia
Slúži pre automatické sťahovanie veľkých dát CC, pričom udržiava záťaž siete v určitom rozsahu. Pre sledovanie stavu siete sa používa vyššie zmienený skript network_monitor.py
. Skriptu je zadaný spodný limit záťaže siete v %, pričom skript bude udržiavať zátaž medzi touto hodnotou a hodnotou o 10% vyššiou. Vstupom je súbor warcs.lst alebo jeho časť, v prípade sťahovania na viacerých serveroch. Pomocou parametru je možné zvoliť maximálny počet sťahovacích procesov v rozsahu 1 až 15. Skript je vhodné používať súčasne na menej serveroch s viacerými procesmi.
Bol testovaný na Salomone pri stahovaní CC-2016-44. Skript bežal na 4 serveroch s maximálnym počtom procesov 12 a dolnou hranicou siete 55%, pričom zátaž siete sa udržiavala medzi 55-65%.
Cesta k sriptu:
./processing_steps/1/cc_auto_download.py
Spustenie:
-i --input_file Cesta k vstupnému súboru warcs.lst alebo jeho časti -o --output_dir Cesta k výstupnej zložke -p --process Počet sťahovacích procesov v rozsahu 1 až 15 -l --limit Spodný limit pre záťaž siete v %, možné hodnoty sú od 10 do 80
Program, ktorý umožnuje extrahovať stránky wikipedie zo súboru vo formáte zim. Výstup je vo formáte predspracovanej wikipedie, ktorý sa ukladá do výstupnej zložky a je rozdelený na súbory o veľkosti približne 100 MB. Program sa nachádza v zložke:
Program location:
/mnt/minerva1/nlp/corpora_datasets/monolingual/english/wikipedia/zim_data/zimlib-1.2
Preloží sa príkazom make. Po preložení vznikne spustiteľný program zimdump, ktorý sa bude nachádzať v zložke:
/mnt/minerva1/nlp/corpora_datasets/monolingual/english/wikipedia/zim_data/zimlib-1.2/src/tools
Príklad spustenia programu:
./zimdump -a ~/output -J cs wikipedia_en_2016_05.zim
Parametre:
-a
- výstupní adresář-j
- nepovinný, nastaví jazyk vstupního souboru, používá se pro vygenerování správného URI (default hodnota je en)Pro verzi skriptů 4:
Kompletní sekvence pro spuštění (zatím neotestováno):
(označení dumpu je RRRRMMDD) cd 1a ./download_wikipedia_and_extract_html.sh RRRRMMDD cd .. python ./1/distribute.py -i ./2/NLP-slave/target/NLP-slave-0.0.1-SNAPSHOT-jar-with-dependencies.jar -o /mnt/data/wikipedia/software/ -s servers.txt -a python ./2/verticalize.py -i /mnt/data/wikipedia/enwiki-RRRRMMDD/html_from_xml/AA/ -o /mnt/data/wikipedia/enwiki-RRRRMMDD/vert/ -s servers.txt -b /mnt/data/wikipedia/software/NLP-slave-0.0.1-SNAPSHOT-jar-with-dependencies.jar python ./1/distribute.py -i ./4/TT-slave/target/TT-slave-0.0.1-SNAPSHOT-jar-with-dependencies.jar -o /mnt/data/wikipedia/software/ -s servers.txt -a python ./4/tag.py -i /mnt/data/wikipedia/enwiki-RRRRMMDD/vert/ -o /mnt/data/wikipedia/enwiki-RRRRMMDD/tagged/ -s servers.txt -b /mnt/data/wikipedia/software/TT-slave-0.0.1-SNAPSHOT-jar-with-dependencies.jar python ./1/distribute.py -i ./5/MDP-package/MDP-1.0/build/jar/mdp.jar -o /mnt/data/wikipedia/software/ -s servers.txt -a python ./5/parse.py -i /mnt/data/wikipedia/enwiki-RRRRMMDD/tagged/ -o /mnt/data/wikipedia/enwiki-RRRRMMDD/parsed/ -s servers.txt -b /mnt/data/wikipedia/software/mdp.jar python ./6/ner.py -i /mnt/data/wikipedia/enwiki-RRRRMMDD/parsed/ -o /mnt/data/wikipedia/enwiki-RRRRMMDD/secresult/ -s servers.txt python ./1/distribute.py -i ./7/mg4j/ -o /mnt/data/wikipedia/software/mg4j/ -s servers.txt -a python ./7/index.py -i /mnt/data/wikipedia/enwiki-RRRRMMDD/secresult/ -o /mnt/data/indexes/enwiki-RRRRMMDD/ -s servers.txt start
Spuštění démonů odpovídajících na dotazy:
python ./daemon.py -i /mnt/data/indexes/enwiki-RRRRMMDD/final -s servers.txt -b /mnt/data/wikipedia/software/mg4j/ start
Kompletní sekvence pro spuštění (zatím neotestováno):
(označení CC je RRRR-MM) cd processing_steps/1b/download_commoncrawl ./dl_warc.sh RRRR-MM cd ../.. python ./1/distribute.py -i ./2/NLP-slave/target/NLP-slave-0.0.1-SNAPSHOT-jar-with-dependencies.jar -o /mnt/data/commoncrawl/software/ -s servers.txt -a python ./2/verticalize.py -i /mnt/data/commoncrawl/CC-RRRR-MM/warc/ -o /mnt/data/commoncrawl/CC-RRRR-MM/vert/ -s servers.txt -b /mnt/data/commoncrawl/software/NLP-slave-0.0.1-SNAPSHOT-jar-with-dependencies.jar python ./1/distribute.py -i ./3/dedup/server -o /mnt/data/commoncrawl/software/dedup/ -s servers.txt -a python ./1/distribute.py -i ./3/dedup/dedup -o /mnt/data/commoncrawl/software/dedup/ -s servers.txt -a cd 3 parallel-ssh -h servers_only.txt -t 0 -i "mkdir /mnt/data/commoncrawl/CC-RRRR-MM/hashes/" ( to load hashes from previous processing, use parameter -i /mnt/data/commoncrawl/CC-RRRR-MM/hashes/) python ./server.py start -s servers.txt -w workers.txt -o /mnt/data/commoncrawl/CC-RRRR-MM/hashes/ -b /mnt/data/commoncrawl/software/dedup/server python ./deduplicate.py -i /mnt/data/commoncrawl/CC-RRRR-MM/vert/ -o /mnt/data/commoncrawl/CC-RRRR-MM/dedup/ -w workers.txt -s servers.txt -b /mnt/data/commoncrawl/software/dedup/dedup python ./server.py stop -s servers.txt -w workers.txt -b /mnt/data/commoncrawl/software/dedup/server cd .. python ./1/distribute.py -i ./4/TT-slave/target/TT-slave-0.0.1-SNAPSHOT-jar-with-dependencies.jar -o /mnt/data/commoncrawl/software/ -s servers.txt -a python ./4/tag.py -i /mnt/data/commoncrawl/CC-RRRR-MM/dedup/ -o /mnt/data/commoncrawl/CC-RRRR-MM/dedup/tagged/ -s servers.txt -b /mnt/data/commoncrawl/software/TT-slave-0.0.1-SNAPSHOT-jar-with-dependencies.jar python ./1/distribute.py -i ./5/MDP-package/MDP-1.0/build/jar/mdp.jar -o /mnt/data/commoncrawl/software/ -s servers.txt -a python ./5/parse.py -i /mnt/data/commoncrawl/CC-2RRRR-MM/tagged/ -o /mnt/data/commoncrawl/CC-RRRR-MM/parsed/ -s servers.txt -b /mnt/data/commoncrawl/software/mdp.jar python ./6/ner.py -i /mnt/data/commoncrawl/CC-RRRR-MM/parsed/ -o /mnt/data/commoncrawl/CC-RRRR-MM/secresult/ -s servers.txt python ./1/distribute.py -i ./7/mg4j/ -o /mnt/data/commoncrawl/software/mg4j/ -s servers.txt -a python ./7/index.py -i /mnt/data/commoncrawl/CC-RRRR-MM/secresult/ -o /mnt/data/indexes/CC-RRRR-MM/ -s servers.txt start
Spuštění démonů odpovídajících na dotazy:
python ./daemon.py -i /mnt/data/indexes/CC-RRRR-MM/final -s servers.txt -b /mnt/data/commoncrawl/software/mg4j/ start
Run_local
Skripty slúžiace pre jednotné spúšťanie spracovania na KNOT serveroch. Spracovanie sa spúšťa skriptom run.py, ktorý spúšťa požadovaný krok podľa nastavení konfiguračného súboru config.ini, ktorý je potrebné pred spracovaním upraviť. V časti [shared] tohto súboru je potrebné nastaviť do premennej root_data cestu k zložke, ktorá sa bude spracovávať napr. /mnt/data/commoncrawl/CC-2016-36. Ostatné premenné ukazujú na zložky obsahujúce skripty a pod., tieto premenné nie je potrebné upravovať. Ďalšie časti konfiguračného súboru sú bližšie popísané pri konkrétnych krokoch spracovania. Je vhodné si tento súbor niekde nakopírovať napr. do home, aby základny súbor ostal nemenený.
Po spustení sa na každom serveri, na ktorom sa má uskutočniť spracovanie vytvorí screen s názvom v tvare MENO_UZIVATELA-proc-NAZOV_KROKU
, v ktorom beží konkrétny krok. Pomocou skriptu je možné všetky screeny ukončiť, zadaním parametru -a kill.
Cesta k skriptu:
./processing_steps/run_local/run.py
Spustenie:
-c --config povinný parameter, udáva cestu ku konfiguračnému súboru config.ini -p --proc povinný parameter, špecifikuje krok spracovania, možnosti sú: vert, tag, pars, sec, index, index_deamon, shards nebo jejich číselné hodnoty resp. (2, 4, 5, 6, 7, 8, 9). Také se dá použit hodnotu 'test' pro testování kroků. Ekvivalentní číselná hodnota není. Při použití tohoto parametru je taky třeba nastavit krok v parametru -e. -a --action nepovinný parameter, špecifikuje akciu, ktorá sa má uskutočniť, možnosti sú: start, kill, check, progress a eval. Základne nastavenie je start. -s --servers nepovinný parameter, udáva cestu k súboru so zoznamom serverov, na ktorých sa má spustiť spracovanie. Bez tohto parametru sa spracovanie uskutoční len lokálne. -t --threads nepovinný parameter, udáva počet vlákien pre spracovanie -e --examine povinný parametr ve případě udání varianty test u parametru -p 2 argument je v tom případě jeden z kroků (vert, tag, pars, sec, index) nebo jeho číselná hodnota. -l --logging nepovinný parametr, zapíná výpis výstupu testu do souborů ve složce s logy. Soubory mají příponu test_* nebo main_* -h --help vypíše nápovedu
Nastavenie vertikalizácie je v časti [vert] konfiguračného súboru config.ini
. Premenná exe_path
udáva cestu k skriptu vertikalizátoru. Premenné input_dir, output_dir
a log_path
udávaju cestu k vstupnej, výstupnej a zložke s logmi. Proměnná no_log
slouží pro vypínání a zapínání tvorby logů. Stoplist_path
je cesta k súboru so zoznamom stop slov.
Príklad spustenia vertikalizácie:
./processing_steps/run_local/run.py -c ~/config.ini -s ~/servers.txt -p vert
Servers are sequentially launched as well as workers on port specified in config file. Variables in section [dedup] need to be set. Také se ve složce s run.py
musí nacházet script dedup_handler.py
, zodpovědný za spouštění serverů a workerů.
Proměnné
exe_path - cesta ke složce se soubory server.py a deduplicate.py bin_path - cesta ke složce se spustitelnými soubory input_path - složka s vertikály output_path - výstupní složka map_file - cesta ke souboru hashmap.conf, pro běžné spouštění není důležité. log_path - složka pro logy progress_tester - cesta k souboru dedup_check.py hash_path - cesta ke složce z hash port - port na kterém budou běžet workery a servery. dropped - True nebo False, odpovídá za argument -dr --dropped droppeddoc - True nebo False, odpovídá za argument -dd --droppeddoc debug - True nebo False, odpovída za argument -d --debug near_dedup - True nebo False, odpovídá za argument -n --near
Příklad spouštění:
python3 ./processing_steps/run_local/run.py -c ~/config.ini -s ~/servers.txt -p dedup
Kontrola postupu deduplikaci:
python3 ./processing_steps/run_local/run.py -c ~/config.ini -s ~/servers.txt -p dedup -a progress
Nastavenie v časti [tag] v súbore cofig.ini
. Obsahuje premenné exe_path, input_path, output_path, log_path
s rovnakým významom ako u vertikalizácie. Ďalšie parametre sú remove_uri
, ktorý zapne/vypne odstraňovanie uri z odkazov a ttagger_path
, udávajuci cestu k inštalačnému adresáru TreeTagger.
Príklad spustenia pre tagging:
./processing_steps/run_local/run.py -c ~/config.ini -s ~/servers.txt -p tag
Nastavenie v časti [pars] v súbore cofig.ini
. Obsahuje premenné exe_path, input_path, output_path, log_path
s rovnakým významom ako u vertikalizácie + tagging. Premenná config_path
udáva cestu ku konfiguračnému súboru pre parsing..
Príklad spustenia pre parsing:
./processing_steps/run_local/run.py -c ~/config.ini -s ~/servers.txt -p pars
Časť súboru [sec], obsahuje rovnaké základne premenné ako v predchadzajúcich krokoch. Navyše obsahuje premennú config_path, ktorá udáva cestu k súboru obsahujúcemu dotaz na SEC vo formáte json.
Príklad spustenia pre SEC:
./processing_steps/run_local/run.py -c ~/config.ini -s ~/servers.txt -p sec
Funkcia skriptu pre prípravu indexácie. Vo výstupnej zložke sa každom serveri vytvorí požadovaný počet kolekcií, do ktorých sa rovnomerne rozdistribujú súbory zo vstupnej zložky vo formáte mg4j (výstup zo SEC). V časti konfiguračného súboru [shards] je možné upraviť vstupnú, výstupnú zložku a počet požadovaných kolekcií, který se určuje podle počtu jader procesoru. Výstupní složka může ale nemusí existovat.
Príklad spustenia pre vytvorenie a populáciu kolekcií:
./processing_steps/run_local/run.py -c ~/config.ini -s ~/servers.txt -p shards
Funkcia skriptu, ktorá spustí indexáciu kolekcií. Vstupom je zložka obsahujúca všetky kolekcie, výstup sa ukladá do jednej zložky pre všetky kolekcie (final). Premenné je možné upraviť v časti konfiguračného súboru [index].
Príklad spustenia indexácie:
./processing_steps/run_local/run.py -c ~/config.ini -s ~/servers.txt -p index
Časť konfiguračného súboru [index_deamon]. Obsahuje premenné exe_path
ktorá udáva cestu k indexátoru, input_path
, ktorá udáva cestu k zložke final, nad ktorou pobeží démon a log_path
je cesta k zložke do ktorej budú uložené logy. Pokiaľ je premenná log_path
nastavená na "/" logy sa neukladajú. Ďalšie premenné sú port_number
, ktorá udáva číslo portu, na ktorom pobeží démon a config_path
je cesta ku konfiguračnému súboru pre indexátor.
Príklad spustenia démonov:
./processing_steps/run_local/run.py -c ~/config.ini -s ~/servers.txt -p index_deamon
Skripty poskytují možnost kontroly přítomnosti výstupních souborů a správností kompletností jejích obsahu po jednotlivých krocích zpracování.
Principem zpracování je načtení ze vstupních, výstupních a případně log souborů odkazů a porovnání jejích přítomností v ostatních souborech. Při nalezení neshody vypíše chyby na stdout nebo do souboru. Nejčerstvější verzi se dá najít ve větvi "test_scripts_xgrigo02" ve složce processing_steps/step_check/.
Použití
python3 step_check.py -i IN_PATH -o OUT_PATH -l LOGS_PATH -t STEP -s [-c PATH_TO_CONFIG]
Parameters:
-c PATH, --config PATH Path to config file. If config path was specified, then arguments -i, -o and -l will be ignored, there values will be obtained from config. -t STEP, --target STEP Step for script to test. Possible STEP values: '2' or 'vert' '3' or 'dedup' '4' or 'tag' '5' or 'pars' '6' or 'sec' '7' or 'index' Implicit value is 'vert' -i IN_PATH, --input_path Path with input files -o OUT_PATH, --output_path Path with output files -l LOG_PATH, --log_path Path with log files to check. Also test output will be saved there, if -s option was specified -s, --save_out Enable output writing to log file -h, --help Prints this message --inline Enables inline output
Jsou dvě možností spouštění, nastavit argumenty -i, -o a -l, nebo ukázat cestu do config souboru, všechny potřebné údaje se potom přečtou z něj. Argumenty -i, -o a -l tím pádem budou potlačeny.
Výstup skriptů při specifikaci parametru -s bude uložen do souborů s přípony .test_out nebo .main_out. Při dokončení testů nad dvojicí souborů bude taky vytvořen soubor .tested, což znamená bezchybové ukončení skriptů.
Pro spouštění skriptem run_local
je třeba nastavit exe_path
v sekci [test] souboru. Ten se dá najít ve složce corpora_processing_sw/processing_steps/run_local/config.ini.
Spuštění pomocí run.py:
python3 run.py -a start -p test -e vert -l -c ~/config.ini -s ~/servers.txt
Příklad ručního spouštění:
python3 step_check.py -i ./warc_path -o ./vert_path -l ./logfiles/verticalization -t vert -s
nebo:
python3 step_check.py -c ./config.ini -t vert
ls -1 /scratch/work/user/idytrych/warc | sed 's/\-warc.gz//' > ~/namelist or ls -1 /scratch/work/user/idytrych/wikitexts/ > ~/namelist
seq 14 > numtasks
bash createCollectionsList_single.sh 192
#PBS -q qexp např. za #PBS -q qprod #PBS -A IT4I-9-16
and add:
#PBS -l walltime=48:00:00
bash prepare_dl_warc_single.sh 2015-3 Stažení CC (manuálně na login uzlech): /scratch/work/user/idytrych/CC-2015-32/download/dload_login1_all.sh /scratch/work/user/idytrych/CC-2015-32/download/dload_login2_all.sh /scratch/work/user/idytrych/CC-2015-32/download/dload_login3_all.sh /scratch/work/user/idytrych/CC-2015-32/download/dload_login4_all.sh ls /scratch/work/user/idytrych/CC-2015-32/warc/ | sed 's/\-warc.*//g' > ~/namelist mv /scratch/work/user/idytrych/CC-2015-32/warc /scratch/work/user/idytrych/ wc -l namelist (vypsaný počet řádků v namelist je NNN - budeme potřebovat níže) (spočítáme NU = NNN / MU, kde MU je max. počet uzlů, co podle dokumentace Salomonu smíme použít paralelně) seq NU >numtasks qsub -N vert -J 1-NNN:NU vert.sh qsub dedup.sh qsub -N tag -J 1-NNN:NU tag.sh qsub -N parse -J 1-NNN:NU parse.sh secapi/SEC_API/salomon/v3/start.sh 3 (M je počet kolekcí - mělo by být cca 6 na každý cílový server) bash createCollectionsList_single.sh M (dále předpokládáme, že je dost uzlů na to, aby při 24 i při 8 procesech na uzel bylo možné zpracovat všechny kolekce paralelně) seq 24 >numtasks qsub -N createShards -J 1-M:24 createShards.sh qsub -N populateShards -J 1-M:24 populateShards.sh qsub -N makeCollections -J 1-M:24 makeCollections.sh seq 8 >numtasks qsub -N makeIndexes -J 1-M:8 makeIndexes.sh
(NP je počet částí, na které chceme Wikipedii rozdělit - tedy počet cílových serverů) bash createWikiParts_single.sh NP (Neotestovaná část: ) bash download_and_split_wikipedia_single.sh 20150805 qsub -N extract_wikipedia extract_wikipedia_html.sh ls -1 /scratch/work/user/idytrych/wikitexts/ > ~/namelist wc -l namelist (vypsaný počet řádků v namelist je NNN - budeme potřebovat níže) (spočítáme NU = MAX(14, (NNN / MU)), kde MU je max. počet uzlů, co podle dokumentace Salomonu smíme použít paralelně - tedy nemá smysl méně než 14 na uzel) qsub -N vertWiki -J 1-NNN:NU vertWiki.sh qsub -N tagWiki -J 1-NNN:NU tag.sh qsub -N parseWiki -J 1-NNN:NU parseWiki.s (spočítáme NUL = MAX(3, (NNN / MUL)), kde MUL je max. počet uzlů, co podle dokumentace Salomonu smíme použít paralelně v qlong - tedy nemá smysl méně než 3 na uzel) secapi/SEC_API/salomon/v3/start.sh NUL (M je počet kolekcí - měla by být 1 na každý cílový server) bash createCollectionsList_single.sh M (dále předpokládáme, že je dost uzlů na to, aby při 24 i při 8 procesech na uzel bylo možné zpracovat všechny kolekce paralelně) seq 24 >numtasks qsub -N createShards -J 1-M:24 createShards.sh qsub -N populateShards -J 1-M:24 populateShards.sh qsub -N makeCollections -J 1-M:24 makeCollections.sh seq 8 >numtasks qsub -N makeIndexes -J 1-M:8 makeIndexes.sh
ls -1 /scratch/work/user/idytrych/warc | sed 's/\-warc.gz//' > ~/namelist or ls -1 /scratch/work/user/idytrych/wikitexts/ > ~/namelist
bash prepare_dl_warc_single.sh 2015-32 Stažení CC (manuálně na login uzlech): /scratch/work/user/idytrych/CC-2015-32/download/dload_login1_all.sh /scratch/work/user/idytrych/CC-2015-32/download/dload_login2_all.sh /scratch/work/user/idytrych/CC-2015-32/download/dload_login3_all.sh /scratch/work/user/idytrych/CC-2015-32/download/dload_login4_all.sh ls /scratch/work/user/idytrych/CC-2015-32/warc/ | sed 's/\-warc.*//g' > ~/namelist mv /scratch/work/user/idytrych/CC-2015-32/warc /scratch/work/user/idytrych/ bash start.sh vert 10 qprod (lze opakovat N-krát a přidat tak další uzly - místo 10 lze i po 20 - ale celkově není dobré dát přes 70 uzlů) bash start.sh dedup 4 qprod (nelze přidávat uzly) bash start.sh tag 10 qprod (lze opakovat N-krát a přidat tak další uzly - místo 10 lze i po 20 - ale celkově není dobré dát přes 40 uzlů) bash start.sh parse 10 qprod (lze opakovat N-krát a přidat tak další uzly - místo 10 lze i po 25 - ale celkově není dobré dát přes 90 uzlů) bash start.sh sec 1 qprod (lze opakovat N-krát a přidat tak další uzly - místo 1 lze i po 50, ale poprvé po 1. 10 min. pauza na build a celkově není dobré dát přes 100 uzlů) mkdir /scratch/work/user/idytrych/CC-2015-32/mg4j_index mkdir /scratch/work/user/idytrych/CC-2015-32/mg4j_index/final (MMM je počet požadovaných kolekcí - vhodný může být počet cílových serverů * 6) bash startIndexing.sh cList MMM bash startIndexing.sh cShards qprod /scratch/work/user/idytrych/CC-2015-32/mg4j_index bash startIndexing.sh pShards qprod /scratch/work/user/idytrych/CC-2015-32/mg4j_index bash startIndexing.sh colls qprod /scratch/work/user/idytrych/CC-2015-32/mg4j_index bash startIndexing.sh indexes qprod /scratch/work/user/idytrych/CC-2015-32/mg4j_index ...
bash start.sh vert 1:f qprod bash start.sh vert 50 qprod (tedy 1. uzel se spustí zvlášť a musí být zaručeno, že poběží po celou dobu zpracování - případně využít qlong) (další uzly lze spouštět libovolně rychle a může jich být neomezené množství - i když nemá smysl dát moc přes 150 - pak nestíhají disky) bash start.sh dedup 4 qprod bash start.sh tag 1:f qprod bash start.sh tag 50 qprod bash start.sh parse 1:f qprod bash start.sh parse 50 qprod bash start.sh sec 1:f qlong bash start.sh sec 20 qprod
bash startCheckSec.sh qprod namelist 2 1 /scratch/work/user/idytrych/parsed /scratch/work/user/idytrych/secsgeresult bash startCheckSec.sh qprod namelist 2 2 /scratch/work/user/idytrych/parsed /scratch/work/user/idytrych/secsgeresult (2 1 je počet částí a která se má spustit - s více částmi lze rychleji dosáhnout výsledku; dalšímu příkazu se počet částí předá -n) python remove.py -n 2 -s /scratch/work/user/idytrych/secsgeresult >rm.sh sed "s/secsgeresult/sec_finished/;s/.vert.dedup.parsed.tagged.mg4j//" rm.sh >rmf.sh bash rm.sh bash rmf.sh rm rm.sh rm rmf.sh bash create_restlist_single.sh namelist /scratch/work/user/idytrych/secsgeresult >restlist rm /scratch/work/user/idytrych/counter/* bash start.sh sec 1:f qlong restlist bash start.sh sec 20 qprod restlist
bash startCheckIndexes.sh /home/idytrych/collectionlist /scratch/work/user/idytrych/CC-2015-32/mg4j_index "/home/idytrych/check_i.txt" (na každém řádku v check_i.txt by měl být správný počet souborů indexu a současně by v žádném chybovém logu neměla být výjimka)
ls -1 /scratch/work/user/idytrych/warc | sed 's/\-warc.gz//' > ~/namelist nebo ls -1 /scratch/work/user/idytrych/wikitexts/ > ~/namelist
bash prepare_dl_warc_single.sh 2015-32 Stažení CC (manuálně na login uzlech): /scratch/work/user/idytrych/CC-2015-32/download/dload_login1_all.sh /scratch/work/user/idytrych/CC-2015-32/download/dload_login2_all.sh /scratch/work/user/idytrych/CC-2015-32/download/dload_login3_all.sh /scratch/work/user/idytrych/CC-2015-32/download/dload_login4_all.sh ls /scratch/work/user/idytrych/CC-2015-32/warc/ | sed 's/\-warc.*//g' > ~/namelist mv /scratch/work/user/idytrych/CC-2015-32/warc /scratch/work/user/idytrych/ rm /scratch/work/user/idytrych/counter/* bash start.sh vert 1:f qprod bash start.sh vert 50 qprod (tedy 1. uzel se spustí zvlášť a musí být zaručeno, že poběží po celou dobu zpracování - případně využít qlong) (další uzly lze spouštět libovolně rychle a může jich být neomezené množství - i když nemá smysl dát moc přes 150 - pak nestíhají disky) bash start.sh dedup 4 qprod rm /scratch/work/user/idytrych/counter/* bash start.sh tag 1:f qprod bash start.sh tag 50 qprod rm /scratch/work/user/idytrych/counter/* bash start.sh parse 1:f qprod bash start.sh parse 50 qprod rm /scratch/work/user/idytrych/counter/* bash start.sh sec 1:f qlong bash start.sh sec 20 qprod mkdir /scratch/work/user/idytrych/CC-2015-32/mg4j_index mkdir /scratch/work/user/idytrych/CC-2015-32/mg4j_index/final (MMM je počet požadovaných kolekcí - vhodný může být počet cílových serverů * 6) bash startIndexing.sh cList MMM bash startIndexing.sh cShards qprod /scratch/work/user/idytrych/CC-2015-32/mg4j_index bash startIndexing.sh pShards qprod /scratch/work/user/idytrych/CC-2015-32/mg4j_index bash startIndexing.sh indexes qprod /scratch/work/user/idytrych/CC-2015-32/mg4j_index
bash startCheckSec.sh qprod namelist 2 1 /scratch/work/user/idytrych/parsed /scratch/work/user/idytrych/secsgeresult bash startCheckSec.sh qprod namelist 2 2 /scratch/work/user/idytrych/parsed /scratch/work/user/idytrych/secsgeresult (2 1 je počet částí a která se má spustit - s více částmi lze rychleji dosáhnout výsledku; dalšímu příkazu se počet částí předá -n) python remove.py -n 2 -s /scratch/work/user/idytrych/secsgeresult >rm.sh sed "s/secsgeresult/sec_finished/;s/.vert.dedup.parsed.tagged.mg4j//" rm.sh >rmf.sh bash rm.sh bash rmf.sh rm rm.sh rm rmf.sh bash create_restlist_single.sh namelist /scratch/work/user/idytrych/secsgeresult >restlist rm /scratch/work/user/idytrych/counter/* bash start.sh sec 1:f qlong restlist bash start.sh sec 20 qprod restlist
bash startCheckIndexes.sh /home/idytrych/collectionlist /scratch/work/user/idytrych/CC-2015-32/mg4j_index "/home/idytrych/check_i.txt" (na každém řádku v check_i.txt by měl být správný počet souborů indexu a současně by v žádném chybovém logu neměla být výjimka)
Dobrý příklad manatee formátu lze stáhnout zde.
Konkrétně korpus SUSANNE.
Tento se liší od našeho v tom, že má jen 4 sloupce (my jich máme 27). Všechny tagy začínající na < v tomto formátu zůstávají, nic se nijak netransformuje jako v případě MG4J.
Tedy co se týče potřebných změn, tak to bude pouze nepřidávat GLUE jako variantu tokenu a negenerovat věci jako %%#DOC PAGE PAR SEN. V manatee se také místo prázdné anotace dává podtržítko (v mg4j 0). V manatee se pak navíc musí vytvořit konfigurační soubor, který definuje tagy a určuje cestu k vertikálnímu souboru, aby bylo možné to programem encodevert naindexovat.
Formát ElasticSearch pro sémantické anotace vypadá následovně:
Slovo[anotace1;anotace2...] a[anotace1;anotace2...] další[...;anotace26;anotace27] slovo[...;anotace26;anotace27]
Tvary anotací mohou být libovolné, avšak mohou obsahovat pouze alfanumerické znaky a podtržítko. Aktuálně je použit formát zápisu anotací, kde jedna anotace je ve tvaru typAnotace_hodnota
.
Typy anotací jsou:
position token tag lemma parpos function parword parlemma paroffset link length docuri lower nerid nertag param0 param1 param2 param3 param4 param5 param6 param7 param8 param9 nertype nerlength
Konkrétní anotovaný text pak tedy vypadá:
Slovo[position_1;token_Slovo...]
Pro sémantické dotazování se pak používají klasické Lucenovské dotazy (viz testovací dotaz v adresáři projektu).
Pro využití nového nástroje syntaxnet na analýzu textu a zároveň využití již stávajících a osvědčených nástrojů, vznikly 2 nové scripty - revert.py
a reparse.py
. Skript revert.py
slouží k převodu Vertikálu na vstup pro syntaxnet takovým způsobem, že veškeré tagy a odkazy umístí na konec souboru a přidělý jim číselné identifikátory, které následně použije skript reparse.py
, který z výstupu syntaxnetu obnoví veškeré tagy a odkazy.
Skript revert.py
:
./processing_steps/5/syntaxnet/revert.py
Použití:
./processing_steps/5/syntaxnet/revert.py INPUT_FILE OUTPUT_FILE
INPUT_FILE
- vstupní soubor, očekávaný soubor je výstupní soubor vertikalizátoruOUTPUT_FILE
- výstupní soubor použitelný pro nástroj syntaxnetSkript reparse.py
:
./processing_steps/5/syntaxnet/reparse.py
Použití:
./processing_steps/5/syntaxnet/reparse.py INPUT_FILE OUTPUT_FILE
INPUT_FILE
- vstupní soubor, očekávaný soubor je výstupní soubor syntaxnetu, kde na vstupu syntaxnetu byl výstup scriptu revert.pyOUTPUT_FILE
- výstupní soubor obohacený tagy a odkazySkripty pro stažení CommonCrawl 2014-35:
dload_warc.sh
- stahovací skript pro WARC. POZOR: je třeba přidat na konec řádku cílový soubor anebo stahovat obsah každého adresáře zvlášť.dload_wat.sh
- stahovací skript pro WAT. POZOR: je třeba přidat na konec řádku cílový soubor anebo stahovat obsah každého adresáře zvlášť.dload_wet.sh
- stahovací skript pro WET. POZOR: je třeba přidat na konec řádku cílový soubor anebo stahovat obsah každého adresáře zvlášť.lister.sh
- hlavní skript který stahuje segment.path a vytváří soubory dload_*.sh, list.*.sh, *.lst a vypočítává velikost souboru pro WARC, WAT a WETlist.WARC.sh
- vytvářecí skript pro listing WARClist.WAT.sh
- vytvářecí skript pro listing WATlist.WET.sh
- vytvářecí skript pro listing WETsegment.paths
- stažený soubor z popisem segmentůwarcs.lst
- listing WARC souborůwats.lst
- listing WAT souborůwets.lst
- listing WET souborůdl_warc.sh
- postupně spouští lister.sh pro vytváření listingu, creator.py se souborem warc.lst a spouští stahování na strojích, které jsou uvedeny v servers.cfgcreator.py
- vytváří stahovací skripty, pro standardní vstup se bere jeden ze souborů w*.lst, argumentem je cesta pro stažení, seznam strojů je v servers.cfgservers.cfg
- seznam strojů, ve tvaru jmeno_stroje počet_threadu
koeficient (všechno odděleno jednou mezerou), počet threadů a koeficient jsou celá čísla. Koeficient určuje podíl, který bude stažen (např. pokud v souboru jsou 3 stroje, které mají koeficienty 2, 1, 1, na první stroj bude staženo 2/4=1/2 všech souborů, na ostatní dva stroje po 1/4 na každý).wet2vert1.py
- skript na zpracování vertikálních souborů z WET: argumenty jsou vstupní adresář, výstupní adresář, počet processůOdkaz na TreeTagger, pouští se příkazem:
[cesta_k_corpproc/]tt/bin/tree-tagger -token -lemma -sgml -no-unknown [cesta_k_corpproc/]tt/lib/english.par
anebo pomoci skriptu tagger.py
z adresáře vert2ner.
parser.py
- rozdělí soubory mezí thready a pak spustí na každé skupině souborů mdparser.mdp.jar
- hlavní soubor, pouští se java -Xmx1g -jar mdp.jar props.xml (props.xml - je konfigurační soubor)props1.xml
- vzorový konfigurační soubor. POZOR: neměnit cestu ani obsah tohoto souboru, jinak skript parser.py nebude fungovat.tagger.py
- TreeTagger, argumenty jsou vstupní adresář, výstupní adresář, počet processůMnožství: WARC: 43430,7952731 GB (46633461334359 bytů), WAT: 14702,6299882 GB (15786828741075 bytů), WET: komprimované 5300,3036399 GB (5691157698008 bytů), nekomprimované 12319,1 GB. Statistiky po vertikalizaci (starý vertikalizátor): Počet souborů: 52 849 Počet dokumentů: 2 744 133 462 Počet odstavců: 316 212 991 122 Počet vět: 358 101 267 144 Počet slov (tokenů): 2 534 513 098 452