Wikilinks

Hlavním cílem projektu bylo vytvořit program, který pro datové sady ClueWeb a CommonCrawl vyextrahuje odkazy na Wikipedii podobné těm v datové sadě Wikilinks. Dalším úkolem bylo vyhodnotit rychlost vytvořeného nástroje. Veškerá funkcionalita je zaobalena do skriptu wikilinks.py, jehož detailní popis je uveden níže na stránce.

Obsah

1 Popis skriptu wikilinks.py

Vzhľadom na skutočnosť, že je potrebné pri každom s WARC záznamov určiť o aké dáta sa jedná, prípadne v akej znakovej sade sú napísané program vyraďuje z analýzy záznamy, ktoré nie sú typu application/http;msgtype=response alebo application/https; msgtype=response. Každý záznam, ktorý vyhovuje predošlej podmienke by mal obsahovať HTTP hlavičku a v nej určený typ obsahu. Nepredpokladá sa, že obsah typu text/html alebo image/jpeg bude obsahovať linky a teda sa analyzuje iba obsah typu text/html.

Z HTTP hlavičky sa v niektorých prípadoch dá určiť znaková sada daného dokumentu. Ak je to možné, tak je zistená. Ďalej prebieha hľadanie špecifikácie znakovej sady v tele HTTP záznamu (konkrétne HTML metatagy). Znaková sada zistená z HTML má vyššiu prioritu ako tá zistená z HTTP hlavičky. V Prípade že sa špecifikáciu znakovej sady nepodarilo nikde nájsť, je na rozluštenie použitá východzia znaková sada pre HTTP a to ISO-8859-1. Ak nie je možné niektoré zo znakov preložiť do UTF-8 sú ignorované.

Následuje vyhľadávanie odkazov. Vyhľadávanie funguje vďaka regulárnym výrazom. Vyhľadávajú sa klasické html linky (<a>). Ak je vyhľadaný odkaz odkazom na Wikipediu alebo Freebase, je zistený jeho offset, odkazovaný text, odkazovaný text bez HTML entit, text pred a za odkazom (bez HTML tagov a entit), normalizovaná adresa bez HTML entít, adresa zdroja a offset odkazovaného textu. Následne je to spolu s označením znakovej sady a menom zdrojového súboru uložené do výstupného súboru.

Za predpokladu, že niektoré informácie sa nedajú zistiť (napr. text pred odkazom), program uloží na ich miesto prázdný reťazec (možné zmeniť v constants.py).

Program ukladá z Wikipedie len linky z menného priestoru 0. Táto filtrácia sa prevádza na základe prítomnosti znaku ":" v názve wikipediové stránky. Ak sa v názve stránky nachádza ":[^_]" je považovaná za stránku z iného menného priestoru Wikipedie ako 0. Daná funkcia je takto implementovaná z dôvodu jednoduchosti. Názvy menných priestorov na Wikipedii sa totiž menia s jazykovou lokalizáciu Wikipedie.

Program je tiež schopný vyhľadávať len linky na Freebase alebo Wikipediu (túto voľbu je možné spraviť pomocou prepínačov -f a -w).

Existuje aj možnosť odfiltrovať len linky na anglickú verziu Wikipedie -e prípadne iné jazykové verzie Wikipedie -l. Program pri tejto možnosti rozhodne o jazykovej príslušnosti danej Wiki stránky na základe jej domény 3. (resp 4.) rádu.

Za predpokladu, že existuje aj súbor obashujúci dáta o presmerovaniach na Wikipedii je možné aby program neukladal do druhého poľa priamo URL adresu nájdenú vo Warc dokumente ale adresu na ktorú sa táto URL presmerováva -r.

Program ukladá správy o svojej činnosti do súboru s menom <vystupny>.log.

Počet ukladaných slov pred a za odkazom je možné upraviť v constants.py.

1.1 Rozšíření funkcionality o zpracování vert formátu

Skript wikilinks.py nyní umožňuje zpracovávat jak WARC soubory, tak VERT soubory. Spouštění a použití skriptu zůstává stejné, skript sám podle vstupního souboru rozpozná o jaký formát se jedná a podle toho jej dále zpracovává.

VERT soubor obsahuje vertikalizovaná data, kde jsou tokeny (slova) vkládány pod sebe, čili jsou oddělovány odřadkováním \n. . Záznam v takovém souboru pak začíná a končí tagy <doc zde se nachází id, url a title příslušného dokumentu> a </doc>. Jednotlivé odkazy v dokumentu jsou uvozeny tagem <link="url na wikipedii/freebase/ostatní"/>, na stejném řádku se nachází i tag <length="číslo"/> značící počet tokenů (slov) tvořících text odkazu, ty se nachází před tagem <link>. Pro zpracování formátu je využito převážně regulárních výrazů.

1.2 Rošírenie funkcionality o nahradenie CUID v URL

Toto sa týka adries Wikipédie a procesu ich normalizovania. V adrese, ktorá pôvodne obsahovala CIUD článku napr. http://en.wikipedia.org/wiki/index.html?curid=75960 je časť cesty za .../wiki/ v tejto adrese nahradená titulkom tohto článku (https://en.wikipedia.org/wiki/KPMG pre predchádzajúci príklad). Pre aktivovanie tejto funkcionality je potrebné spustiť skript s prepínačom -p nasledovaným .tsv súborom, v ktorom sa na jednotlivých riadkoch nachádzajú dvojice CUID a title (napr. "75960\tKPMG"). Tento súbor sa pri spustení skriptu načíta do pamäte a pri normalizácii sa suffix s konkrétnym CUID v URL nahradí príslušným titulkom článku.

Cesta k súboru:

 /mnt/minerva1/nlp/projects/decipher_wikipedia/redirectsFromWikipedia/enwiki-latest-page.sql
        

1.3 Parametry skriptu wikilinks.py

Spuštění:

 wikilinks.py -i <input_file> -o <output_file> [-p <path>] [-v] [-w] [-f] [-e] [-l <language>[:<language>]] [-r <redirection_file>] [-s] [-d <disambiguation_file>] [-W] [-h] [-a <all_url_file>] [-k]
        

