Nástroj Decipher NER byl vytvořen v rámci projektu Decipher a slouží k vyhledávání a zjednoznačňování entit (např. osoba, umělec, lokace, ...) v textu. Ke své činnosti využívá znalostní bázi, která vznikla extrakcí a následným sloučením relevantních informací o entitách z mnoha zdrojů jako např. Wikipedia, Freebase, Geonames nebo Getty ULAN. Vlastní vyhledávání entit je prováděno nástrojem figa, který je založen na konečných automatech.
Nástroj NER je součástí většího celku projektu Decipher, který se nazývá secapi. Větší část nástroje je uložena v git repozitáři minerva1.fit.vutbr.cz/mnt/minerva1/nlp/repositories/decipher/secapi/, takže jsou na této stránce uváděny relativní cesty v tomto repozitáři. Nicméně, některé části (např. extrakce informací o entitách z různých zdrojů) zatím v repozitáři nejsou. Pro tyto případy jsou vždy uváděny absolutní cesty umístění na školních serverech.
        
Pro získání základní představy o tom, co vlastně NER dělá, můžete navštívit demo aplikaci na serveru knot24. Na tom samém serveru je také dostupný nástroj autocomplete, který dokáže efektivně nabízet entity ze znalostní báze.
Znalostní báze (Knowledge Base, zkráceně KB) projektu DECIPHER je uložena ve formátu TSV (Tab-separated values). Tento soubor obsahuje informace o entitách, přičemž na každém řádku je uložena vždy pouze jedna entita. Počet sloupců na řádku je závislý na typu dané entity. Typ entity je určen prefixem sloupce ID (první sloupec, zastaralé) nebo sloupcem TYPE (druhý sloupec) a popř. i sloupcem SUBTYPE (pokud je, pak je to třetí sloupec). Do budoucna se počítá se zrušením prefixů, proto je vhodné k identifikaci typu využívat sloupec TYPE. Podtypy rozšiřují rodičovský typ o další sloupce. (Proto jsou číslovány se znaménkem plus.) Sloupce, které mohou obsahovat více hodnot jsou označeny jako MULTIPLE VALUES. Pro oddělování vícenásobných hodnot se používá znak svislítko |. Kompletní přehled možných typů včetně popisu příslušných sloupců je možné nalézt níže. Sloupce, které mají název napsaný kurzívou jsou v KB.all prázdné, naplněné jsou v KBstatsMetrics.all.
        
Aktuální verzi KB je možno stáhnout ze serveru athena3 (popř. KBstatsMetrics.all) nebo je dostupná přímo na serveru athena3 v /mnt/data/kb/KB.all.
        
 PERSON (prefix: p)
 ==========================================
 01 ID
 02 TYPE
 03 SUBTYPE (MULTIPLE VALUES)
 04 NAME
 05 ALIAS (MULTIPLE VALUES)
 06 ROLE (MULTIPLE VALUES)
 07 NATIONALITY (MULTIPLE VALUES)
 08 DESCRIPTION (MULTIPLE VALUES)
 09 DATE OF BIRTH
 10 PLACE OF BIRTH
 11 DATE OF DEATH
 12 PLACE OF DEATH
 13 GENDER
 14 PERIOD OR MOVEMENT (MULTIPLE VALUES)
 15 PLACE LIVED (MULTIPLE VALUES)
 16 WIKIPEDIA URL
 17 FREEBASE URL
 18 DBPEDIA URL
 19 IMAGE (MULTIPLE VALUES)
 20 WIKI BACKLINKS
 21 WIKI HITS
 22 WIKI PRIMARY SENSE
 23 SCORE WIKI
 24 SCORE METRICS
 25 CONFIDENCE
 ARTIST (podtyp typu PERSON) (prefix: a)
 ==========================================
 +01 ART FORM (MULTIPLE VALUES)
 +02 INFLUENCED (MULTIPLE VALUES)
 +03 INFLUENCED BY (MULTIPLE VALUES)
 +04 ULAN ID
 +05 OTHER URL (MULTIPLE VALUES)
 LOCATION (prefix: l)
 ==========================================
 01 ID
 02 TYPE
 03 SUBTYPE (MULTIPLE VALUES)
 04 NAME
 05 ALTERNATIVE NAME (MULTIPLE VALUES)
 06 LATITUDE
 07 LONGITUDE
 08 FEATURE CODE
 09 COUNTRY
 10 POPULATION
 11 ELEVATION
 12 WIKIPEDIA URL
 13 DBPEDIA URL
 14 FREEBASE URL
 15 GEONAMES ID (MULTIPLE VALUES)
 16 SETTLEMENT TYPE (MULTIPLE VALUES)
 17 TIMEZONE (MULTIPLE VALUES)
 18 DESCRIPTION
 19 IMAGE (MULTIPLE VALUES)
 20 WIKI BACKLINKS
 21 WIKI HITS
 22 WIKI PRIMARY SENSE
 23 SCORE WIKI
 24 SCORE METRICS
 25 CONFIDENCE
 ARTWORK (prefix: w)
 ==========================================
 01 ID
 02 TYPE
 03 SUBTYPE (MULTIPLE VALUES)
 04 NAME
 05 ALIAS (MULTIPLE VALUES)
 06 DESCRIPTION
 07 IMAGE (MULTIPLE VALUES)
 08 ARTIST (MULTIPLE VALUES)
 09 ART SUBJECT (MULTIPLE VALUES)
 10 ART FORM
 11 ART GENRE (MULTIPLE VALUES)
 12 MEDIA (MULTIPLE VALUES)
 13 SUPPORT (MULTIPLE VALUES)
 14 LOCATION (MULTIPLE VALUES)
 15 DATE BEGUN
 16 DATE COMPLETED
 17 OWNER (MULTIPLE VALUES)
 18 HEIGHT
 19 WIDTH
 20 DEPTH
 21 WIKIPEDIA URL
 22 FREEBASE URL
 23 DBPEDIA URL
 24 PAINTING ALIGNMENT (MULTIPLE VALUES)
 25 MOVEMENT
 26 WIKI BACKLINKS
 27 WIKI HITS
 28 WIKI PRIMARY SENSE
 29 SCORE WIKI
 30 SCORE METRICS
 31 CONFIDENCE
 MUSEUM (prefix: c)
 ==========================================
 01 ID
 02 TYPE
 03 SUBTYPE (MULTIPLE VALUES)
 04 NAME
 05 ALIAS (MULTIPLE VALUES)
 06 DESCRIPTION
 07 IMAGE (MULTIPLE VALUES)
 08 MUSEUM TYPE (MULTIPLE VALUES)
 09 ESTABLISHED
 10 DIRECTOR
 11 VISITORS (MULTIPLE VALUES)
 12 CITYTOWN
 13 POSTAL CODE
 14 STATE PROVINCE REGION
 15 STREET ADDRESS
 16 LATITUDE
 17 LONGITUDE
 18 WIKIPEDIA URL
 19 FREEBASE URL
 20 ULAN ID
 21 GEONAMES ID (MULTIPLE VALUES)
 22 WIKI BACKLINKS
 23 WIKI HITS
 24 WIKI PRIMARY SENSE
 25 SCORE WIKI
 26 SCORE METRICS
 27 CONFIDENCE
 EVENT (prefix: e)
 ==========================================
 01 ID
 02 TYPE
 03 NAME
 04 ALIAS (MULTIPLE VALUES)
 05 DESCRIPTION
 06 IMAGE (MULTIPLE VALUES)
 07 START DATE
 08 END DATE
 09 LOCATION (MULTIPLE VALUES)
 10 NOTABLE TYPE
 11 WIKIPEDIA URL
 12 FREEBASE URL
 13 WIKI BACKLINKS
 14 WIKI HITS
 15 WIKI PRIMARY SENSE
 16 SCORE WIKI
 17 SCORE METRICS
 18 CONFIDENCE
 VISUAL ART FORM (prefix: f)
 ==========================================
 01 ID
 02 TYPE
 03 NAME
 04 ALIAS (MULTIPLE VALUES)
 05 DESCRIPTION
 06 IMAGE (MULTIPLE VALUES)
 07 WIKIPEDIA URL
 08 FREEBASE URL
 09 WIKI BACKLINKS
 10 WIKI HITS
 11 WIKI PRIMARY SENSE
 12 SCORE WIKI
 13 SCORE METRICS
 14 CONFIDENCE
 VISUAL ART MEDIUM (prefix: d)
 ==========================================
 01 ID
 02 TYPE
 03 NAME
 04 ALIAS (MULTIPLE VALUES)
 05 DESCRIPTION
 06 IMAGE (MULTIPLE VALUES)
 07 WIKIPEDIA URL
 08 FREEBASE URL
 09 WIKI BACKLINKS
 10 WIKI HITS
 11 WIKI PRIMARY SENSE
 12 SCORE WIKI
 13 SCORE METRICS
 14 CONFIDENCE
 VISUAL ART GENRE (prefix: g)
 ==========================================
 01 ID
 02 TYPE
 03 NAME
 04 ALIAS (MULTIPLE VALUES)
 05 DESCRIPTION
 06 IMAGE (MULTIPLE VALUES)
 07 WIKIPEDIA URL
 08 FREEBASE URL
 09 WIKI BACKLINKS
 10 WIKI HITS
 11 WIKI PRIMARY SENSE
 12 SCORE WIKI
 13 SCORE METRICS
 14 CONFIDENCE
 ART PERIOD MOVEMENT (prefix: m)
 ==========================================
 01 ID
 02 TYPE
 03 NAME
 04 ALIAS (MULTIPLE VALUES)
 05 DESCRIPTION
 06 IMAGE (MULTIPLE VALUES)
 07 WIKIPEDIA URL
 08 FREEBASE URL
 09 WIKI BACKLINKS
 10 WIKI HITS
 11 WIKI PRIMARY SENSE
 12 SCORE WIKI
 13 SCORE METRICS
 14 CONFIDENCE
 NATIONALITY (prefix: n)
 ==========================================
 01 ID
 02 TYPE
 03 NAME
 04 ALIAS (MULTIPLE VALUES)
 05 DESCRIPTION
 06 IMAGE (MULTIPLE VALUES)
 07 SHORT NAME
 08 COUNTRY NAME
 09 ADJECTIVAL FORM (MULTIPLE VALUES)
 10 WIKIPEDIA URL
 11 FREEBASE URL
 12 WIKI BACKLINKS
 13 WIKI HITS
 14 WIKI PRIMARY SENSE
 15 SCORE WIKI
 16 SCORE METRICS
 17 CONFIDENCE
 MYTHOLOGY (prefix: y)
 ==========================================
 01 ID
 02 TYPE
 03 NAME
 04 ALTERNATIVE NAME (MULTIPLE VALUES)
 05 WIKIPEDIA URL
 06 IMAGE (MULTIPLE VALUES)
 07 DESCRIPTION
 08 WIKI BACKLINKS
 09 WIKI HITS
 10 WIKI PRIMARY SENSE
 11 SCORE WIKI
 12 SCORE METRICS
 13 CONFIDENCE
 FAMILY (prefix: i)
 ==========================================
 01 ID
 02 TYPE
 03 NAME
 04 ALTERNATIVE NAME (MULTIPLE VALUES)
 05 WIKIPEDIA URL
 06 IMAGE (MULTIPLE VALUES)
 07 ROLE (MULTIPLE VALUES)
 08 NATIONALITY
 09 DESCRIPTION
 10 MEMBERS (MULTIPLE VALUES)
 11 WIKI BACKLINKS
 12 WIKI HITS
 13 WIKI PRIMARY SENSE
 14 SCORE WIKI
 15 SCORE METRICS
 16 CONFIDENCE
 GROUP (prefix: r)
 ==========================================
 01 ID
 02 TYPE
 03 NAME
 04 ALTERNATIVE NAME (MULTIPLE VALUES)
 05 WIKIPEDIA URL
 06 IMAGE (MULTIPLE VALUES)
 07 ROLE (MULTIPLE VALUES)
 08 NATIONALITY
 09 DESCRIPTION
 10 FORMATION
 11 HEADQUARTERS
 12 WIKI BACKLINKS
 13 WIKI HITS
 14 WIKI PRIMARY SENSE
 15 SCORE WIKI
 16 SCORE METRICS
 17 CONFIDENCE
 OTHER (prefix: o) 
 ==============================================================
 01 ID
 02 TYPE
 03 TITLE
 04 ALIAS (MULTIPLE VALUES)
 05 DESCRIPTION
 06 IMAGE (MULTIPLE VALUES)
 07 WIKIPEDIA URL
 08 WIKI BACKLINKS
 09 WIKI HITS
 10 WIKI PRIMARY SENSE
 11 SCORE WIKI
 12 SCORE METRICS
 13 CONFIDENCE
        
        V této sekci jsou uvedeny dílčí soubory nutné k vygenerování KB. Soubory jsou uvedeny pro každý typ zvlášť. Pokud některý typ není uveden, je to z toho důvodu, že pro generování dílčí KB daného typu nejsou potřeba žádné skripty a není proto pro ni vytvořen žádný adresář na gitu. Namísto toho se sloučení děje přímo ve skriptu prepare_data (viz níže). U jednotlivých typů je vždy v závorce uveden adresář na gitu, kde je možné najít skripty a konfigurační soubory nutné pro vytvoření KB daného typu.
        
 PERSON (secapi/NER/KnowBase/persons)
 ==========================================
 /mnt/minerva1/nlp/projects/decipher_freebase/data/freebase.persons 
 /mnt/minerva1/nlp/projects/decipher_wikipedia/Ludia_Wikipedia/outputs/categories_death_birth_data.csv
 ARTIST (secapi/NER/KnowBase/artists)
 ==========================================
 /mnt/minerva1/nlp/datasets/art/artbiogs/artbiogs.tsv
 /mnt/minerva1/nlp/datasets/art/bbc/bbc.tsv
 /mnt/minerva1/nlp/datasets/art/council/council.tsv
 /mnt/minerva1/nlp/datasets/art/distinguishedwomen/distinguishedwomen.tsv
 /mnt/minerva1/nlp/datasets/art/artists2artists/artists2artists.tsv
 /mnt/minerva1/nlp/datasets/art/the-artists/the-artists.tsv
 /mnt/minerva1/nlp/datasets/art/nationalgallery/nationalgallery.tsv
 /mnt/minerva1/nlp/datasets/art/wikipaint/final_data/wikipaint_artist.tsv
 /mnt/minerva1/nlp/datasets/art/davisart/davisart.tsv
 /mnt/minerva1/nlp/datasets/art/apr/apr.tsv
 /mnt/minerva1/nlp/datasets/art/rkd/rkd.tsv
 /mnt/minerva1/nlp/datasets/art/open/open.tsv
 /mnt/minerva1/nlp/projects/decipher_freebase/data/freebase.artists
 /mnt/minerva1/nlp/projects/decipher_ner/ULAN/ulan_rel_13/KB.artists
 /mnt/minerva1/nlp/projects/decipher_wikipedia/wiki_template/artists_extended
 /mnt/minerva1/nlp/datasets/art/artrepublic/artrepublic.tsv
 /mnt/minerva1/nlp/datasets/art/biography/biography.tsv
 /mnt/minerva1/nlp/datasets/art/englandgallery/englandgallery.tsv
 /mnt/minerva1/nlp/datasets/art/infoplease/infoplease.tsv
 /mnt/minerva1/nlp/datasets/art/nmwa/nmwa.tsv
 LOCATION (secapi/NER/KnowBase/locations)
 ==========================================
 /mnt/minerva1/nlp/projects/decipher_dbpedia/extraction_results/v39/v39_location_finall.tsv
 /mnt/minerva1/nlp/projects/decipher_freebase/data/freebase.locations
 /mnt/minerva1/nlp/projects/decipher_geonames/geonames.locations
 ARTWORK (secapi/NER/KnowBase/artworks)
 ==========================================
 /mnt/minerva1/nlp/projects/decipher_dbpedia/extraction_results/v39/v39_artwork_finall.tsv
 /mnt/minerva1/nlp/projects/decipher_freebase/data/freebase.artworks
 MUSEUM (secapi/NER/KnowBase/museums)
 ==========================================
 /mnt/minerva1/nlp/projects/decipher_dbpedia/extraction_results/v39/v39_museum_finall.tsv
 /mnt/minerva1/nlp/projects/decipher_freebase/data/freebase.museums
 /mnt/minerva1/nlp/projects/decipher_ner/ULAN/ulan_rel_13/KB.corporations
 /mnt/minerva1/nlp/projects/decipher_geonames/geonames.museums
 MYTHOLOGY (secapi/NER/KnowBase/mythology)
 ==========================================
 /mnt/minerva1/nlp/projects/extrakce_z_wikipedie/xgraca00/MythologyKB.txt 
 FAMILY (secapi/NER/KnowBase/artist_families)
 ==========================================
 /mnt/minerva1/nlp/projects/extrakce_z_wikipedie/xdosta40/final/finalFamilies.xml
 GROUP (secapi/NER/KnowBase/artist_group_or_collective)
 ==========================================
 /mnt/minerva1/nlp/projects/extrakce_z_wikipedie/xdosta40/final/finalGroupsAndCollectives.xml
 OTHER (secapi/NER/KnowBase/other)
 ==========================================
 /mnt/minerva1/nlp/projects/wikify/wikipedia/data/new_KB/KB.all
 Ostatní dílčí KB, které jsou integrovány do výsledné KB (viz skript secapi/NER/prepare_data)
 ==========================================
 /mnt/minerva1/nlp/projects/decipher_ner/KnowBase/PERSONS
 /mnt/minerva1/nlp/projects/decipher_ner/KnowBase/ARTISTS
 /mnt/minerva1/nlp/projects/decipher_ner/KnowBase/LOCATIONS
 /mnt/minerva1/nlp/projects/decipher_ner/KnowBase/ARTWORKS
 /mnt/minerva1/nlp/projects/decipher_ner/KnowBase/MUSEUMS
 /mnt/minerva1/nlp/projects/decipher_ner/KnowBase/MYTHOLOGY
 /mnt/minerva1/nlp/projects/decipher_ner/KnowBase/ARTIST_FAMILIES
 /mnt/minerva1/nlp/projects/decipher_ner/KnowBase/ARTIST_GROUP_OR_COLLECTIVE
 /mnt/minerva1/nlp/projects/decipher_freebase/data/freebase.events
 /mnt/minerva1/nlp/projects/decipher_freebase/data/freebase.visual_art_forms
 /mnt/minerva1/nlp/projects/decipher_freebase/data/freebase.visual_art_mediums
 /mnt/minerva1/nlp/projects/decipher_freebase/data/freebase.art_period_movements
 /mnt/minerva1/nlp/projects/decipher_freebase/data/freebase.visual_art_genres
 /mnt/minerva1/nlp/projects/decipher_freebase/data/freebase.nationalities
 /mnt/minerva1/nlp/projects/ie_foreign_wikipedia/xbajan01/wiki/output/es_only_data.tsv
 /mnt/minerva1/nlp/projects/ie_foreign_wikipedia/xklima22/wiki/outputs/de-wiki_only_people_data.tsv
 Soubor se statistikami
 ==========================================
 /mnt/minerva1/nlp/projects/decipher_wikipedia/wikipedia_statistics/wikipedia_statistics_2014-12-09.tsv
        Soubor HEAD-KB v /mnt/minerva1/nlp/repositories/decipher/secapi/ (odtud berme jako pracovní cestu) slouží jako konfigurační soubor pro načítání KB. Obsahuje kompletní specifikaci všech typů a sloupců v KB (viz kapitola Knowledge Base). U všech sloupců jsou uvedeny jejich datové typy, případně prefixy. Jednotlivé sloupce hlavičky jsou odděleny tabulátory tak, aby seděli k datovým sloupcům.
        