Parameter -p možné použiť pri analýze Clueweb12 kde je dostupný súbor obsahujúci zoznam warc súborov s ich relativnými cestami.

Příklad spouštění pro jeden vybraný archív je uveden ve skriptu:

 /mnt/minerva1/nlp/projects/wikilinks/test/test.sh
        

1.4 Popis významu souborů se zdrojovými kódy

Zdrojové soubory projektu Wikilinks se nacházejí v adresáři:

 /mnt/minerva1/nlp/projects/wikilinks/program/
        

Význam jednotlivých zdrojových souborů je následující:

 wikilinks.py - Samotny program na extrakciu linkov na Wikipediu a Freebase
 warcm.py - modul pre prácu s warc súbormi
 vert.py - modul pro práci s vert soubory
 httpm.py - modul, ktorý zaobstaráva čítanie potrebných údajov z HTTP hlavičky
 constants.py - konštanty

1.5 Popis výstupního formátu

Výstupní soubory jsou ve formátu TSV (Tab-Separated Values). Význam jednotlivých sloupců je následující:

 ------+-------------------------------------------------
 Číslo | HODNOTA
 ======+=================================================
  1    | Originálna adresa   
 ------+-------------------------------------------------
  2    | Normalizovaná adresa   
 ------+-------------------------------------------------
  3    | Text odkazu (bez HTML entít)
 ------+-------------------------------------------------
  4    | Originálny text odkazu     
 ------+-------------------------------------------------
  5    | Kontext pred odkazom (bez HTML entít)
 ------+-------------------------------------------------
  6    | Kontext za odkazom (bez HTML entít)
 ------+-------------------------------------------------
  7    | Kódovanie (originálnej stránky)
 ------+-------------------------------------------------
  8    | Offset adresy v pôvodnom WARC/VERT súbore
 ------+-------------------------------------------------
  9    | Offset textu odkazu v pôvodnom WARC/VERT súbore
 ------+-------------------------------------------------
  10   | Názov pôvodného WARC/VERT súboru                         
 ------+-------------------------------------------------
  11   | URL příslušného dokumentu ve WARC/VERT souboru                      
 ------+-------------------------------------------------
        

2 Automatizace spouštění nástroje Wikilinks

Skript pro automatické spouštění nástroje Wikilinks se nachází v:

 /mnt/data/nlp/projects/wikilinks/runWikilinks.sh
        

Je nutné spouštět jej s povinnými parametremy:

Pro úspěšné spuštění je třeba nastavit si přihlašování pomocí ssh klíčů na stroje, na kterých se budou data zpracovávat a zapsat jejich jména do souboru:

 /mnt/data/nlp/projects/wikilinks/servers.txt
        

Po spuštění spouští skript runWikilinks.sh tyto skripty v daném pořadí:

list.sh, list_dirs.sh - vytváří seznam souborů pro zpracování jednotlivými stroji
 split.sh - rozdělí vytvořený seznam pro více procesů
 prepare.sh - připraví adresáře pro výsledky Wikilinks
 run.sh - spouští nástroj Wikilinks na všech strojích v servers.txt (po spuštění probíhá kontrola zda Wikilinks dokončil činnost dále)
 copy.sh - zkopíruje výsledky ze všech strojů na minerva1.fit.vutbr.cz
        

Průběh skriptu je zaznamenáván do:

 /mnt/data/nlp/projects/wikilinks/autorunOutput.log
 /mnt/data/nlp/projects/wikilinks/autorunError.log
        

2.1 Příklad spuštění

 ./runWikilinks.sh -l iotrusina -s /mnt/data/commoncrawl/CC-2015-06/ -d /mnt/data/nlp/projects/wikilinks/results.CC-2015-06/ -w
        

Poznámka:
Skript běží dlouhou dobu, a proto je dobré spouštět jej přes screen.


3 Rýchlosť spracovania CommonCrawl 2014

Uvedené časy predstavujú odhad doby po ktorú bude prebiehať analýza danej časti CommonCrawl 2014 uloženej na jednotlivých strojoch.

Stroj Počet souborů 1 proces 2 procesy 3 procesy 4 procesy 5 procesů 6 procesů
knot01 2500 192:21:07 98:59:31 70:23:59 53:55:42 40:49:35 37:28:19
knot03 2500 112:46:48 61:00:58 39:32:38 31:49:12 26:10:57 25:22:56
knot04 2500 116:28:20 63:05:04 41:55:47 33:26:21 24:45:13 24:34:53
knot05 2600 128:58:11 65:43:50 44:50:05 35:59:16 28:19:13 27:28:51
knot06 2500 115:49:10 58:59:10 42:36:59 30:47:32 24:38:07 21:32:13
knot07 2500 114:32:38 58:57:01 42:39:27 30:55:40 26:51:25 22:19:48
knot08 2700 122:51:36 62:10:48 42:11:48 34:15:05 31:29:38 26:20:27
knot10 2600 115:47:47 52:34:57 36:45:08 27:36:03 23:27:30 19:33:34
knot11 2200 87:14:54 46:49:46 10:38:42 24:32:21 19:27:05 16:42:27
athena3 2700 104:35:51 56:23:20 37:19:09 27:11:53 23:42:00 20:12:17
athena2 2100 65:13:28 33:27:54 24:09:19 17:06:51 14:07:46 12:39:36
knot14 2100 83:13:48 37:41:42 37:08:53 26:42:57 22:29:44 17:42:52
knot15 2100 52:24:24 29:11:31 20:07:23 14:50:38 12:16:03 09:29:28
knot16 2100 56:42:56 29:29:54 24:36:32 20:29:35 17:52:11 17:07:22
knot17 2100 69:30:29 31:06:02 24:48:12 21:45:46 19:29:25 16:10:47
knot18 2100 92:17:35 49:52:09 34:15:19 26:23:49 20:55:41 17:59:25
knot19 2100 75:19:05 44:09:02 34:44:27 28:17:23 22:39:17 18:55:44
knot20 2100 67:19:14 38:36:01 31:22:48 26:02:59 21:03:23 16:37:21
knot21 2100 64:03:42 32:14:10 23:18:45 20:10:55 18:43:55 17:07:27
knot22 2100 86:28:38 49:30:10 33:37:08 25:25:29 20:17:49 16:01:15
knot23 2100 63:20:18 50:32:17 33:36:58 25:24:19 21:35:29 16:58:37
knot24 2100 50:41:02 27:54:03 19:10:53 14:48:27 10:59:45 09:59:11
knot25 2700 147:13:30 76:50:11 50:02:03 39:45:54 32:17:29 27:46:18
athena1 2700 75:02:42 39:11:11 27:23:12 20:47:35 17:07:30 14:20:14

4 Porovnání s originálními Wikilinks

Pri tomto porovnaní bol spracovaný raw súbor [2] zo sady Wikilinks a porovnaný s dátami vyextrahovanými v rámci projektu Wikilinks [1].

Je nutné poznamenať, že neboli spracované celé súbory ale len ich časť a to z dôvodu výpočtovej náročnosti.

Póvodný full-context súbor [2] musel byť rozdelený na časti a tieto následne spojené do warc súboru, ktorý bol následne analyzovaný pomocou Wikilinks. Program totiž (pri rozumnej pamäťovej náročnosti) nedokáže spracovávať tak dlhé záznamy (13 GB). Spracováva totiž jeden warc záznam za druhým a každý zvyčajne obashuje jedinú stránku (a teda pár KB).

Jediné 2 položky, ktoré bolo možné vo výstupoch porovnávať sú adresy jednotlivých wikipediových stránok a text použitý v ich odkazoch.

Podstatný rozdiel medzi originálními Wikilinks a našimi Wikilinks je ten, že medzi vyextrahovanými odkazmi z originálních Wikilinks sa nachádzajú aj odkazy do iného menného priestoru Wikipedie ako 0. Nachádzajú sa tam teda odkazy na obrázky, súbory a podobne. Isté rozdiely mohli vzniknúť aj normalizovaním presmerovania. Ďaľšie rozdiely vznikli odlišným záznamom bielych znakov a podobne.

 [1] http://iesl.cs.umass.edu/downloads/wiki-link/context-only/001.gz
 [2] http://iesl.cs.umass.edu/downloads/wiki-link/full-content/part1/001.gz
        

4.1 Samotné výsledky

 Počet odkazov nájdených v rámci Wikilinks (originální): 123810
 Počet odkazov nájdených pomocou Wikilinks: 187985
 Počet prekrývajúcich sa odkazov: 102185
 Počet odlišných odkazov: 110547
        

"Počet odlišných odkazov" je počet odlišných riadkov vo výstupe originálních Wikilinks a našich Wikilinks a "Počet prekrývajúcich sa odkazov" je počet rovnakých odkazov v týchto výstupoch.

Čísla boli získané následovným spôsobom:

 diff clueweb12.out wikilinks.out | wc -l
 comm -1 -2 out1.out.sorted 001.out.sorted | wc -l
        

Výsledky je možné nájsť v:

 /mnt/minerva1/nlp/projects/wikilinks/porovnani/
        

5 Histogram stejných kontextů odkazů

Zadáním bylo vytvořit skript pro analýzu stejných kontextů odkazů a vytvoření jejich histogramu z výsledku nástroje Wikilinks na datech CommonCrawl.

5.1 Provedení a spouštění

Skript duplicateContexts.py načítá data ze zadaného adresáře a hledá duplicitní kontexty odkazů mezi všemi soubory. Duplicitní kontexty odkazů sloučí a spočítá jejich počet. Nad těmito záznamy provede setřízení podle odkazů a vypíše je do souboru do adresáře RESULTS spolu s výpisem dalších doplňujících dat.

Skript je umístěn v:

 /mnt/minerva1/nlp/projects/wikilinks/duplicateContexts.py
        

Spouštění:

 ./duplicateContexts.py [-f FOLDER] [-n NUMBER] [-W]
        

Pro výstup skriptu se vytvoří ve zpracovávaném adresáři složka RESULT, která obsahuje soubory:

script.result

Obsahuje histogram kontextů odkazů po řádku ve formátu:

 01 Normalizovaná adresa        
 02 Kontext pred odkazom (bez entit)    
 03 Kontext za odkazom 
 04 Počet duplicitních kontextů odkazů
        

Jednotlivé sloupce v souboru jsou odděleny tabulátory.

script.result.log

Obsahuje doplňující informace, jako jsou celkový počet řádku všech souborů, počet jedinečných kontextů odkazů, počet duplicitních kontextů odkazů a doba trvání dílčích částí zpracovávání skriptu.

duplicate.N.result

V těchto souborech jsou uloženy nejvíce se opakující duplicitní kontexty odkazů.

5.2 Výstup

Skript byl testován nad daty:

 /mnt/minerva1/nlp/projects/wikilinks/results.CC-2014-49
        

Výstup je uložen v:

 /mnt/minerva1/nlp/projects/wikilinks/results.CC-2014-49/RESULTS
        

5.3 Výpis domén z výsledků

Skript domains.py načítá data ze zadaného adresáře, který obsahuje výsledky skriptu duplicateContexts.py a vypisuje ze souborů duplicateN.result domény.

Skript je umístěn v:

 /mnt/minerva1/nlp/projects/wikilinks/domains.py
        

Spouštění:

 ./domains.py [-f FOLDER] [-H]

5.3.1 Výstupní soubory

domains.result

Obsahuje názvy souborů a pod každým z nich jsou vypsány domény + jejich počet.

domains.histogram.result

Obsahuje histogram domén + jejich počet ze všech zpracovávaných souborů.

moreDomainFiles.result

Obsahuje soubory, které obsahují více než 1 doménu a jejich počet.


6 Grafická vizualizace časů zpracování

6.1 Porovnanie času

Zadaním bolo porovnať ako dlho trvalo spracovávanie dátových sád CC-2014-49 a CC-2014-52 na jednotlivých strojoch na základe súborov *.result.log v následujících adresároch. Dále získať celkový čas trvania každého procesu, rozdielom času začiatku a konca procesu z príslušného súboru .log a následne vytvoriť graf pomocou nástroja gnuplot.

 /mnt/minerva1/nlp/projects/wikilinks/results.CC-2014-49
 /mnt/minerva1/nlp/projects/wikilinks/results.CC-2014-52
        