Používá se při generování KB ve skriptu NER/metrics_knowledge_base.py a vytváření souboru KB-HEAD.all.
        
Hlavička KB má syntaxi:
 <hlavička KB> ::= <řádek> "\n"
               | <řádek> <hlavička KB>
 <row> ::= <první sloupec> "\n"
         | <první sloupec> "\t" <ostatní sloupce> "\n"
 <první sloupec> ::= "<" <jméno typu> ">" <sloupec>
                  | "<" <jméno typu> ":" <jméno podtypu> ">" <sloupec>
 <ostatní sloupce> ::= <sloupec>
                   | <sloupec> "\t" <other_columns>
 <sloupec> ::= <název sloupce>
            | "{" <příznaky> "}" <název sloupce>
            | "{[" <prefix hodnoty> "]}" <název sloupce>
            | "{" <příznaky> "[" <prefix hodnoty> "]}" <název sloupce>
        
        kde:
jméno typu - je řetězec označující typ (viz Knowledge Base)jméno podtypu - je řetězec označující podtyppříznaky - jsou znaky které určují datový typ (s – string, …), více hodnot v datech ve sloupci (m – multivalue) a identifikátor (i – identifier)
                prefix_hodnoty - je řeťezec, který bude připojen k datům v tomto sloupcinázev_sloupce - je řeťezec se jménem sloupce příklad prvního sloupce v hlavičce: <location>ID
 příklad prvního sloupce v datech: l:21931315183
 epříklad ostatních sloupců v hlavičce: {iu[http://en.wikipedia.org/]}WIKIPEDIA URL
 příklad ostatních sloupců v datech: wiki/city_of_london
        
        Regulární výraz pro získání jednotlivých položek sloupce v hlavičce v jazyce Python:
 PARSER = re.compile(r"""(?ux)
	 ^
	 (?:<(?P<TYPE>[^:>]+)(?:[:](?P<SUBTYPE>[^>]+))?>)?
	 (?:\{(?P<FLAGS>(?:\w|[ ])*)(?:\[(?P<PREFIX_OF_VALUE>[^\]]+)\])?\})?
	 (?P<NAME>(?:\w|[ ])+)
	 $
 """)
 column = u"<jméno typu:jméno podtypu>{flagy[prefix_hodnoty]}název_sloupce"
 PARSER.search(column).groupdict()
 {
 	 'TYPE': u'jmeno typu',
	 'SUBTYPE': u'jmeno podtypu',
	 'FLAGS': u'typov\xe9 prefixy',
	 'PREFIX_OF_VALUE': u'adresov\xfd prefix',
	 'NAME': u'jm\xe9no sloupce'
 }
 PARSER.search(column).group("TYPE")
 u'jmeno typu'
        Úkolem bylo vytvořit program v jazyku C, který načte KB jako prostý řetězec (string) do sdílené paměti. Program a knihovny jsou uloženy v Git repositáři /mnt/minerva1/nlp/repositories/decipher/secapi/ (odtud berme jako pracovní cestu). KB pro tento účel musí obsahovat hlavičku, která dává jednotlivým sloupcům v KB význam. Hlavička KB je oddělena od dat pomocí jednoho volného řádku.
        
Byli vytvořeny tři varianty:
První dvě varianty byly vytvořeny pro původní úkol. Bylo třeba zjistit, která z nich bude rychlejší. Jako rychlejší se ukázala druhá varianta.
Ke každé variantě je vytvořena dynamická knihovna libKB_shm.so a její nadstavba v Pythonu KB_shm.py. Nyní je ovšem nadstavba v Pythonu udržována pouze pro 2. variantu, o které vím, že se používá.
        
Daemon načte do sdílené RAM KB, popř. i namelist. Kopii této paměti uloží na disk vedle KB, dá ji stejné jméno jako je KB a příponu ".bin". Tato kopie slouží k urychlení příštího načtení a neměla přenášet mezi různými architekturami. Změna KB a namelist se sleduje a jsou-li novější než kopie SHM, znovu se načtou a znovu se vytvoří i kopie.
Jakmile daemon načetl do SHM data, vypíše na stdout "./decipherKB-daemon: Waiting for signal...". V tomto stavu pouze čeká na signál SIGTERM, SIGINT nebo SIGQUIT a když jeden z těchto tří signálů dostane, odstraní z SHM načtenou KB a ukončí se.
Pro práci s daty v SHM slouží zmíněná dvojice libKB_SHM.so a KB_shm.py. Popisovat je ale zde nebudu, jelikož jsou okomentovány v libKB_shm.h a KB_shm.py.
        
1. varianta:
 decipherKB-daemon [{path_to_KB | -b path_to_KB_bin}]
        
        2. varianta:
 decipherKB-daemon [-s SHM_NAME] [{path_to_KB | -b path_to_KB_bin}]
        
        3. varianta:
 decipherKB-daemon [{path_to_KB path_to_namelist | -b path_to_KB_bin}]
        
        path_to_KB - cesta ke KB (výchozí hodnota "./KB-HEAD.all")path_to_namelist - cesta k namelist (výchozí hodnota "./namelist.ASCII")-b path_to_KB_bin - načtení zmíněné kopie SHM-s SHM_NAME - specifikace jména objektu ve sdílené paměti (výchozí je "/decipherKB-daemon_shm")Nástroj pro rozpoznávání a disambiguaci jmenných entit je implementován ve skriptu ner.py. V této kapitole se nachází pouze informace o jeho spouštění. Bližší informace o tom, jak to funguje je možné nalézt zde.
        
Skript ner.py využívá ke své činnosti KB, která je nahrána ve sdílené paměti pomocí SharedKB.
        
Aktuální verze nástroje je dostupná na gitu ve větvi D114-NER (username je potřebné změnit za váš login).
 git clone ssh://username@minerva1.fit.vutbr.cz/mnt/minerva1/nlp/repositories/decipher/secapi/
 git checkout -b D114-NER origin/D114-NER
        
        Před spuštěním je aktuálně nutné provést následující posloupnost příkazů:
  ./downloadKB.sh
 make
        
        Je potřeba si dát pozor na to, aby se při použití skriptu downloadKB.sh, nenacházely v adresářích secapi/NER a secapi/NER/figa KB a automaty (*.fsa). Je proto vhodné je ještě předtím smazat pomocí skriptu deleteKB.sh.
        
Nástroj pracuje s knowledge base s pridanými stĺpcami obsahujúcmi štatistické dáta z Wikipedie a predpočítaným skóre pre disambiguáciu. Vyhľadávanie entít v texte a ich disambiguáciu potom umožňuje skript:
 secapi/NER/ner.py
        
        Použití:
 ner.py [-h] [-a | -s] [-d] [-f FILE]
        
        -h --help - vypíše nápovědu a skončí-a --all - vypíše všechny entity ze vstupu bez rozpoznání-s --score - vypíše pro každou entitu v textu všechny její možné významy a ohodnocení každého z těchto významů-d --daemon-mode - "mód Daemon" (viz níže)-f FILE --file FILE - použije zadaný soubor jako vstup-r --remove-accent - odstraní diakritiku ze vstupu-l --lowercase - převod vstupu na malá písmena a použití zvláštního automatu pouze s malými písmenyJe také možné vstup načítat ze standardního vstupu (možnost využití přesměrování).
Testovací texty pro ner.py naleznete ve složce:
 secapi/NER/data/input
        
        Režim činnosti aktivovaný prítomnosťou prepínača -d umožňuje hromadné spracovanie viacerých textov s jednou inicializáciou. Text je očakávaný na štandardnom vstupe, ukončený na samostatnom riadku príkazom.
        
 NER_NEW_FILE - vypíše nalezené entity s disambiguací
 NER_NEW_FILE_ALL - vypíše nalezené entity bez disambiguace
 NER_NEW_FILE_SCORE - vypíše nalezené entity bez disambiguace, včetně skóre pro jednotlivé entity
        
        Po zadaní príkazu nástroj vypíše zoznam entít nájdených v zadanom texte a výstup ukončí zopakovaním príkazu. Na vstupe potom očakáva ďalší text. Spracovanie textu zadaného od posledného príkazu a ukončenie programu spôsobí na samostatnom riadku príkaz:
 NER_END - ukončí program a vypíše nalezené entity s disambiguací
 NER_END_ALL - ukončí program a vypíše nalezené entity bez disambiguace
 NER_END_SCORE - ukončí program a vypíše nalezené entity bez disambiguace, včetně skóre pro jednotlivé entity
        
        Na štandardný výstup nástroj vypisuje zoznam nájdených entít v poradí, v akom sa vyskytujú vo vstupnom texte. Každej entite patrí jeden riadok, a stĺpce sú oddelené tabulátormi.
Riadky výstupu majú formát:
 BEGIN_OFFSET    END_OFFSET      TYPE    TEXT    OTHER
        
        BEGIN_OFFSET a END_OFFSET vyjadrujú pozíciu začiatku a konca entity v texte.
TYPE označuje typ entity: kb pre položku knowledge base, date a interval pre datum a interval, coref pre koreferenciu zámenom alebo časťou mena osoby.
TEXT obsahuje textovú podobu entity tak, ako sa vyskytla vo vstupnom texte.
OTHER pre typy kb a coref má podobu zoznamu zodpovedajúcich čísel riadku v knowledge base oddelených znakom ";". Ak je zapnutá disambiguácia, zvolený je len jeden riadok zodpovedajúci najpravdepodobnejšiemu významu. Při použití skriptu s parametrem -s se zobrazí dvojice číslo řádku a ohodnocení entity, dvojice jsou od sebe odděleny středníkem. Pre typy date a interval obsahuje údaj v normalizovanom ISO formáte.
Konečný automat figa v texte nachádza rôzne druhy entít (person, location, artwork, museum, event, art form, art medium, art period movement, art genre, nationality) z KB, pričom ich textová podoba môže zodpovedať viacerým možnostiam významu. Úlohou bolo disambiguovať nájdené entity, vybrať spomedzi možných významov jeden, ktorý s čo najväčšou pravdepodobnosťou zodpovedá skutočnosti.
Pre každý možný význam entity v texte je vypočítané číselné skóre, pričom za výsledok disambiguácie sa vyberie význam s najvyšším skóre. Výsledné skóre je súčtom statickej zložky a kontextovej zložky.
Statické skóre vyjadruje významnosť danej položky v knowledge base. Je vypočítané na základe štatistických údajov o článku o položke na Wikipedii: počet spätných odkazov, počet návštev článku, údaj, či má článok pre dané heslo primárny význam. Ak tieto nie sú dostupné, používajú sa iné metriky položky knowledge base. Pre skóre využívajúce štatistiky z Wikipedie aj druhý typ skóre je pre každú zložku vypočítané čiastkové skóre z intervalu 0 až 100. Čiastkové hodnoty sú rovnomerne spriemerované do výsledného skóre.
Aby bolo možné čo najlepšie určiť význam entít v texte, ktoré zodpovedajú len časti mena osoby (mena alebo priezviska), sú pre každú entitu nájdenú figou tieto možné významy dohľadávané.
Pred samotnou disambiguáciou sa pre každú osobu v knowledge base stĺpce DISPLAY TERM a PREFERRED TERM a každá hodnota OTHER TERMS rozdelí na jednotlivé mená (pôvodne oddelené medzerou). Ku všetkým sa zaznamená príslušný riadok knowledge base. Výsledkom procesu je slovník všetkých častí mien vyskytujúcich sa v knowledge base, ktorý ku každému menu priraďuje množinu riadkov knowledge base, kde je takéto meno použité.
Každá entita nájdená v texte sa potom rozdelí na slová, pre každé z nich sa nájde príslušná množina riadkov v knowledge base a vypočíta sa ich prienik. Takto sa získajú osoby, ktorých mená obsahujú všetky slová nájdené v rámci entity v texte. Tieto významy sa pridajú k tým nájdeným figou.
Kontextová disambiguácia pridáva kritérium context významu entity s významom zvyšku dokumentu.
        
U lokácií sa po prvom kole disambiguácie, ktoré prebehne bez ohľadu na kontext, zaznamenajú regions, kde ležia lokácie, ktoré sa stali výsledkom disambiguácie. Pre každú krajinu sa potom vypočíta podiel počtu lokácií patriacich danej krajine nájdených v lokáciách na vstupe. Pri druhom kole disambiguácie je táto hodnota použitá ako nová zložka skóre významov.
        
U osôb sa po prvom kole disambiguácie spočítajú výskyty jednotlivých osôb medzi výsledkami. Do skóre v druhom kole sa potom zarátava podiel počtu výskytov osoby spomedzi osôb nájdených v prvom kole.
Nástroj okrem entít z knowledge base a dátumov označuje aj anglické zámená. Následne sa snaží určiť, na čo odkazujú. Za význam zámena je určená posledná nájdená entita vhodného gramatického rodu. Osobám mužského pohlavia zodpovedajú zámená he, him, himself a his, osobám ženského pohlavia she, her, hers a herself, osobám ktoréhokoľvek pohlavia who, whom a whose. Dále se pracuje se zájmeny here, there, where.
Konečný automat figa a skript dates.py môžu produkovať pre jedno miesto v texte viac výsledkov. Údaj o dátume môže byť zároveň názvom položky KB. V takom prípade je preferovaný dátum. V prípade, že viacero prekrývajúcich sa entít nájde figa, je preferovaná najdlhšia.
        
Pokiaľ najbližšie slovo pred začiatok alebo za koncom entity v texte začína veľkým písmenom je pravdepodobné, že označený text je súčasťou dlhšieho názvu a jeho význam tak nemusí zodpovedať významu označenej časti. Preto takéto entity nie sú vypisované. Výnimkou sú prípady keď sú susediace slová oddelené interpunkcou, alebo veľké písmeno označuje začiatok vety (predošlé slovo končí bodkou, otáznikom alebo výkričníkom).
Rýchlosť spracovania textu nástrojom zabezpečujúcim vyhľadanie entít označujúcich osoby, miesta a umelecké diela a disambiguáciu ich významu a vyhľadanie dátumov a časových intervalov v texte bola meraná na serveri athena1, pričom meranie bolo opakované trikrát.
Testovací data obsahují názvy entit (tzn. 1 název = 1 řádek) v rozmezí 10,000 - 10,000,000.
Testovací data lze najít na tomto umístění v pracovní verzi NERu:
 secapi/NER/data/performance
        
        Inicializácia nástroja trvá 4.902 s. V nasledujúcich časových údajoch je zarátaná.
Výkonnostné charakteristiky NERu - bez disambiguácie
| Počet entit na vstupu | Veľkosť vstupu | Dĺžka spracovania | 
|---|---|---|
| 10,000 | 146 kB | 5.6 s | 
| 100,000 | 1.5 MB | 13.221 s | 
| 1,000,000 | 15.8 MB | 89.282 s | 
| 10,000,000 | 152.8 MB | 815.583 s | 
Výkonnostné charakteristiky NERu - s disambiguáciou
| Počet entit na vstupu | Veľkosť vstupu | Dĺžka spracovania | 
|---|---|---|
| 10,000 | 146 kB | 5.822 s | 
| 100,000 | 1.5 MB | 18.197 s | 
| 1,000,000 | 15.8 MB | 240.959 s | 
| 10,000,000 | 152.8 MB | 2,533.679 s | 
Tvorba dílčích KB PERSONS, ARTISTS, ARTWORKS, LOCATIONS, MUSEUMS, MYTHOLOGY, ARTIST_FAMILIES, ARTIST_GROUP_OR_COLLECTIVE a OTHER se odehrává v adresáři:
 secapi/NER/KnowBase
        
        Jednotlivé KB jsou vytvářeny pomocí skriptu:
start.sh
který pro každý typ jednotlivě spouští skripty start.sh v příslušném podadresáři daného typu (artworks, locations, museums, persons, mythology, artist_families a artist_group_or_collective). e tedy možné spustit přegenerování pouze určitého typu samostatně. Vlastní tvorba dílčí KB se děje pomocí skriptu kb_compare.py (popsáno blíže zde). V tomto kroce se rovněž pro typ ARTIST a PERSON doplňují alternativní jména z JRC-NAMES.
        
V adresáři secapi/NER/KnowBase se nachází ještě několik dalších užitečných skriptů. Skript backupKB.sh provádí zálohovaní vstupních souborů pro tvorbu dílčích KB do umístění /mnt/data-in/knot/iotrusina/KB_data_backups. Skript copyKB.sh provádí nahrání nově vytvořených dílčích KB do umístění /mnt/minerva1/nlp/projects/decipher_ner/KnowBase. Skript deleteKB.sh smaže vytvořené dílčí KB. Skripty  copyKB.sh a deleteKB.sh se spouštějí v rámci skriptu secapi/NER/start.sh.
        
KB vychází z KB.all projektu Wikify:
 /mnt/minerva1/nlp/projects/wikify/wikipedia/data/new_KB/KB.all
        
        Její tvorba probíhá tak, že se postupně odfiltrují již použitá jména entit z předchozích vytvořených dílčích KB. Tedy skript projde dílčí KB PERSONS, ARTISTS, atd.., načte jména jednotlivých entit a postupně tato jména odfiltrovává z přípravné KB.all projektu Wikify. Entity, které zbydou a nejsou použity v žádné z dílčích KB, budou tvořit novou dílčí KB OTHER. Je proto nutné, aby byla OTHER tvořena jako poslední z daných dílčích KB (při přidání nějaké nové dílčí KB je nutné tuto KB připsat do skriptu secapi/NER/KnowBase/other/kb_filter_entity_out.py).
        
Knowledge Base KB.all vznikne sloučením dílčích KB s daty z Freebase a některých cizojazyčných Wikipedií.
        
Toto spojení probíhá ve skriptu:
 secapi/NER/prepare_data
        
        Při použití parametru -i se zároveň stáhnou chybějící obrázky do databáze obrázků /mnt/athena3/kb/images (nyní pouze wikimedia obrázky).
        
Nově vzniklá Knowledge Base se nachází v souboru:
secapi/NER/KB.all
Knowledge Base KBstatsMetrics.all je de facto původní KB.all rozšířená o několik sloupců se statistikami. Vytváří se také ve skriptu prepare_data, kde se pomocí skriptů wiki_stats_to_KB.py a metrics_to_KB.py doplní na každý řádek příslušné statistiky.
        
Oproti popsanému formátu KB.all je každý řádek rozšířený o 6 sloupců: první tři tvoří statistiky příslušného článku na Wikipedii (backlinks, hits, primary sense). Získání těchto statistik je popsáno v projektu Decipher wikipedia. Čtvrtý tvoří skóre pro disambiguaci výpočítané na základě předešlých třech sloupců. Pátý sloupec obsahuje skóre pro disambiguaci vypočítané pomocí metrik jako jsou délka popisu, počet vyplněných sloupců v KB a nebo počet obyvatel dané lokace. Šestý sloupec obsahuje confidence skóre, které kombinuje všechny předchozí hodnoty do jedné.
Takto vzniklá Knowledge Base se nachází v souboru:
 secapi/NER/KBstatsMetrics.all
        Nástroj ner.py ke své činnosti využívá nástroje figa, který pomocí několika slovníků dokáže v textu rozpoznávat entity. Popis nástroje figa i slovníků je možné najít na stránce projektu Ner4. V této kapitole je popsána pouze jejich tvorba. (Dříve byly ke stejnému účelu používané konečné automaty popsané na stránce projektu Decipher fsa).
        
Tvorba slovníků pro NER i pro autocomplete je prováděna pomocí skriptů create_cedar.sh a create_cedar_autocomplete.sh. Tyto skripty pracují se souborem KBstatsMetrics.all, z něhož získají seznam jmen, který se následně předloží nástrojem figav1.0, který dané automaty vytvoří.
        
 secapi/NER/figa/make_automat/create_cedar.sh
        
        Použití:
 create_fsa.sh [-h] [-l|-u] [-c|-d] --knowledge-base=KBstatsMetrics.all
        
        Povinné argumenty:
-k KB --knowledge-base=KB - path to KBstatsMetrics.allNepovinné argumenty:
-h --help - vypíše nápovědu a skončí-l --lowercase - všechna jména budou převedena na malá písmena-u --uri - vygeneruje seznam URI-c --cedar (default) - vygeneruje slovníky CEDAR (přípona .ct)-d --darts - vygeneruje slovníky DARTS (přípona .dct)Pomocí skriptu create_cedar.sh jsou vygenerovány následující slovníky:
 automata.[ct|dct]       - základní automat pro ner.py
 automata-lower.[ct|dct] - automat pro lowercase variantu rozpoznávání
 automata-uri.[ct|dct]   - automat pro URI
        
        Pomocí skriptu create_cedar_autocomplete.sh jsou vygenerovány následující slovníky:
 art_period_movement_automata.[ct|dct] - slovník pro autocomplete (typ ART PERIOD MOVEMENT)
 artwork_automata.[ct|dct]             - slovník pro autocomplete (typ ARTWORK)
 event_automata.[ct|dct]               - slovník pro autocomplete (typ EVENT)
 family_automata.[ct|dct]              - slovník pro autocomplete (typ FAMILY)
 group_automata.[ct|dct]               - slovník pro autocomplete (typ GROUP)
 location_automata.[ct|dct]            - slovník pro autocomplete (typ LOCATION)
 museum_automata.[ct|dct]              - slovník pro autocomplete (typ MUSEUM)
 mythology_automata.[ct|dct]           - slovník pro autocomplete (typ MYTHOLOGY)
 nationality_automata.[ct|dct]         - slovník pro autocomplete (typ NATIONALITY)
 person_automata.[ct|dct]              - slovník pro autocomplete (typ PERSON i s podtypem ARTIST)
 visual_art_form_automata.[ct|dct]     - slovník pro autocomplete (typ VISUAL ART FORM)
 visual_art_genre_automata.[ct|dct]    - slovník pro autocomplete (typ VISUAL ART GENRE)
 visual_art_medium_automata.[ct|dct]   - slovník pro autocomplete (typ VISUAL ART MEDIUM)
 x_automata.[ct|dct]                   - slovník pro autocomplete (typ všechny typy dohromady)
        
        Oba tyto skripty jsou spouštěny uvnitř skriptu secapi/NER/start.sh.
        
Proces tvorby Knowledge Base i všech potřebných automatů (včetně těch pro autocomplete) je automatizován. Proces je možné spustit pomocí skriptu:
 secapi/NER/start.sh
        
        Tento skript postupně vytvoří dílčí KB, provede jejich sloučení do KB.all, vytvoří KBstatsMetrics.all, vytvoří automaty pro NER i autocomplete a umožní je nahrát na server athena3 (parametr -u nebo --upload) do umístění athena3:/mnt/data/kb, odkud se pak dají jednoduše stáhnout.
        
Kromě skriptu start.sh se na gitu v adresáři NER nacházejí některé další užiteční skripty. Skript deleteKB.sh provede smazání všech vytvořených KB a automatů. Skript uploadKB.sh nahraje vytvořené KB a automaty na server athena3 do umístění athena3:/mnt/data/kb. Skript downloadKB.sh provede stažení poslední stabilní verze KB a automatů ze serveru athena3. Skript TestAndRunStart.sh provede test všech prerekvizit potřebných pro generování automatů a KB a umožňuje spustit jejich řízené generování (více informací zde) s výpisem chyb, které při generování vznikly.
        
Proces tvorby KB a automatů by měly provádět pouze oprávněné osoby. Studentům je zakázáno spouštět skript start.sh s parametrem -u nebo --upload, protože by mohli způsobit nefunkčnost celého nástroje NER.
        
V případě, že někdo nahraje na server athena3 nefunkční verzi KB nebo automatů, je možné se manuálně vrátit vrátit k poslední funkční verzi. Jednotlivé verze se nacházejí v umístění athena3:/mnt/data/kb/kb a jsou číslovány pomocí Unix timestamp (např. 1413053397). Stačí tedy překopírovat všechny soubory v adresáři dané verze do umístění /mnt/data/kb/. Pokud se tedy chceme vrátit k verzi 1413053397, uděláme to pomocí následujícího příkazu:
        
 cp /mnt/data/kb/kb/1413053397/* /mnt/data/kb/.
        Cieľom bolo namatchovať entity z dvoch Knowledge Baseov. Z namatchovaných entít potom vytvoriť nový Knowledge Base. Skript funguje na "akúkoľvek" KB, zloženú z jedného typu entít (person alebo location, prípadne iné), podľa konfiguračných súborov. Matchování je implementováno ve skriptu kb_compare.py, který je dostupný na gitu:
        
 secapi/NER/KnowBase/kb_compare.py
        
        Skript kb_compare.py nyní navíc umí na požádání deduplikovat vstupní KB pomocí atributu --deduplicate_kb1 či --deduplicate_kb2. Tuto funkci je možné provést zvlášť pomocí skriptu kb_dedup.py, který je také na gitu:
        
 secapi/NER/KnowBase/kb_dedup.py
        
        Použití:
kb_compare.py [-h] --first FIRST --second SECOND [--first_fields FIRST_FIELDS] [--second_fields SECOND_FIELDS] --rel_conf REL_CONF [--output_conf OUTPUT_CONF] [--other_output_conf OTHER_OUTPUT_CONF] [--first_sep FIRST_SEP] [--second_sep SECOND_SEP] [--id_prefix ID_PREFIX] [--output OUTPUT]
Optional arguments:
-h --help - vypíše nápovědu a skončí--first FIRST - název souboru první KB (použito jako prefix pro konfigurační soubory)--second SECOND - název souboru druhé KB (použito jako prefix pro konfigurační soubory)--first_fields FIRST_FIELDS - název souboru se seznamem fieldů první KB (default '(--first option).fields')--second_fields SECOND_FIELDS - název souboru se seznamem fieldů druhé KB (default '(--second option).fields')--rel_conf REL_CONF - název souboru s konfigurací vztahů--output_conf OUTPUT_CONF - formát výstupu--other_output_conf OTHER_OUTPUT_CONF - formát výstupu--first_sep FIRST_SEP  - první oddělovač více hodnot (default: '|')--second_sep SECOND_SEP - druhý oddělovač více hodnot (default: '|')--id_prefix ID_PREFIX - prefix pro ID--deduplicate_kb1 - deduplicate_kb1 (default: False)--deduplicate_kb2 - deduplicate_kb2 (default: False)--id_fields ID_FIELD [ID_FIELD ...] - název fieldů s unikátním id pro deduplikaci(default: ['WIKIPEDIA URL', 'FREEBASE URL', 'DBPEDIA URL', 'ULAN ID', 'GEONAMES ID'])--output OUTPUT - název výstupního souboru--second_output SECOND_OUTPUT - název výstupního souboru s nenamatchovanými entitami z druhé KB--treshold TRESHOLD - matchovací hladina--first_fields a --second_fields – Obsahujú štreku k súborom s názvy fieldov daných KB oddelené znakom nového riadku.--output_conf – Konfiguračný súbor obsahujúci formát novo vytváranej KB (vytvára sa z UNIQUE a AMBIGUOUS_OK). Obsahuje názov_kb.názov_fieldu oddelené znakom nového riadku. Prázdne fieldy z prvej KB sa podľa --rel_conf, dohľadajú v druhej KB, a naopak.--other_output_conf – Keďže KB je potrebné vytvoriť aj z dát, ktoré matchnuté neboli, existuje podobný konfiguračný súbor ako u --output_conf. V tomto súbore budú fieldy vždy s prefixom --first (okrem stĺpcov None). Field None je špeciálny typ fieldu, ktorý vytvára prázdny field. Je to potrebné kvôli zachovaniu konzistencie formátu novej KB (to znamená, že ak vo --first  neexistujú niektoré fieldy zo --second, tak sa miesto nich dáva None).--first_sep a --second_sep – Niektoré datové zdroje nevyužívaju konvenciu rozdeľovania MULTIPLE VALUES pomocou znaku '|'. Pre tieto prípady je možné tento separátor nastaviť týmito prepínačmi.--id_prefix – V súboroch --output_conf a --other_output_conf je možné naraziť ešte na jeden typ. A tým je ID. ID je generované interne v skripte. Pomocou --id_prefix sa nastavuje prefix tohoto ID. Napríklad --id_prefix='p' znamená, že všetky ID budú začínať reťazcom "p:" (všeobecne používaný pre entity typu person).--rel_conf – Tyto soubory popisují vztahy (relace) mezi dvěma porovnávanými databázemi. Řádky, na kterých jsou definovány jednotlivé vztahy, musí začínat tabulátorem. Konfigurační soubor může obsahovat následující návěští:
                --treshold – Je to bodová hranice, kterou musí entita dosáhnout, aby byla namatchována. Hodnota této hranice byla určena experimentálně, tak aby skript dával pokud možno co nejlepší výsledky. Hodnota závisí na počtu polí v KB a množství informací v nich. Např. v locations je nastavena na 4. Kvůli této změně bylo tento paramter nutné přidat do shellových skriptů start.sh. Parametr --threshold je povinný.--second_output=filename – Umožňuje vypsat entity z KB2, které nebyly přiřazeny k žádné entitě z KB1, do zvláštního souboru. Při použití tohoto parametru se tyto entity už neobjeví v souboru zadaném parametrem --output !! Skript s tímto parametrem se používá při vzájemném porovnání již vygenerovaných KB typu ARTISTS a PERSONS.--deduplicate_kb1 and deduplicate_kb2 - Povolí deduplikaci KB1, popř. KB2, dle sloupců s identifikátory. Tyto sloupce lze změnit pomocí atributu --id_fields. ./kb_compare.py --first=DBPEDIA --second=GEONAMES --rel_conf=dbpedia_geonames_rel.conf --output_conf=DG_output.conf --output=DG
  --id_prefix=l --other_output_conf=DG_other_output.conf --treshold=4
        
        Použití:
kb_dedup.py [-h] --kb KB [--kb_fields KB_FIELDS] [--kb_sep KB_SEP] [--id_fields ID_FIELDS [ID_FIELDS ...]] --output OUTPUT
        
        Odstranění duplicit z KB.
Nepovinné argumenty:
-h --help - vypíše nápovědu a skončí--kb KB - název souboru KB (užité jako prefix konfiguračního souboru)--kb_fields KB_FIELDS - název souboru se seznamem fieldů KB (default '(--kb option).fields')--kb_sep KB_SEP  - oddělovač více hodnot (default: '|')--id_fields ID_FIELD [ID_FIELD ...] - název fieldů s unikátním id pro deduplikaci (default: ['WIKIPEDIA URL', 'FREEBASE URL', 'DBPEDIA URL', 'ULAN ID', 'GEONAMES ID'])--output OUTPUT - název výstupního souboru--kb_fields - Cesta k souboru, jenž obsahuje názvy sloupců dané KB oddělené znakem nového řádku.--kb_sep - Určí oddělovač hodnot ve vícehodnotových sloupcích značených řetězcem "MULTIPLE VALUES".--id_fields - Deduplikace probíhá dle sloupců s identifikátory, které lze změnit pomocí tohoto atributu.Syntaxe (BNF):
 <soubor> ::= <řádek> | <řádek> <soubor>
 <řádek> ::= <zdroj sloupce> "\n"
 <zdroj sloupce> ::= "ID" | "None" | '"' <zdroj sloupce< '"' | <sloupec z kb>
 <sloupec z kb> ::= <název kb> "." <název sloupce>
 <název kb> ::= <název kb1> | <název kb2>
        
        kde:
ID - vygeneruje na výstupní sloupec identifikátor jako prefix zadaný parametrem --id_prefix a hexadecimálně zapsaný hash sha224 z aktuální hodnoty počítadlaNone - vygeneruje výstupní sloupec prázdný<obsah sloupce> - vyplní daný sloupec tímto řetězcem<sloupec z kb> - určuje který sloupec se použije pro výstup
                *.fields souboru, použije se jedna hodnota, popř. všechny hodnoty, z přiřazených sloupců dle vztahů v zadaném *_rel.conf<název sloupce> je z odpovídajícího *.fields souboru KB <název kb> bez případného příznaku "(MULTIPLE VALUES)"<název kb1> zadán parametrem --first<název kb2> zadán parametrem --second ID
 WF.TYPE
 WF.SUBTYPE
 ULAN.DISPLAY TERM
 WF.ALIAS
 WF.PROFESSION
 WF.NATIONALITY
 WF.DESCRIPTION
 ULAN.DATE OF BIRTH
 ULAN.PLACE OF BIRTH
 ULAN.DATE OF DEATH
 ULAN.PLACE OF DEATH
 ULAN.GENDER
 WF.PERIOD OR MOVEMENT
 WF.PLACE LIVED
 WF.WIKIPEDIA URL
 WF.FREEBASE URL
 WF.DBPEDIA URL
 WF.IMAGE
 WF.ART FORM
 WF.INFLUENCED
 WF.INFLUENCED BY
 ULAN.ID
        
        Syntaxe (BNF):
 <soubor> ::= <řádek> | <řádek> <soubor>
 <řádek> ::= <zdroj sloupce> "\n"
 <zdroj sloupce> ::= "ID" | "None" | '"' <obsah sloupce< '"' | <seznam sloupců z kb>
 <seznam sloupců z kb> ::= <sloupec z kb> | <sloupec z kb> "|" <seznam sloupců z kb>
 <sloupec z kb> ::= <název kb> "." <název sloupce>
 <název kb> ::= <název kb1>
        
        kde:
ID vygeneruje na výstupní sloupec identifikátor jako prefix zadaný parametrem --id_prefix a hexadecimálně zapsaný hash sha224 z aktuální hodnoty počítadlaNone vygeneruje výstupní sloupec prázdný<obsah sloupce> vyplní daný sloupec tímto řetězcem<seznam sloupců z kb> více než jeden sloupec, pak předpokládáme že výstupní sloupec má příznak "(MULTIPLE VALUES)"<sloupec z kb> určuje který sloupec se použije pro výstup<název sloupce> je z odpovídajícího *.fields souboru KB <název kb> bez případného příznaku "(MULTIPLE VALUES)"<název kb1> zadán parametrem --first ID
 "person"
 "artist"
 ARTREPUBLIC.NAME
 None
 None
 None
 ARTREPUBLIC.DESCRIPTION|ARTREPUBLIC.ABOUT
 None
 None
 None
 None
 None
 None
 None
 None
 None
 None
 ARTREPUBLIC.LOCAL IMAGE
 None
 None
 None
 None
 ARTREPUBLIC.PROFILE LINK
        
        Syntaxe (BNF):
 <soubor> ::= <unique> <name> <other>
 <unique> ::= "UNIQUE:" "\n" <seznam vztahů>
 <name> ::= "NAME:" "\n" <seznam vztahů>
 <other> ::= "OTHER:" "\n" <seznam vztahů>
 <seznam vztahů> ::= "" | <vztah> <seznam vztahů>
 <vztah> ::= "\t" <sloupec z kb1> "=" <sloupec z kb2> "\n"
 <sloupec z kb1> ::= <název kb1> "." <název sloupce>
 <sloupec z kb2> ::= <název kb2> "." <název sloupce>
        
        kde:
<unique> jsou vztahy mezi unikátními, jedinečnými hodnotami. Jsou to identifikátory entity. Typicky Wikipedia url nebo Freebase url.<name> jsou vztahy jmen, alternativních jmen, apod.<other> jsou ostatní vztahy, podle kterých nelze přiřazovat entity k sobě, ale které se použijí pro ohodnocení jednotlivých kandidátů.<vztah>  je vztah mezi sloupci  <sloupec z kb1> and <sloupec z kb2>
                *.fields upřednostněn sloupec, jenž je prázdný nebo má příznak "(MULTIPLE VALUES)" v odpovídajícím *_output.conf souboru, pak má vliv i na obsah výstupního sloupce<název kb1> zadán parametrem --first<název kb2> zadán parametrem --second UNIQUE:
	 WIKIPEDIA.WIKIPEDIA URL=FREEBASE.WIKIPEDIA URL
	 WIKIPEDIA.FREEBASE URL=FREEBASE.FREEBASE URL
 NAME:
 	 WIKIPEDIA.NAME=FREEBASE.NAME
	 WIKIPEDIA.NAME=FREEBASE.ALIAS
	 WIKIPEDIA.ALTERNATIVE NAME=FREEBASE.NAME
	 WIKIPEDIA.ALTERNATIVE NAME=FREEBASE.ALIAS
 OTHER:
	 WIKIPEDIA.DATE OF BIRTH=FREEBASE.DATE OF BIRTH
	 WIKIPEDIA.DATE OF DEATH=FREEBASE.DATE OF DEATH
	 WIKIPEDIA.PLACE OF BIRTH=FREEBASE.PLACE OF BIRTH
	 WIKIPEDIA.PLACE OF DEATH=FREEBASE.PLACE OF DEATH
	 WIKIPEDIA.WORK=FREEBASE.PROFESSION
	 WIKIPEDIA.NATIONALITY=FREEBASE.NATIONALITY
	 WIKIPEDIA.INFLUENCED=FREEBASE.INFLUENCED
	 WIKIPEDIA.INFLUENCED BY=FREEBASE.INFLUENCED BY
	 WIKIPEDIA.PERIOD OR MOVEMENT=FREEBASE.PERIOD OR MOVEMENT
	 WIKIPEDIA.IMAGE=FREEBASE.IMAGE
        
        Datové zdroje dostupné z:
 secapi/NER/KnowBase/artworks
        
        V priečinku artworks je niekoľko súborov. Tými sú:
 DBPEDIA (datový zdroj získaný z DBPEDIE)
 DBPEDIA.fields (formát datového zdroja DBPEDIE – všimnite si hlavne postfix " (MULTIPLE VALUES)" potrebný pre rozlíšenie viacerých hodnôt vo fielde)
 FREEBASE (datový zdroj získaný z FREEBASE)
 FREEBASE.fields (formát datového zdroja FREEBASE)
 ARTWORKS (novo vytvorená KB – ktorú chceme vytvoriť odznova)
 ARTWORKS.fields (formát novej KB potrebný pre ostatných členov podieľajúcich sa na Decipheri)
 ARTWORKS_other_output.conf (konfiguračný súbor pre prepínač --conf_other_output)
 ARTWORKS_output.conf (konfiguračný súbor pre prepínač --conf_output)
 dbpedia_freebase_rel.conf (konfiguračný súbor určujúci relácie medzi fieldami DBPEDIE a FREEBASE)
 start.sh (príkaz pre spustenie tvorby novej KB so všetkými potrebnými prepínačmi)
        
        Porovnávají se vždy dvě Knowledge base – KB1 a KB2. KB1 se postupně prochází po jednotlivých řádcích a ke každému řádku se hledá odpovídající záznam v KB2. Nejprve se hledá v KB2 položka se stejným unikátním identifikátorem (typicky wikipedia url). Porovnávají se pole určené návěštím UNIQUE. Může se hledat i podle více takovýchto identifikátorů. Pokud je nějaký takový záznam v KB2 nalezen, je hned přiřazen k záznamu v KB1 a vyhledávání končí. Pokud nic nebylo nalezeno nebo pokud záznam v KB1 neobsahuje identifikátor, probíhá vyhledávání kandidátů podle vztahů určených návěštím NAME. Typicky se porovnávají jména, pseudonymy, alternativní jména apod. Výsledkem hledání je seznam kandidátů vhodných k přiřazení. Každý kandidát je ohodnocen podle počtu shodných řetězců. Následuje hodnocení na základě vztahů za návěštím OTHER. K přiřazení je vybrán kandidát s nejlepším ohodnocením, pokud je ohodnocení větší nebo rovno stanovenému prahu (treshold), jinak se nevybere nic. Entita z KB2 se označí příznakem „used“, aby již dále nemohla být použita.
V některých případech může dojít k tomu, že dvě entity se nespárují, i když by měly. Ukázkou takového případu jsou například následující dva záznamy:
a:8b4f4e2666 artist Charles Alexander Smith Charles Alexander Smith Charles Alexander Smith Canadian Charles Alexander Smith was a Canadian painter from Ontario. 1864 1915 M http://www.freebase.com/m/0269dw5 http://en.wikipedia.org/wiki/Charles_Alexander_Smith http://dbpedia.org/page/Charles_Alexander_Smith freebase/02cy_gx.jpg
a
a:3f368917fe artist Charles Alexander Alexander, Charles Alexander Charles Smith artist photographer|painter British Canadian British painter, 1864-1915 1864 Ontario (Canada) (province) 1915 London (Greater London, England, United Kingdom) (inhabited place) M 500026312
Tyto dva záznamy nebylo možné k sobě přiřadit. Především, druhý záznam neobsahuje žádný unikátní identifikátor, jako např. wiki URL, podle kterého by mohl být jednoznačně přiřazen k prvnímu záznamu. Přiřazení podle shody jmen bohužel také nebylo úspěšné, jelikož první záznam obsahuje pouze jméno "Charles Alexander Smith" a druhý záznam obsahuje "Charles Alexander", "Alexander, Charles" a "Alexander Charles Smith". Všimněte si, že zde jsou křestní jména v opačném pořadí, řetězce se neshodují, tudíž entity nebyly vzájemně přiřazeny.
Úkolem je vytvořit regulární výraz, který bude umět vytáhnout všechny běžně se vyskytující formáty dat v textu (2004-04-30, 02/30/1999, 31 January 2003 atd.). Regulární výraz by měl být komplexní (pouze jeden reg. výraz) a měl by umět vytáhnout co nejvíce bežných formátů (časy nás nezajímají, pouze roky, měsíce a dny).
Po vytáhnutí dat se provede jejich normalizace (do ISO 8601), aby bylo možné s daty dále pracovat.
Kromě regulárního výrazu bylo třeba napsat kód (funkci a třídu) pro jeho zpracování a předání zpracovaných dat dalším skriptům.
Vstupem je prostý text v anglickém jazyce (typ str) a výstupem je seznam (typ list) položek třídy Date.
Pokud by měl být skript dokonalý musel by obsahovat sémantickou analýzu anglického textu, která by rozeznala co je a co není datum popř. rok.
Skript se nachází na gitu v umístění:
 secapi/NER/dates.py
        
        Class Date
Třída pro nalezená data. Kromě roku, měsíce a dnu obsahuje také místo nalezení ve zdrojovém řetězci a řetězec, ze kterého bylo toto datum převedeno. Po vytvoření nové instance je nutné zavolat init_date() nebo init_interval() pro inicializaci atributů.
        
Má dva typy, DATE pro prosté datum a INTERVAL pro interval mezi dvěma daty. Zde je příklad s komentáři:
 class_type: DATE          # Atribut značící typ nalezeného data (prosté datum či interval).
 source:     April 2, 1918 # Řetězec source ze zdrojového textu.
 iso8601:    1918-04-02    # Datum v **ISO_date**
 s_offset:   265           # Začátek řetězce source ve zdrojovém textu
 end_offset: 278           # Konec řetězce source ve zdrojovém textu (vypočítaný z """s_offset + len(source)""")
 ---------------------------------
 class_type: INTERVAL
 source:     1882-83
 date_from:  1882-00-00    # Počáteční datum v **ISO_date**
 date_to:    1883-00-00    # Koncové datum v **ISO_date**
 s_offset:   467        
 end_offset: 474      
        
        Třída ISO_date
Třída uchovávající datum (tedy rok, měsíc a den). Obsahuje atributy day, month a year. Vytvořena pro nahrazení datetime.date v situacích kdy známe jen rok. V takovém případě se neznámé údaje nahradí hodnotou nula (např. 1881-00-00).
Pouze měsíc a rok:
Pouze rok:
Při použití dateutil.parser:
 str(dateutil.parser.parse("Jul 18 '30").date()) -> '2030-07-18' # automaticky doplní aktuální první dvojčíslí - považuji za správné
 str(dateutil.parser.parse("Jul 18 30").date()) -> '2030-07-18' # co když to rok 30?
 str(dateutil.parser.parse("0030-01-01").date()) -> '2001-01-30' # vypadá to, že dateutil.parser nebere rok menší než sto
 str(dateutil.parser.parse("0099-01-01").date()) -> '1999-01-01' # nedoplní vždy aktuální první dvojčíslí, ale nejbližší
 str(dateutil.parser.parse("Jul 18 '62").date()) -> '2062-07-18' # jelikož je rok 2013
 str(dateutil.parser.parse("Jul 18 '63").date()) -> '1963-07-18' # jelikož je rok 2013
 str(dateutil.parser.parse("0100-01-01").date()) -> '0100-01-01' # správné
 
 když dostanu DD/MM/YYYY, pak dateutil.parser vezme toto datum jako MM/DD/YYYY pokud DD < 13 jinak jako DD/MM/YYYY
 str(dateutil.parser.parse("10/1/2000").date()) -> '2000-10-01'
 str(dateutil.parser.parse("13/1/2000").date()) -> '2000-01-13'
        
        Při prohledání 45,764,556 slov bylo nalezeno 561,744 údajů (z toho 177,336 interavalů) za 11m 17.836s, tedy rychlostí 67,515.6764 slov za sekundu.
Úkolem bylo vytvoření sady testů pro skript start.sh uložený v secapi/NER.
        
Seznam vytvořených souborů:
 secapi/NER/TestAndRunStart.sh - testovací skript
 secapi/NER/AllKB.txt - seznam souborů potřebných k tvorbě nové KB
 secapi/NER/fields.txt - seznam field souborů
 secapi/NER/MatchKBAndFields.py - skript, který spojí k jednotlivým KB příslušný fields soubor
        
        Pokud je skript spuštěn s parametrem -t jako první skript TestAndRunStart.sh testuje dostupnost souborů, se kterými pracuje start.sh a skripty, které start.sh spouští. Dále se provádí kontrola, zda mají *.py a *.sh soubory nastavená patřičná práva. Následuje testování správného formátu, respektive počtu sloupců, souborů, které jsou potřebné k tvorbě nové KB (seznam v souboru AllKB.txt). Počet sloupců musí být shodný s počtem sloupců ve fields souborech uložených v NER/KnowBase.
        
Při spuštění s parametrem -r je volán skript start.sh a stderr je přesměrován do souboru. Po skončení skriptu je stderr analyzována a vypíší se jména chybějící souborů, pokud nějaké jsou, počet chyb vzniklých za běhu a počet varování. Po vytvoření nových automatů a KB dochází ke srovnávání se starými verzemi automatů a souborů KB.all a KBstatsMetrics.all. Skript hlásí chybu pokud je rozdíl nově vytvořeného souboru a starší verze větší než 5% nebo když je nový soubor menší o více než 10%. Skript také hlásí chybu v případě, že nedošlo k vytvoření nějakého automatu nebo KB.
        
K testování skriptů ner.py dochází při spuštění s parametrem -n a nástroje figav08 při spuštění s parametrem -f. Testování probíhá ze 75% na datech uložených v secapi/NER/data/input.  V ostatních případech je testována konkrétní entita. "Paris 1984" u ner.py a "A Alewijn" u figav08. Dále je nástroj ner.py (také při spuštění s parameterem -n) testován s různými přepínači. Dochází ke spuštění nástroje bez přepínačů, s přepínačem -l (převod vstupu na malá písmena), s přepínačem -r (s chybou v diakritice na vstupu) a spuštění s přepínači -l a -r se špatným vstupním textem.
        
Příklady spuštění:
 ./TestAndRunStart.sh -t -> spustí testování existence souborů, jejich oprávnění a testování formátu souboru potřebných k tvorbě KB
 
 ./TestAndRunStart.sh -r -> spustí skript start.sh
 
 ./TestAndRunStart.sh -f -> spustí se testování nástroje figa
 ./TestAndRunStart.sh -n -> spustí se testování nástroje ner
 ./TestAndRunStart.sh -h -> spuštění nápovědy k programu
 ./TestAndRunStart.sh -c -> spustí skript CheckNerOut.py - testování výstupu z Neru s ruční anotací
        
        Pro porovnání slouží skript CheckNerOut.py, který na výstup vypíše procentuální shodu. Do složky secapi/NER/CheckNerOut ukládá soubor s entitami z anotace, které nebyly spárované. Totéž provádí s entitami ze souboru, který obsahuje výstup z NERu. Skript byl zakomponován do skriptu TestAndRunStart.sh, kde testuje soubory, ke kterým existuje ruční anotace.
        
Příklad spuštění:
 python CheckNerOut.py -a SouborSAnotaci.tsv -o NerOutput.txt
        
         Paul_Kane: 56.6037735849%
 travelling_artist_part2: 69.0909090909%
 travelling_artist_part3: 81.6513761468%
 Dossier_and_OS_texts.docx: 56.5020576132%
        Účelom skriptu je rozpoznávanie krstných a rodných mien osôb vo zvolenom texte pomocou zoznamu mien. Nástroj sa nachádza v git repozitári v priečinku secapi/NameRecognizer v branchi D114-NER.
        
1. krok - Zostavenie zoznamu mien
Najprv bolo potrebné zostaviť zoznam mien pre konečný automat. Preto som vytvoril nástroj Name Collector, ktorý je popísaný nižšie. Z výstupných textových súborov nástroja je pre konečný automat podstatný len súbor outputs/all.txt.
        
2. krok - Kompilácia nástroja figa:
Najprv je potrebné stiahnuť git repozitár nástroja figa (viď. Decipher_fsa) to:
 /mnt/minerva1/nlp/projects/decipher_ner/xklima22 
        
        a následne spustiť skript:
 /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/create_figa.sh
        
        Skript skompiluje nástroj a skopíruje ho do priečinku:
/mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/data
        
        3. krok - Zostavenie konečného automatu:
Rovnako ako v 2. kroku je potrebné aby bol stiahnutý git repozitár figy a potom treba spustiť skript:
 /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/create_fsa.sh
        
        Skript zostaví konečný automat automat.fsa pomocou zoznamu mien z prvého kroku a umiestni ho do priečinku:
 /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/data
        
        4. krok - Spracovanie výstupov figy:
Výstupy figy upravujem pomocou sort -u a potom ďalej skriptom process_outputs.py script:
 /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/process_outputs.py
        
        Skript prijíma 2 parametre - vstupný a výstupný súbor - a spája získané mená na základe offsetov.
Skript process_outputs.py využíva pri filtrovaní zoznamy, ktoré sú uložené v priečinku data/lists a sú to (abecedne):
 blist_locations.txt  - zoznam lokácií, vytváraný skriptom kb_locations
 custom_names.txt     - zoznam manuálne doplnených mien
 custom_surrnames.txt - zoznam manuálne doplnených priezvisk
 names.txt            - zoznam mien, z výsledkov skriptov name_collector a kb_list
 nationalities.txt    - zoznam národností
 notfirst.txt         - zoznam slov, ktoré nemôžu byť na prvej pozícii
 replace.txt          - zoznam slov alebo slovných spojení, ktoré majú byť z mien odstránené 
 surrnames.txt        - zoznam priezvisk, z výsledkov skriptov name_collector a kb_list
        
        Celý krok je zautomatizovaný pomocou skriptu run.sh, ktorý načítava data zo stdin a výsledky vypisuje na stdout.
        
Skript okrem mien vyhľadá v texte aj iniciálky (dvojznakové slová zložené z kapitálky a bodky) zistí ich začiatočné a koncové offsety a potom ich pridá do zoznamu mien z výstupu nástroja figa. Po získaní zoznamu mien sa z mien končiacich "'s" táto časť odstráni a prepočíta sa koncový offset.
Použitie:
 bash /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/run.sh [--show-filtered]
        
        Nepovinný parameter --show-filtered spôsobí, že sa odfiltrované mená zapíšu do súboru.
        
Príklad použitia:
 bash /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/run.sh < /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/test_data/test.txt
        
        Výstup vyššie uvedeného príkladu:
 0	26	39	Nathaniel Hill
 0	41	54	Nathaniel Hill
 1	202	224	Joseph Malachy Kavanagh
 1	226	248	Joseph Malachy Kavanagh
 0	328	341	Walter Osborne
 0	347	360	Nathaniel Hill
 0	539	552	Edward McGuire
 0	554	567	Edward McGuire
        
        Formát výstupu:
 1. stĺpec - Typ mena podľa spôsob, akým bolo meno v texte nájdené (0 - všetky mená boli nájdené nástrojom figa, 1 - mená, v ktorých bola časť nájdená zhodou a časť doplnená skriptom).
 2. stĺpec - Začiatočný offset
 3. stĺpec - Koncový offset
 4. stĺpec - Meno
        
        Zoznam získaných mien môže obsahovať aj nevalidné mená (napr. Post Office) alebo mená, ktoré sú podreťazce iných nájdených mien. Toto je spôsobené tým, že pre zvýšenie počtu získaných mien sa nekontroluje, či priezvisko je obsiahnuté v zozname surnames.txt. Spôsob akým bolo meno nájdené indikuje prvý stĺpec výsledkov, možné značenia sú:
        
 0 - všetky mená boli nájdené nástrojom figa
 1 - mená, v ktorých bola časť nájdená zhodou a časť doplnená skriptom
 4 - mená vzniknuté spojením mien typu 0 a 1
 7 - mená, ktorých priezvisková časť nebola nájdená v surnames.txt
 8 - mená, ktoré sú podreťazcom iného nájdeného mena
        
        Mená označené číslom 4 vznikajú spojením mien typu 0 a 1. Najprv sa zistí, ktoré zo spájaných mien má nižší start offset, potom sa z tohoto mena vezmú všetky slová, ktoré sú doplnené o slová z druhého mena (len také, ktoré sa vo výslednom mene ešte nevyskytujú). Nakoniec sú prepočítané offsety a prvé meno je nahradené novým a druhé odstránené.
Skript je schopný sa naučiť nové slová z mien typu 1 (popis viď. odsek vyššie). Takto naučené slová sú uložené do:
 /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/outputs/learned.txt
        
        U týchto slov nemožno jednoznačne určiť, či sa jedná o meno alebo priezvisko, preto sú zahrnuté len do všeobecného zoznamu a nie sú v zoznamoch names.txt a surrnames.txt (popis zoznamov je na začiatku kroku).
        
Mená, ktoré boli odfiltrované z určitého dôvodu sú uložené v:
 /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/outputs/filtered.txt
        
        Uložené sú len výsledky posledného spracovania. Zapisovanie odfiltrovaných mien je potrebné povoliť nepovinným parametrom --show-filtered. Číslo na začiatku riadku značí dôvod odfiltrovania (v zátvorkách uvádzam zoznamy, ktoré zapríčinili odfiltrovanie mena):
        
 0 - Meno obsahovalo menej ako 2 slová
 1 - Meno obsahovalo názov lokácie (zoznam blist_locations.txt)
 2 - Meno malo na ako prvé slovo slovo, ktoré na tejto pozícii nemôže byť (zoznam notfirst.txt)
 3 - Meno obsahovalo ako prvé slovo slovo, ktoré nie je meno (names.txt)
 4 - Meno obsahovalo ako posledné slovo slovo, ktoré nie je priezvisko (surrnames.txt) [ODSTRÁNENÉ]
 5 - Meno obsahovalo národnosť (nationalities.txt)
        
        5. krok - Zvýraznenie nájdených mien v texte:
Výstupy figy ďalej využíva skript:
 /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/highlight_names.py
        
        Skript vyžaduje výstupy predošlého kroku uložené v súbore figa.out a prijíma text na stdin a na stdout vypisuje text vo formáte HTML s farebne zvýraznenými menami:
        
 zelené           Mená označené 0 v prvom stĺpci výstupov figy, t.j. mená nájdené úplnou zhodou s menami v names.txt a surrnames.txt
 červené          Mená označené 1 v prvom stĺpci výstupov figy, t.j. mená, u ktorých bolo aspoň jedno meno doplnené skriptom, tým pádom sa nemusí jednať o validné meno
 modré            Mená, ktoré boli v texte nájdené viackrát ako je ich počet vo výstupoch figy.
 fialové          Koreferencie mien zvýraznených vyššie uvedenými farbami
 limetkové (lime) Mená, ktorých priezvisko sa nenachádza v zozname surrnames.txt
 olivové (olive)  Mená, ktoré sú podreťazcom dlhšieho mena (zeleného, červeného alebo modrého)  
        
        Kde prvý stĺpec určuje spôsob akým bolo meno v texte nájdené (viď 4. krok). Mená označené modrou môžu naznačovať chybu pri spracovaní výstupov skriptom process_outputs.py alebo chybu pri vyhľadávaní nástrojom figa.
        
Použitie:
 python /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/highlight_names.py
        
        Príklad použitia:
 bash /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/run.sh < /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/test_data/test.txt > figa.out
 python /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/highlight_names.py < /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/test_data/test.txt > outputs/examples/example.html
        
        Súbor s ukážkovým výstupom je uložený v:
 /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/outputs/example.html
        
        Výsledky
Mená rozpoznané nástrojom v testovacích textoch:
 Richard Moynan
 Mary Magdalene
 Jack B.
 Lawrence J.
        
        Pre využitie NameRecognizeru v iných skriptoch je pripravený obalovací skript name_recognizer.py, ktorý sprístupňuje funkcionalitu skriptov process_outputs.py a highlight_names.py pomocou dvoch funkcií - process(text) a highlight(text, vystup_fce_process), ktoré vracajú spracované výstupy nástroja figa alebo text so zvýraznenými menami.
        
Pred použitím treba instancovať triedu NameRecognizer s dvoma povinnými parametrami konštruktoru - cesta k spustiteľnému súboru figa (figav08) a cesta ku konečnému automatu (*.fsa).
Na vyskúšanie funkcionality možno skript spustiť, ako vstupný text je použitý :
 /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/test_data/example_input.txt
        
        výstup je vypísaný na stdout:
 python /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/name_recognizer.py
        
        Nástroj, ktorý získava zoznam mien z niekoľkých webových stránok, je umiestnený v:
 /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/name_collector
        
        Štruktúra adresára:
 main.py                  - spúšťací skript nástoja
 base.py                  - definuje triedu, z ktorej dedia triedy zdrojov (webov), ktoré majú dopredu známy počet stránok
 base_pagination.py       - definuje triedu, z ktorej dedia triedy zdrojov (webov), ktoré používajú stránkovanie (t.j. majú tlačítko "next")
 rsrc_*_base.py           - triedy, ktoré definujú spoločné rozhranie pre určité zdroje
 rsrc_*.py                - triedy zdrojov
 outputs/names.txt        - abecedne zoradený zoznam získaných mien
 outputs/surrnames.txt    - abecedne zoradený zoznam získaných priezvisk
 outputs/all_raw.txt      - abecedne zoradený zoznam získaných mien a prizevisk
 outputs/all.txt          - súbor all_raw.txt upravený do formátu vhodného pre nástroj figa
 outputs/name/*.txt       - výstupy zdrojov s menami
 outputs/surrname/*.txt   - výstupy zdrojov s priezviskami
        
        Weby implementované ako zdroje:
 http://german.about.com/library/blname_Girls.htm
 http://german.about.com/library/blname_Boys.htm
 http://babynames.net
 http://surname.sofeminine.co.uk/w/surnames/most-common-surnames-in-great-britain.html
 http://www.surnamedb.com/Surname
 http://en.wikipedia.org/wiki/Old_Frisian_given_names
 http://en.wikipedia.org/wiki/List_of_biblical_names
 http://en.wikipedia.org/wiki/Slavic_names
 http://genealogy.familyeducation.com/browse/origin/
        
        Použitie:
 python /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/name_collector/main.py
        
        Skript sa automaticky spúšťa pri použití skriptu run.sh v pomocnom nástroji KB List.
Nástroj na extrakciu mien z KB.all, výsledky zlučuje s výsledkami z Name Collectoru, je umiestnený v:
        
 /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/kb_list
        
        Kompletné spracovanie, zlúčenie a kategorizácia dát na mená a priezviská sa vykonáva pomocou run.sh.
        
Použitie:
 bash /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/kb_list/run.sh
        
        Nástroj, ktorý vytvára zoznam lokácií použitý pri filtrovaní výstupov figy. Výsledkom skriptu je zoznam:
 data/lists/blist_locations.txt
         
        Skript je umiestnený v:
 /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/kb_locations
        
        a spúšťa sa pomocou:
 bash /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/kb_locations/run.sh
        
        Skript, ktorý v KB.all. vyhľadá všetky jednoslovné mená. Skript je umiestnený v priečinku:
        
 /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts
        
        Spúšťa sa pomocou:
 python /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/swn.py
        
        Výstupom skriptu sú jednoslovné mená spolu s informáciami o výskyte v KB.all. Na prvom riadku sa nachádza verzia KB.all. Formát druhého a ostatných nasledovných riadkov je nasledovný:
        
 1. stĺpec - číslo riadku KB.all, na ktorom bolo meno nájdené
 2. stĺpec - ID osoby v KB.all
 3. stĺpec - meno
        
        Ukážkové výstupy skriptov process_outputs.py (súbory s príponou .out), highlight_names.py (súbory s príponou .html) a swn.py (swn.txt) sú uložené v:
        
 /mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/outputs/examples/
        Cílem projektu je kompletní nahrazení FSA automatů v projektu FIGA za CEDAR (implemented in project Ner4).
Tento projekt má vlastní větev na gitu NER-figa_cedar.
V následujících kapitolách budou stručně popsány změny provedené při migraci fsa figa na cedar figa.
Pro projekt Ner se skripty většinou pouze mírně aktualizovaly, aby využívaly/podporovaly novou verzi Figy.
Ponechány následující soubory, přestože ani ve staré verzi nebyly využívány:
 NER/figa/sources/kb_loader_fast.cc
 NER/figa/sources/kb_loader_slow.cc
        
        Aktualizovány skripty, aby využívaly novou verzi figy:
 NER/start.sh
 NER/uploadKB.sh
 NER/deleteKB.sh
 NER/ner.py
        
        V projektu Figa byly provedeny velké změny. Nejdůležitější je náhrada FSA automatů za CEDAR tries. Byla snaha novou Figa co nejméně modifikovat - většinou byly jen opraveny triviální bugy. Pro potřeby nové figy bylo mírně upraveno rozhraní Figa (c++) <-> Ner (python). Nová automaty Figy zabírají mnohem více místa na disku, ale jejich zpracování je rychlejší (viz stránka nové Figa).
        
create_fsa[_autocomplete].sh přepsán a upraven na create_cedar[_autocomplete].shautocomplete.pyNásleduje srovnání nároků na prostředky tvorby a vyhledávání v automatech jednotlivých knihoven. Všechny testy probíhaly na serveru athena1.
Pro tvorbu namelistů byly použity Knowledge Base z projektu Ner: KB.all (5400067 entit) a jeho menší verze KB.11 (490915 entit - obsahuje každý 11. řádek z KB.all).
        
Pro vyhledávání entit byly použity vstupní texty example_input2 (3693 slov) a testing_data.txt (17931 slov).
        
Tvorba automatu (FSA) a slovníku (CEDAR/DARTS). Předpokládá se již připravený namelist, měří se tedy jen čas generování samotného automatu pomocí figav1.0/fsa_build (nikoliv celý proces create_[cedar|fsa].sh):
        
| Čas | Čas | Čas | Využití paměti | Využití paměti | Využití paměti | Velikost automatu | Velikost automatu | Velikost automatu | |
|---|---|---|---|---|---|---|---|---|---|
| FSA | CEDAR | DARTS | FSA | CEDAR | DARTS | FSA | CEDAR | DARTS | |
| KB.11 | 56s | 31s | 30s | 2.4 GB | 331,1 MB | 251,1 MB | 24,3 MB | 98,4 MB | 31,3 MB | 
| KB.all | 115m | 4m 46s | 4m 50s | 8,8 GB | 2,8 GB | 2,9 GB | 237,1 MB | 921,1 MB | 334,3 MB | 
Tvorba automatu pro spellcheck (FSA), pro CEDAR a DARTS není speciální slovník potřeba:
| Čas | Využití paměti | Velikost automatu | |
|---|---|---|---|
| KB.11 | 12s | 329,4 MB | 11,6 MB | 
| KB.all | 3m 42s | 4,0 GB | 90,8 MB | 
Vyhledávání ve vytvořených automatech/slovnících:
| Čas | Čas | Čas | Využití paměti | Využití paměti | Využití paměti | ||
|---|---|---|---|---|---|---|---|
| FSA | CEDAR | DARTS | FSA | CEDAR | DARTS | ||
| KB.11 | example_input2 | 0,11s | 0,49s | 0,16s | 36,8 MB | 110,9 MB | 43,9 MB | 
| KB.11 | testing_data.txt | 0,15s | 0,51s | 0,18s | 36,8 MB | 110,9 MB | 43,9 MB | 
| KB.all | example_input2 | 1,21s | 4,74s | 1,89s | 249,7 MB | 933,7 MB | 346,8 MB | 
| KB.all | testing_data.txt | 1,27s | 4,84s | 1,93s | 249,7 MB | 933,7 MB | 346,8 MB | 
Vyhledávání se zapnutým spellcheckem ve vytvořených automatech/slovnících:
| Čas | Čas | Čas | Využití paměti | Využití paměti | Využití paměti | ||
|---|---|---|---|---|---|---|---|
| FSA | CEDAR | DARTS | FSA | CEDAR | DARTS | ||
| KB.11 | example_input2 | 0,12s | 4,3s | 3,4s | 48,4 MB | 110,9 MB | 43,8 MB | 
| KB.11 | testing_data.txt | 0,17s | 20,8s | 17,1s | 48,5 MB | 110,9 MB | 43,8 MB | 
| KB.all | example_input2 | 1,64s | 23,5s | 17,3s | 340,5 MB | 934,1 MB | 347,9 MB | 
| KB.all | testing_data.txt | 1,67s | 2m 26s | 2m | 340,5 MB | 934,8 MB | 347,3 MB | 
Závěr
DAR a DARTS knihovny vytvoří automat oproti FSA mnohem rychleji, navíc s mnohem menším požadavkem na paměť (pro tvorbu některých opravdu velkých namelistů z projektu Wikify ani nestačila paměť serveru athena1, navíc se ani na athena3 nepodařilo vytvořit FSA slovník bez chyby). CEDAR ani DARTS dále nepotřebují speciální automaty pro spellchecking. Naproti tomu vytvořený FSA automat zabírá na disku méně místa na disku a vyhledávání v něm probíhá mnohem rychleji.
Pro porovnávání změn, entit s wikipedia linkem, různých verzí KB je vytvořen skript secapi/NER/KB_changes_comparator.py ve větvi "wikipedia_update".
        
Povinné argumenty:
oldKB_path - cesta ke staré KBnewKB_path - cesta k nové KBNepovinné argumenty:
-h --help - vypíše nápovědu a skončí-w --word - pokud nastaveno, změny budou zobrazeny v kontextu celých slov, ne jen jejich částí-e CATEGORY --exclude CATEGORY - vyřezení kategorií z porovnání. Použití: --exclude "ALIAS,DATE OF DEATH" a z výstupu budou vyřezeny kategorie ALIAS a DATE OF DEATH. Dá se použít následovně:
--exclude WIKI a všechny kategorie s WIKI v názvu budou vyřazeny. Názvy kategorií jsou v souboru HEAD-KB.-c CATEGORY --category CATEGORY - explicitně nastaví kategorii pro testování. Názvy kategorií jsou v souboru HEAD-KB.Příklad spuštení:
 python ./KB_changes_comparator.py oldKB.tsv newKB.tsv -w -e "GENDER,NATIONALITY"
 # Porovná oldKB s newKB s tím že bude vypisovat celá slova a bude vynechávat kategorie GENDER a NATIONALITY
 python ./KB_changes_comparator.py oldKB.tsv newKB.tsv -c DESCRIPTION
 # Porovná oldKB s newKB s tím že bude porovnávat pouze kategorii DESCRIPTION
        
        Příklad výstupu s argumentem -w a bez:
 without -w
 4116    4116    DESCRIPTION     http://en.wikipedia.org/wiki/Štepán_Wagner      replace .       ->      er
 
 with -w
 4116    4116    DESCRIPTION     http://en.wikipedia.org/wiki/Štepán_Wagner      replace  jump.  ->       jumper
        
        Struktura výstupu:
 číslo_řádku_v_newKB \t číslo_řádku_v_oldKB \t kategorie_sloupce \t wiki_link \t typ_změny \t původní_hodnota \t -> \t nová_hodnota
        
        Vyjímka v případě nalezení nové entity:
 číslo_rádku \t wiki_link \t new \t obsah řádku entity
        
        Příklad:
 452196	3323492	{e}PLACE OF BIRTH	http://en.wikipedia.org/wiki/Jan_van_der_Heyden	insert		->	Gorinchem (South Holland, Netherlands) (inhabited place)
17641   17641   PLACE OF BIRTH  http://en.wikipedia.org/wiki/African_Spir       replace Elisabethgrad,  ->      Elizabethgrad,
278171  http://en.wikipedia.org/wiki/Erjon_Vucaj        new     p:6fa1cac12f    person  Erjon Vucaj             footballer                      Albania, Shkodër                1990-12-25                      
                      http://en.wikipedia.org/wiki/Erjon_Vucaj        http://www.freebase.com/m/0b__zy7       http://dbpedia.org/page/Erjon_Vucaj
        
        Vygenerované výstupy spuštěné příkazem:
 python KB_changes_comparator.py /mnt/data/kb/1455196205/KB.all /mnt/data/kb/1476090552/KB.all
        
        je možné najít v adresáři:
 /mnt/minerva1/nlp/projects/wikipedia_update/output.out
        
        Doba běhu pro asi 4500000 řádků je asi 5-6 minut. Skript využívá pro získávaní označení sloupců různých druhů entit soubor:
 /mnt/minerva1/nlp/repositories/decipher/secapi/HEAD-KB