6.1.1 Skript

Skript processingTime.py je umiestnený v:

 /mnt/minerva1/nlp/projects/wikilinks/charts/processingTime.py
        

Spustenie:

 ./processingTime.py DIR OUTPUTFILENAME
        

Formát vytvořeného souboru je:

 [por. číslo]  [stroj.vlákno]  [čas v tvare hh:mm:ss] [čas v sekundách]
        

6.1.2 Výstupy

Časy spracovávania sad CC-2014-49 a CC-2014-52 sú umiestnené v:

 /mnt/minerva1/nlp/projects/wikilinks/results.CC-2014-49/timeComparision-2014-49.dat
 /mnt/minerva1/nlp/projects/wikilinks/results.CC-2014-52/timeComparision-2014-52.dat
        

gnuplot skript timeChart.gpl slúži na vytvorenie grafov na základe týchto dvoch súborov:

 /mnt/minerva1/nlp/projects/wikilinks/charts/timeChart.gpl
        

Výsledné obrázk timeComparision.CC-2014-49.png a timeComparision.CC-2014-52.png porovnávajú celkový čas trvania procesov na vláknach jednotlivých strojov v sekundách.

 /mnt/minerva1/nlp/projects/wikilinks/charts/timeComparision.CC-2014-49.png
 /mnt/minerva1/nlp/projects/wikilinks/charts/timeComparision.CC-2014-52.png
        

6.2 Porovnanie velkosti spracovávaných dát

Úlohou bolo vytvoriť graf ktorý bude zobrazovať veľkosť spracovávaných dát jednotlivými procesmi na základe súborov z adresárov:

 /mnt/minerva1/nlp/projects/wikilinks/results.CC-2014-49/list
 /mnt/minerva1/nlp/projects/wikilinks/results.CC-2014-52/list
        

6.2.1 Skripty

Skript dataSize.py nájde v adresári zadanom prvým argumentom všetky súbory ktoré vyhovujú regulárnemu výrazu zadanému druhým argumentom, vypočíta sumu všetkých dostupných súborov, ktoré súbor obsahuje, uloží ju do súboru, ktorého meno je dané tretím argumentom.

Umistenie:

 /mnt/minerva1/nlp/projects/wikilinks/charts/dataSize.py
        

Spustenie:

 ./dataSize.py DIR REGEX OUTPUTFILE
        

Skript associateFilesData.py slúži na spojenie dát z čiastkových súborov vytvorených pomocou prvého skriptu do jedného výstupného súboru, čiastkové súbory následne odstráni.

Umistenie:

 /mnt/minerva1/nlp/projects/wikilinks/charts/associateFilesData.py
        

Spustenie:

 ./associateFilesData.py DIR OUTPUTFILE
        

Formát vytvořeného souboru je:

 [por. číslo]  [meno_stroja.vlákno]  [veľkosť dát v GB]
        

6.2.2 Výstupy

Výsledné súbory sú uložené v:

 /mnt/minerva1/nlp/projects/wikilinks/results.CC-2014-49/list/dataSizeComparision.CC-2014-49
 /mnt/minerva1/nlp/projects/wikilinks/results.CC-2014-52/list/dataSizeComparision.CC-2014-52
        

Prislúchajúce grafy sú uložené v:

 /mnt/minerva1/nlp/projects/wikilinks/charts/dataSizeComparision.CC-2014-49.png
 /mnt/minerva1/nlp/projects/wikilinks/charts/dataSizeComparision.CC-2014-52.png
        

7 Deduplikace záznamů Wikilinks

K deduplikaci formátu Wikilinks je možné použít programy a skripty podrobněji popsané zde.

7.1 Spuštění

Deduplikaci zajišťují dva programy. Jedná se o program dedup a server.

Zdrojové kódy k nim jsou v git repozitáří (větev wikilinks):

 /mnt/minerva1/nlp/repositories/corpora_processing_sw/
        

a to ve složce:

 /mnt/minerva1/nlp/repositories/corpora_processing_sw/processing_steps/3/dedup/
        

K překladu použijte Makefile.

Program dedup je tzv. "worker" a provádí samotnou deduplikaci. Ke svému běhu potřebuje běžící program server, což je tzv. "hash holder". Pro deduplikaci je tedy nutné, aby bězel alespoň jeden server a jeden worker. Princip deduplikace je ve zkratce: workery počítají hashe ze záznamů (jen určitých sloupců) a dotazují se serverů, jestli tento hash již znají. Pokud neznají, tak jde o unikátní záznam. Workerů i serverů může běžet 1 až N resp. 1 až M s tím, že N může být různé od M. Zpravidla se spouští na každém stroji jeden worker a na několika vybraných strojích běží i server.

7.1.1 Skripty

Protože spouštět N workerů a M serverů na různých strojích by bylo náročné a nepraktické, exitují skripty deduplicate.py a server.py, které toto obstarají.

Umístěny jsou v:

 /mnt/minerva1/nlp/repositories/corpora_processing_sw/processing_steps/3/
        

Skripty vyžadují programy dedup and server dostupné na všech strojích ve stejnému umístění (parametr -b). Dále se jim předávají soubory se seznamem workerů (parametr -w) a se seznamem serverů (parametr -s). Oba soubory mají stejný formát: na každý řádek jeden HOSTNAME. Oba skripty mají dále parametr -p zadání komunikačního portu.

U skriptu server.py jsou nepoviné parametry -i a -o specifikující vstupní/výstupní soubor pro načtení/uložení hashů. Servery běží na pozadí, takže pro jejich spuštění je nutné přidat parametr start, pro ukončení stop a pro restart restart (někdy nefunguje správně tedy lepší nepoužívat). Pokud není zadán ani jeden z volitelných parametrů start, stop nebo restart, skript pouze kontroluje stav severů a screenů ve kterých servery běží.

U skriptu deduplicate.py jsou také parametry -i a -o ovšem ve významu vstupní/výstupní složky pro deduplikaci. Pro zpravování Wikilinks je nutné použít parametr -wl. Dalším (nepovinným) parametrem je -n pro zapnutí tzv. near deduplikace.

7.1.2 Zkrácení kontextů

Pro deduplikaci je nutné, aby byly sloupce "Kontext pred odkazom" a "Kontext za odkazom" u všech deduplikovaných dat stejné.

K tomu je určen skript:

 /mnt/minerva1/nlp/projects/wikilinks/wikilinksConvertContext.py
        

Zkracuje kontexty na 10 slov.

Příkladem použití je:

 wikilinksConvertContext.py < vstupni_soubor >  vystupni_soubor
        

7.1.3 Launch example

 python server.py -s servers.txt -w workers.txt -p 11111 start
 # spustím servery na strojích v souboru servers.txt na portu 11111
 python server.py -s servers.txt -w workers.txt -p 11111
 # zkontroluji, zda jsou spuštěny
 python deduplicate.py -s servers.txt -w workers.txt -p 11111 -wl -i /mnt/data/wikilinks -o /mnt/data/wikilinks_dedup
 # spustím deduplikaci souborů ze složky /mnt/data/wikilinks a výstup ukládám do /mnt/data/wikilinks_dedup
 # paralelně na strojích ze souboru workers.txt (neardeduplikace se spustí pouze přidáním parametru -n)
        

7.2 Výpočet 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í) a dále se počítá hash 2. sloupce. Aby byl řádek duplicitní, musí oba předchozí přístupy odhalit shodu.

7.3 Deduplikace CommonCrawl

Tabulka s přehledem počtu záznamů wikilinks zpracovaných sad:

CC-2014-42 CC-2014-49 CC-2014-52 CC-2015-06 CC-2015-11 CC-2015-14 CC-2015-18 CC-2015-22 CC-2015-27 CC-2015-32 CC-2015-35 CC-2015-40 CC-2015-48 CC-2016-07 CC-2016-18 CC-2016-22 CC-2016-26 CC-2016-30 Součet
před deduplikací 92,814,880 45,171,854 40,843,668 36,321,605 38,847,017 35,095,339 42,807,744 41,439,440 34,624,096 38,110,741 40,552,152 28,382,908 40,465,043 38,538,458 31,179,951 30,295,311 25,488,631 42,734,222 723,713,060
po deduplikaci 15,454,213 13,160,368 15,007,065 13,497,642 14,595,606 13,713,196 15,482,543 15,294,670 13,497,513 14,283,612 14,417,289 11,401,264 14,225,466 14,258,449 12,869,089 13,065,771 10,712,890 13,986,207 248,922,853
po neardeduplikaci 11,675,540 10,235,720 11,497,064 10,364,118 11,368,100 10,739,974 11,928,285 11,856,781 10,605,308 11,125,573 11,296,278 9,061,115 11,252,212 11,159,926 10,046,860 10,266,312 8,333,024 10,897,033 193,709,223
po inkrementální deduplikaci 15,453,792 1,382,063 1,726,778 1,227,687 1,453,991 1,062,187 1,260,128 1,244,134 955,326 924,314 836,878 714,636 945,781 1,130,096 1,087,456 936,315 722,957 985,277 34,049,796
po inkrementální neardeduplikaci 10,429,073 463,743 542,288 262,169 475,620 209,076 256,643 260,088 157,469 137,950 154,390 132,593 217,288 246,024 215,418 310,357 102,328 197,985 14,770,502

Inkrementální deduplikace znamená, že byly CC zpracovány postupně (zleva doprava) se zachováním hashů. Inkrementální deduplikace byla provedena v pořadí Wikipedie -> všechny CC -> Clueweby.

Tabulka s přehledem velikostí jednotlivých zpracovaných sad:

CC-2014-42 CC-2014-49 CC-2014-52 CC-2015-06 CC-2015-11 CC-2015-14 CC-2015-18 CC-2015-22 CC-2015-27 CC-2015-32 CC-2015-35 CC-2015-40 CC-2015-48 CC-2016-07 CC-2016-18 CC-2016-22 CC-2016-26 CC-2016-30 Součet
před deduplikací 70 GB 36 GB 35 GB 31 GB 33 GB 30 GB 37 GB 36 GB 30 GB 33 GB 34 GB 25 GB 34 GB 33 GB 26 GB 27 GB 21 GB 34 GB 605 GB
po deduplikaci 6.2 GB 5.3 GB 6 GB 5.4 GB 5.9 GB 5.5 GB 6.2 GB 6.1 GB 5.4 GB 5.7 GB 5.8 GB 4.6 GB 5.7 GB 5.7 GB 5.1 GB 5.2 GB 4.3 GB 5.6 GB 99.7 GB
po neardeduplikaci 4.7 GB 4.1 GB 4.6 GB 4.2 GB 4.6 GB 4.3 GB 4.8 GB 4.8 GB 4.2 GB 4.4 GB 4.5 GB 3.6 GB 4.5 GB 4.5 GB 4 GB 4.1 GB 3.3 GB 4.4 GB 77.6 GB
po inkrementální deduplikaci 6.2 GB 590 MB 735 MB 524 MB 622 MB 453 MB 544 MB 533 MB 409 MB 397 MB 357 MB 305 MB 408 MB 483 MB 462 MB 399 MB 304 MB 421 MB 14 GB
po inkrementální neardeduplikaci 4.2 GB 196 MB 232 MB 110 MB 204 MB 89 MB 110 MB 106 MB 65 MB 57 MB 66 MB 58 MB 94 MB 106 MB 94 MB 137 MB 43 MB 87 MB 6 GB

Výsledky každé CC sady jsou uloženy na těchto strojích:

 athena1        knot01        knot14        knot26
 athena2        knot02        knot15        knot27
 athena3        knot03        knot16        knot28
 athena4        knot04        knot17        knot29
 athena5        knot05        knot18        knot30
 athena6        knot06        knot19        knot31
 athena7        knot07        knot20        knot32
 athena8        knot08        knot21        knot33
 athena9        knot10        knot22        knot34
 athena10       knot11        knot23        knot35
 athena11       knot12        knot24        minerva2
 athena12       knot13        knot25        minerva3
        

Výsledky jsou na výše zmíněných strojích umístěny v:

 /mnt/data/commoncrawl/${CC}/wikilinks.dedup/
 /mnt/data/commoncrawl/${CC}/wikilinks.near_dedup/ 
 /mnt/data/commoncrawl/${CC}/wikilinks.dedup_inc/
 /mnt/data/commoncrawl/${CC}/wikilinks.near_dedup_inc/
        

7.3.1 wikilinksDedup.sh

Skript pro deduplikaci wikilinks z CommonCrawlu:

 /mnt/minerva1/nlp/repositories/corpora_processing_sw/processing_steps/3/wikilinksDedup.sh
        

Vhodný pro spuštění inkrementální deduplikace. Například:

 wikilinksDedup.sh  CC-2015-14 CC-2015-32
 # zpracuje nejprve CC-2015-14 a poté CC-2015-32 se zachováním hashů
 wikilinksDedup.sh  CC-2015-14
 # zpracuje CC-2015-14
        

Konkrétnější cesty se musejí upravit uvnitř skriptu, stejně tak cesty k souborů specifikujícím stroje na kterých má deduplikace probíhat. (Pro neardedup nutno do skriptu přidat argument -n).

7.4 Deduplikace ClueWeb

Tabulka s přehledem počtu záznamů wikilinks zpracovaných sad:

ClueWeb09 ClueWeb12 Součet
před deduplikací 11,744,461 19,803,070 31,547,531
po deduplikaci 6,907,001 7,186,902 14,093,903
po neardeduplikaci 5,135,733 5,631,135 10,766,868
po inkrementální deduplikaci 6,268,126 5,173,682 11,441,808
po inkrementální neardeduplikaci 3,820,834 3,036,299 6,857,133

Inkrementální deduplikace byla provedena v pořadí Wikipedie -> všechny CC -> Clueweby.

Tabulka s přehledem velikostí jednotlivých zpracovaných sad:

ClueWeb09 ClueWeb12 Součet
před deduplikací 5.3 GB 8.0 GB 13.3 GB
po deduplikaci 2.4 GB 2.5 GB 4.9 GB
po neardeduplikaci 1.8 GB 2 GB 3.8 GB
po inkrementální deduplikaci 2.2 GB 1.8 GB 4 G
po inkrementální neardeduplikaci 1.3 GB 1.1 GB 2.4 GB

Výsledky obou Cluewebů jsou uloženy na těchto strojích:

 athena1        knot01        knot14        knot26
 athena2        knot02        knot15        knot27
 athena3        knot03        knot16        knot28
 athena4        knot04        knot17        knot29
 athena5        knot05        knot18        knot30
 athena6        knot06        knot19        knot31
 athena7        knot07        knot20        knot32
 athena8        knot08        knot21        knot33
 athena9        knot10        knot22        knot34
 athena10       knot11        knot23        
 athena11       knot12        knot24        
 athena12       knot13        knot25
        

Výsledky jsou na výše zmíněných strojích umístěny v:

 /mnt/data/clueweb/${09|12}/wikilinks.dedup/
 /mnt/data/clueweb/${09|12}/wikilinks.near_dedup/ 
 /mnt/data/clueweb/${09|12}/wikilinks.dedup_inc/
 /mnt/data/clueweb/${09|12}/wikilinks.near_dedup_inc/
        

7.5 Deduplikace Wikipedie

Wikipedie Velikosti jednotlivých verzí
před deduplikací 125,192,634 36 GB
po deduplikaci 119,021,063 34,4 GB
po neardeduplikaci 76,920,163 22,2 GB
po inkrementální deduplikaci 119,021,063 34.4 GB
po inkrementální neardeduplikaci 76,919,387 22.2 GB

Výsledky jsou uloženy na stejných strojích jako Commoncrawl v adresáři:

 /mnt/data/wikipedia/wikipedia.wikilinks/
        

Wikipedie slouží jako vstup pro inkrementální deduplikace CC a Cluewebů.

7.6 Deduplikace thrift

thrift(hashe z CC) thrift(hashe z Wikipedia) thrift(hashe z Clueweb) thrift(hashe z CC+Wikipedia) thrift(hashe z CC+Clueweb) thrift(hashe z CC+Wikipedia+Clueweb)
před deduplikací 35,359,606 35,359,606 35,359,606 35,359,606 35,359,606 35,359,606
po deduplikaci 20,927,543 20,927,543 20,927,543 20,927,543 20,927,543 20,927,543
po neardeduplikaci 18,622,532 18,622,532 18,622,532 18,622,532 18,622,532 18,622,532
po inkrementální deduplikaci 20,927,499 20,926,875 20,927,493 20,926,831 20,927,450 20,926,782
po inkrementální neardeduplikaci 15,750,839 16,815,066 18,618,274 14,432,668 14,560,364 13,348,602

8 Zpracování datových sad

8.1 Zpracování CC a ClueWeb

Byly zpracovány CC sady a Clueweb. Všechny datové sady byly zpracovávány skriptem pro automatické spuštění nástroje Wikilinks runWikilinks.sh. Skript pak spouští nástroj Wikilinks s následujícími parametry:

 wikilinks.py -i <input_file> -o <output_file> -v -w -e -r <redirection_file> -d <disambiguation_file> -a <all_url_file> -W -I -P <pageTable_file> -k
        

Zpracované datové sady:

 CC-2014-42         CC-2015-32         ClueWeb09
 CC-2014-49         CC-2015-35         ClueWeb12
 CC-2014-52         CC-2015-40
 CC-2015-06         CC-2015-48
 CC-2015-11         CC-2016-07
 CC-2015-14         CC-2016-18
 CC-2015-18         CC-2016-22
 CC-2015-22         CC-2016-26
 CC-2015-27         CC-2016-30
        

Výsledky naleznete v:

 /mnt/minerva1/nlp/projects/wikilinks/results.{CC|clueweb}
        

Nebo na každém stroji v:

 /mnt/data/commoncrawl/{CC}/wikilinks
 /mnt/data/clueweb/{09|12}/wikilinks
        

9 Wikilinks pro distribuci

Verze wikilinks určená k distribuci obsahuje inkrementálně zpracované sady CommonCrawlu, Cluewebu a Wikipedie (dohromady představují Total Dataset. Z takto zpracované sady byla vytvořena podčást obsahující pouze mnohoznačná jména osob a lokací wikipedie (Disambiguation Subset).

9.1 Total dataset

Celková sada obsahuje inkrementální verzi deduplikace, provedenou v pořadí Wikipedie -> CommonCrawl -> Clueweb (podrobnosti viz. Deduplikace Wikipedie, Deduplikace CommonCrawl, Deduplikace ClueWeb). Je reprezentována více soubory (podle toho o jakou sadu se jedná - CC-2014-42, CC-2014-49, atd.) s koncovkou *.result. Celkem jich je 22. Z celkové sady byl vytvořen soubor obsahující pouze unikátní odkazy - Total_dataset.referred_entities.

9.2 Disambiguation dataset

Kapitola se zabývá extrakcí podčásti mnohoznačných jmen osob a lokací ze zpracované sady Commoncrawlu, Cluewebů a Wikipedie.

Soubor obsahující mnohoznačná jména osob byl vytvořen na základě souborů z adresáře:

 /mnt/minerva1/nlp/projects/decipher_wikipedia/wikipedia_statistics/person_statistics
        

Soubor obsahující mnohoznačná jména lokací byl vytvořen na základě souborů z adresáře:

 /mnt/minerva1/nlp/projects/decipher_wikipedia/wikipedia_statistics/location_statistics/data/
        

Oba soubory byly sloučeny do jednoho výsledného, kterým se extrakce řídí:

 /mnt/minerva1/nlp/projects/wikilinks/disambiguation_subset_extraction/all_ambiguous_names
        

Extrakci provádějí skripty, které byly převzaty a patřičně upraveny z projektu Opal Disambiguation. Skript all_servers_extract_context.sh spouští skript extract_contexts.sh, provádějící samotnou extrakci, na všech strojích. Pro skript all_servers_extract_context.sh je nutné manuálně zadat cesty proměnných project_dir (adresář s těmito skripty), output_file_destination (adresář, kam budou výsledky extrakce uloženy) a ambiguous_names_file (soubor s mnohoznačnými jmény).

Upravené verze skriptů použité pro tuto extrakci najdete v:

 /mnt/minerva1/nlp/projects/wikilinks/disambiguation_subset_extraction/all_servers_extract_contexts.sh
 /mnt/minerva1/nlp/projects/wikilinks/disambiguation_subset_extraction/extract_contexts.sh
        

Disambiguation subset je rozdělena do 3 souborů:

 CommonCrawl.result
 Clueweb.result
 Wikipedia.result
        

Ze sady byl opět vytvořen soubor obsahující pouze unikátní odkazy:

 Disambiguation_subset.referred_entities
        

9.3 Výsledky

Total Dataset Disambiguation Subset
Počet zmínění 164,512,667 10,557,592
Referencované entity 4,417,107 286,273
Velikost v GB 52 3.1

Kde Total Dataset představuje celkovou datovou sadu wikilinks (CommonCrawl + ClueWeb + Wikipedie). Disambiguation Subset je pak extrahovaná podčást obsahující mnohoznačná jména osob a lokací z Total Dataset. Number of mentions značí celkový počet wiki odkazů (tedy řádků) v jednotlivých datasetech. Referred entities značí počet unikátních odkazů v rámci datasetu.

Total Dataset [1] a Disambiguation subset [2] naleznete v těchto adresářích:

 [1] /mnt/minerva1/nlp/projects/wikilinks/wikilinks_for_distribution/Total_dataset/*.result
 [2] /mnt/minerva1/nlp/projects/wikilinks/wikilinks_for_distribution/Disambiguation_subset/*.result
        

Total Dataset a Disambiguation subset byly zabaleny:

 [1] /mnt/minerva1/nlp/projects/wikilinks/wikilinks_for_distribution/Total_dataset.tar.gz
 [2] /mnt/minerva1/nlp/projects/wikilinks/wikilinks_for_distribution/Disambiguation_subset.tar.gz
        

Oba archivy obsahují README.txt soubor s popisem daného archivu a jeho ostatních souborů.


10 Popis formátu vstupních TSV souborů

TSV soubory nutné pro zpracování datových sad nástrojem wikilinks jsou umístěné v :

 /mnt/minerva1/nlp/projects/wikilinks/program
        

O jejich aktualizaci se stará skript tsv_update.py umístěný v:

 /mnt/minerva1/nlp/projects/wikilinks
        

Pro urychlení zpracování nástroje wikilinks byly z tsv souborů kompletně vypuštěny plné URL adresy a ponechány pouze jejich názvy, tzn. odstraněn prefix http://en.wikipedia.org/wiki/ a podtržítka "_" nahrazena mezerami " ". wikilinks.py si pak zpětně pro další zpracování vyrábí z názvů URL adresy.

10.1 wikipedia-all.tsv

Obsahuje všechny názvy URL adres anglické wikipedie, každý na jeden řádek. Jsou v ní tedy zahrnuty jak přímé názvy, tak názvy přesměrování. K aktualizaci jsou využity dva soubory z projektu Decipher wikipedia.

 /mnt/minerva1/nlp/projects/decipher_wikipedia/redirectsFromWikipedia/wikipedia-regular-pages.tsv
 /mnt/minerva1/nlp/projects/decipher_wikipedia/redirectsFromWikipedia/wikipedia-redirects.tsv
        

které po sloučení dají výsledný:

 wikipedia-all.tsv
        

Ukázka formátu:

 Napoleon
 Napoleon's Barber
 Napoleon's Campaigns in Miniature
        

10.2 wikipedia-disambiguations.tsv

Obsahuje pouze názvy disambiguačních stránek, každou na jeden řádek. Pro aktualizaci je použit soubor z projektu Wikipedia disambiguation pages:

 /mnt/minerva1/nlp/projects/wikipedia_disambiguation_pages/output/wp_disambiguation_titles.sorted
        

který přímo dává výsledný:

 wikipedia-disambiguations.tsv
        

Ukázka formátu:

 Napoleon at St. Helena
 Napoleon (disambiguation)
 Napoleone Orsini (disambiguation)
        

10.3 wikipedia-redirects.tsv

Obsahuje všechny názvy URL adres přesměrování. Vždy na jednom řádku název cílové adresy přesměrování a k ní skupinku všech názvů, které se na cílovou adresu přesměrovávají, oddělených znakem "|".

Formát:

 název_cílové_adresy\tnázev_adresy_přesměrování1|název_adresy_přesměrování2|...
        

Pro aktualizaci je použit soubor z projektu Decipher wikipedia:

 /mnt/minerva1/nlp/projects/decipher_wikipedia/redirectsFromWikipedia/wikipedia-redir-table.tsv
        

který přímo dává výsledný:

 wikipedia-redirects.tsv
        

Ukázka formátu:

 Napoleon            Napolean Bonapart|Napolean Bonaparte
 Napoleon Dynamite   Napolean Dynamite
        

11 Porovnání výsledků zpracování z VERT a WARC souborů

Porovnání bylo provedeno na datových sadách CC-2015-32 a CC-2015-40. Obě sady byly zpracovány nejdříve ze vstupních souborů WARC formátu, poté ze vstupních souborů VERT formátu. V obou případech byl nástroj wikilinks spuštěn se stejnými parametry. V případě VERT se formátu se překvapivě nalezlo více wiki linků, viz. tabulka:

Datová sada CC-2015-32 CC-2015-32 CC-2015-40 CC-2015-40
File type WARC VERT WARC VERT
Celkový počet nalezených wiki odkazů 60,488,837 87,742,422 34,500,684 66,292,376
Celková doba zpracování 10 hr, 32 min 4 hr 14 hr, 49 min 1 hr, 50 min

12 Spracovanie page table

Ide o skript:

 /mnt/minerva1/nlp/projects/wikilinks/xbolje00/pageTable.py
        

Skript filtrujúci údaje z SQL skriptu obsahujúceho príkazy pre vytvorenie a naplnenie tabuľky. Ide o tabuľku page table.

Má nasledovnú schému:

 +--------------------+---------------------+------+-----+----------------+----------------+
 | Field              | Type                | Null | Key | Default        | Extra          |
 +--------------------+---------------------+------+-----+----------------+----------------+
 | page_id            | int(10) unsigned    | NO   | PRI | NULL           | auto_increment |
 | page_namespace     | int(11)             | NO   | MUL | NULL           |                |
 | page_title         | varbinary(255)      | NO   |     | NULL           |                |
 | page_restrictions  | tinyblob            | NO   |     | NULL           |                |
 | page_counter       | bigint(20) unsigned | NO   |     | 0              |                |
 | page_is_redirect   | tinyint(3) unsigned | NO   | MUL | 0              |                |
 | page_is_new        | tinyint(3) unsigned | NO   |     | 0              |                |
 | page_random        | double unsigned     | NO   | MUL | NULL           |                |
 | page_touched       | binary(14)          | NO   |     |                |                |
 | page_latest        | int(10) unsigned    | NO   |     | NULL           |                |
 | page_len           | int(10) unsigned    | NO   | MUL | NULL           |                |
 | page_content_model | varbinary(32)       | YES  |     | NULL           |                |
 | page_links_updated | varbinary(14)       | YES  |     | NULL           |                |
 +--------------------+---------------------+------+-----+----------------+----------------+
        

Pre ďalšie spracovanie sú podstatné stĺpce page_id a page_title. Práve hodnoty týchto stĺpcov z príkazov INSERT sa pri spracovaní ukladajú a následne sú uložené do výstupného súboru.

Formát spustenia:

 ./pageTable.py -i {input_file} -o {output_file}
        

Vstupný SQL skript:

 /mnt/minerva1/nlp/projects/decipher_wikipedia/redirectsFromWikipedia/enwiki-latest-page.sql
        

Cesta k výstupnému súboru:

 /mnt/minerva1/nlp/projects/wikilinks/xbolje00/wikipedia-pageTable.tsv
        

Formát výstupného súboru:

 page_id\tpage_title
 page_id\tpage_title
 ...
        

13 Dekódovanie datovej sady wikilinks z apache thrift

Program pre dekódovanie datovej sady wikilinks z formátu apache thrift do požadovaného formátu. Jedná sa o nástroj gsoc-wikilinks, ktorý je upravený pre naše účely. Program sa spúšťa s dvoma parametrami, ktoré určujú vstupnú a výstupnú zložku. Vo vstupnej zložke sa prechádzajú všetky súbory, dekóduju sa a ukladajú do výstupnej zložkzy. Ak by sa jednalo o chybný súbor: nedá sa čítať, nie je vo formáte apache thrift atď, výhodí sa výnimka a pokračuje sa na další súbor. Vo výstupe musí byť udaný offset adresy a textu. Offset textu je vždy daný ale offset adresy bolo potrebné dopočítať. To je ale možné len v prípade že je dostupný samotný html dokument.

Samotný program sa nachádza v zložke:

 /mnt/minerva1/nlp/projects/wikilinks/gsoc-wikilinks
        

13.1 Preklad

V adresári programu spustiť príkaz:

 mvn package
        

Po úspšnom preložení sa v zložke target vytvoria 2 jar archívy:

 gsoc-wikilinks-1.0-SNAPSHOT.jar
 gsoc-wikilinks-1.0-SNAPSHOT-jar-with-dependencies.jar
        

13.2 Spustenie

Pomocou príkazu:

 java -Xmx1g -jar gsoc-wikilinks-1.0-SNAPSHOT-jar-with-dependencies.jar -i "input_directory" -o "output_directory"
        

13.3 Dekódovanie

Bolo uskutočnené dekódovanie datovej sady, ktorá obsahovala takmer všetky dostupné dokumenty a teda bolo možné v nej dosť často dopočítať offset adresy.

Použitá datova sada sa nachadza v zložke:

 /mnt/data-2/nlp/wiki-links/Dataset (with complete webpages)
        

Výstup sa nachádza v zložke:

 /mnt/data/nlp/projects/wikilinks/result_from_thrift
        

13.3.1 Štatistiky

Počet súborov 109
Celkový čas 14:33:31
Počet dokumentov 10,629,486
Počet linkov 36,166,829
Dopočítane offsety 32,638,607
Chýbajúce offsety 3,528,222
Dopočítane offsety v % 89%