Decipher ner

Obsah

Decipher NER (iotrusina)

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.

Knowledge Base (iotrusina)

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) nebo sloupcem TYPE (druhý sloupec). Do budoucna se počítá se zrušením prefixů, proto je vhodné k identifikaci typu využívat sloupec TYPE. 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.

Aktuální verzi KB je možno stáhnout ze serveru athena3 nebo je dostupná přímo na serveru athena3 v /mnt/data/kb/KB.all.

 PERSON (prefix: p)
 ==========================================
 01 ID
 02 TYPE
 03 NAME
 04 ALIAS (MULTIPLE VALUES)
 05 DESCRIPTION
 06 IMAGE (MULTIPLE VALUES)
 07 PERIOD OR MOVEMENT (MULTIPLE VALUES)
 08 PLACE OF BIRTH
 09 PLACE OF DEATH
 10 DATE OF BIRTH
 11 DATE OF DEATH
 12 PROFESSION (MULTIPLE VALUES)
 13 PLACE LIVED (MULTIPLE VALUES)
 14 GENDER
 15 NATIONALITY (MULTIPLE VALUES)
 16 WIKIPEDIA URL
 17 FREEBASE URL
 18 DBPEDIA URL
 ARTIST (prefix: a)
 ==========================================
 01 ID
 02 TYPE
 03 DISPLAY TERM
 04 PREFERRED TERM
 05 OTHER TERM (MULTIPLE VALUES)
 06 PREFERRED ROLE
 07 OTHER ROLE (MULTIPLE VALUES)
 08 PREFERRED NATIONALITY
 09 OTHER NATIONALITY (MULTIPLE VALUES)
 10 DESCRIPTION (MULTIPLE VALUES)
 11 DATE OF BIRTH
 12 PLACE OF BIRTH
 13 DATE OF DEATH
 14 PLACE OF DEATH
 15 GENDER
 16 NOTE
 17 PERIOD OR MOVEMENT (MULTIPLE VALUES)
 18 INFLUENCED (MULTIPLE VALUES)
 19 INFLUENCED BY (MULTIPLE VALUES)
 20 ART FORM (MULTIPLE VALUES)
 21 PLACE LIVED (MULTIPLE VALUES)
 22 WIKIPEDIA URL
 23 FREEBASE URL
 24 ULAN ID
 25 DBPEDIA URL
 26 OTHER URL (MULTIPLE VALUES)
 27 IMAGE (MULTIPLE VALUES)
 LOCATION (prefix: l)
 ==========================================
 01 ID
 02 TYPE
 03 NAME
 04 ALTERNATIVE NAME (MULTIPLE VALUES)
 05 LATITUDE
 06 LONGITUDE
 07 FEATURE CODE
 08 COUNTRY
 09 POPULATION
 10 ELEVATION
 11 WIKIPEDIA URL
 12 DBPEDIA URL
 13 FREEBASE URL
 14 GEONAMES ID
 15 SETTLEMENT TYPE (MULTIPLE VALUES)
 16 TIMEZONE (MULTIPLE VALUES)
 17 DESCRIPTION
 18 IMAGE (MULTIPLE VALUES)
 ARTWORK (prefix: w)
 ==========================================
 01 ID
 02 TYPE
 03 NAME
 04 ALIAS (MULTIPLE VALUES)
 05 DESCRIPTION
 06 IMAGE (MULTIPLE VALUES)
 07 ARTIST (MULTIPLE VALUES)
 08 ART SUBJECT (MULTIPLE VALUES)
 09 ART FORM
 10 ART GENRE (MULTIPLE VALUES)
 11 MEDIA (MULTIPLE VALUES)
 12 SUPPORT (MULTIPLE VALUES)
 13 LOCATION (MULTIPLE VALUES)
 14 DATE BEGUN
 15 DATE COMPLETED
 16 OWNER (MULTIPLE VALUES)
 17 HEIGHT
 18 WIDTH
 19 DEPTH
 20 WIKIPEDIA URL
 21 FREEBASE URL
 22 DBPEDIA URL
 23 PAINTING ALIGNMENT (MULTIPLE VALUES)
 24 MOVEMENT
 MUSEUM (prefix: c)
 ==========================================
 01 ID
 02 TYPE
 03 NAME
 04 ALIAS (MULTIPLE VALUES)
 05 DESCRIPTION
 06 IMAGE (MULTIPLE VALUES)
 07 MUSEUM TYPE (MULTIPLE VALUES)
 08 ESTABLISHED
 09 DIRECTOR
 10 VISITORS (MULTIPLE VALUES)
 11 CITYTOWN
 12 POSTAL CODE
 13 STATE PROVINCE REGION
 14 STREET ADDRESS
 15 LATITUDE
 16 LONGITUDE
 17 WIKIPEDIA URL
 18 FREEBASE URL
 19 ULAN ID
 20 GEONAMES ID
 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
 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
 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
 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
 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
 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
 MYTHOLOGY (prefix: y)
 ==========================================
 01 ID
 02 TYPE
 03 NAME
 04 ALTERNATIVE NAME (MULTIPLE VALUES)
 05 WIKIPEDIA URL
 06 IMAGE (MULTIPLE VALUES)
 07 DESCRIPTION
 FAMILY (prefix: i)
 ==========================================
 01 ID
 02 TYPE
 03 NAME
 04 ALTERNATIVE NAME (MULTIPLE VALUES)
 05 WIKIPEDIA URL
 06 IMAGE
 07 ROLE (MULTIPLE VALUES)
 08 NATIONALITY
 09 DESCRIPTION
 10 MEMBERS (MULTIPLE VALUES)
 GROUP (prefix: r)
 ==========================================
 01 ID
 02 TYPE
 03 NAME
 04 ALTERNATIVE NAME (MULTIPLE VALUES)
 05 WIKIPEDIA URL
 06 IMAGE
 07 ROLE (MULTIPLE VALUES)
 08 NATIONALITY
 09 DESCRIPTION
 10 FORMATION
 11 HEADQUARTERS
 OTHER (prefix: o) -- !!!! zatím jenom větev wikifree !!!
 ==============================================================
 01 ID
 02 TYPE
 03 TITLE
 04 ALIAS (MULTIPLE VALUES)
 05 ID_WIKIPEDIA
 06 WIKIPEDIA URL
 07 DESCRIPTION
 08 ID_FREEBASE
 09 FREEBASE URL
 10 DESC_FREEBASE
 11 W_BACKLINKS
 12 VIEWS
 13 PRIMARY TAG
 14 TYPE (MULTIPLE VALUES)

Umístění souborů nutných k vygenerování KB

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
 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

Specifikace hlavičky HEAD-KB (xdolez52)

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".

Sloupce v HEAD-KB

Mají syntaxi:

<první sloupec> ::= "<" <jméno typu> ">" <ostatní sloupce>
                  | "<" <jméno typu> ":" <jméno podtypu> ">" <ostatní sloupce>

<ostatní sloupce> ::= <název_sloupce>
                    | "{" <flagy> "}" <název_sloupce>
                    | "{[" <prefix_hodnoty> "]}" <název_sloupce>
                    | "{" <flagy> "[" <prefix_hodnoty> "]}" <název_sloupce>

kde:

příklad prvního sloupce v hlavičce: <location>ID
příklad prvního sloupce v datech: l:21931315183
pří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 v Pythonu:

regex = re.compile(u'(?u)^(?:<([^:>]+)(?:[:]([^>]+))?>)?(?:\{((?:\w|[ ])*)(?:\[([^\]]+)\])?\})?((?:\w|[ ])+)$')
regex.search(u"<jméno typu:jméno podtypu>{flagy[prefix_hodnoty]}název_sloupce").groups()
(u'jm\xe9no typu', u'jm\xe9no podtypu', u'flagy', u'prefix_hodnoty', u'n\xe1zev_sloupce')

Program a knihovny pro KB ve sdílené paměti (xdolez52)

Ú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á.

Použití

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". Pokud by to nestačilo, napište mi.

Spuštění daemona

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 ner.py (xmagdo00, iotrusina)

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 v zde.

Skript ner.py využívá ke své činnosti KB, která je nahrána ve sdílené paměti pomocí SharedKB.

Prerekvizity

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.

Skript ner.py

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]
 
 Nepovinné argumenty:
   -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ísmeny.

Je 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

Daemon mode

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

Výstup

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.

Jak funguje ner.py? (xmagdo00)

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

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.

Čiastočné zhody mien

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

Kontextová disambiguácia pridáva kritérium súvislosti 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ú krajiny, 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.

Určovanie významu zámen – coreference resolution

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.

Odstraňovanie prekrývajúcich sa entít

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.

Odstraňovanie entít susediacich so slovom, ktoré začína veľkým písmenom

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).

Výkonnostné charakteristiky (zastaralé)

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 Knowledge Base (iotrusina)

Tvorba dílčích KB

Tvorba dílčích KB PERSONS, ARTISTS, ARTWORKS, LOCATIONS, MUSEUMS, MYTHOLOGY, ARTIST_FAMILIES a ARTIST_GROUP_OR_COLLECTIVE 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). Je 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.

Tvorba KB.all

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.

Tvorba KBstatsMetrics.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). Č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

Tvorba automatů (iotrusina)

Nástroj ner.py ke své činnosti využívá nástroje figa, který pomocí několika konečných automatů dokáže v textu rozpoznávat entity. Popis nástroje figa i konečných automatů je možné najít na stránce projektu Decipher_fsa. V této kapitole je popsána pouze jejich tvorba.

Tvorba automatů pro NER i pro autocomplete je prováděna pomocí skriptů create_fsa.sh a create_fsa_autocomplete.sh. Tyto skripty pracují se souborem KBstatsMetrics.all, z něhož získají seznam jmen, který se následně předloží nástroji fsa_build, který dané automaty vytvoří.

 secapi/NER/figa/make_automat/create_fsa.sh
 
 použití: create_fsa.sh [-h] [-l|-s|-u] --knowledge-base=KBstatsMetrics.all
 
 povinné argumenty:
 
   -k KB, --knowledge-base=KB  cesta ke KBstatsMetrics.all
 
 nepovinné argumenty:
 
   -h, --help                  vypíše nápovědu a skončí
   -l, --lowercase             všechna jména budou převedena na malá písmena
   -s, --spellchecking         vygeneruje alt. jména pro spellcheching
   -u, --uri                   vygeneruje seznam URI

Pomocí skriptu create_fsa.sh jsou vygenerovány následující automaty:

 automata.fsa       - základní automat pro ner.py
 automata-lower.fsa - automat pro lowercase variantu rozpoznávání
 automata-spell.fsa - automat pro spellchecking
 automata-uri.fsa   - automat pro URI

Pomocí skriptu create_fsa_autocomplete.sh jsou vygenerovány následující automaty:

 a_automata.fsa - automat pro autocomplete (typ ARTIST)
 c_automata.fsa - automat pro autocomplete (typ MUSEUM)
 d_automata.fsa - automat pro autocomplete (typ VISUAL ART MEDIUM)
 e_automata.fsa - automat pro autocomplete (typ EVENT)
 f_automata.fsa - automat pro autocomplete (typ VISUAL ART FORM)
 g_automata.fsa - automat pro autocomplete (typ VISUAL ART GENRE)
 i_automata.fsa - automat pro autocomplete (typ FAMILY)
 l_automata.fsa - automat pro autocomplete (typ LOCATION)
 m_automata.fsa - automat pro autocomplete (typ ART PERIOD MOVEMENT)
 n_automata.fsa - automat pro autocomplete (typ NATIONALITY)
 p_automata.fsa - automat pro autocomplete (typ PERSON)
 r_automata.fsa - automat pro autocomplete (typ GROUP)
 w_automata.fsa - automat pro autocomplete (typ ARTWORK)
 y_automata.fsa - automat pro autocomplete (typ MYTHOLOGY)
 x_automata.fsa - automat pro autocomplete (všechny typy dohromady)

Oba tyto skripty jsou spouštěny uvnitř skriptu secapi/NER/start.sh.

Automatizace tvorby Knowledge Base a automatů (iotrusina)

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/.

Matchovanie entít z dvoch rôznych Knowledge Baseov (xondru04, xcerny62)

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

usage: 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            show this help message and exit
 --first FIRST         filename of the first KB (also used as a prefix for
                       config files)
 --second SECOND       filename of the second KB (also used as a prefix for
                       config files)
 --first_fields FIRST_FIELDS
                       filename of the first KB fields list (default
                       '(--first option).fields')
 --second_fields SECOND_FIELDS
                       filename of the second KB fields list (default
                       '(--second option).fields')
 --rel_conf REL_CONF   filename of a relationships config
 --output_conf OUTPUT_CONF
                       filename of an output format
 --other_output_conf OTHER_OUTPUT_CONF
                       filename of an output format
 --first_sep FIRST_SEP
                       first multiple value separator (default '_')
 --second_sep SECOND_SEP
                       second multiple value separator (default '_')
 --id_prefix ID_PREFIX
 --output OUTPUT       filename of an output
 --treshold TRESHOLD
 --second_output FILENAME

Popis parametrů

Příklad spuštění

./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

Příklad konfiguračního souboru dbpedia_geonames_rel.conf:

 UNIQUE: 
 	DBPEDIA.WIKIPEDIA URL=GEONAMES.WIKIPEDIA URL 
 NAME: 
 	DBPEDIA.TITLE NAME=GEONAMES.NAME 
 	DBPEDIA.TITLE NAME=GEONAMES.ALTERNATIVE NAME 
 	DBPEDIA.NAME=GEONAMES.NAME 
 	DBPEDIA.NAME=GEONAMES.ALTERNATIVE NAME 
 	DBPEDIA.ALTERNATIVE NAME=GEONAMES.NAME 
 	DBPEDIA.ALTERNATIVE NAME=GEONAMES.ALTERNATIVE NAME 
 OTHER: 
 	DBPEDIA.COUNTRY=GEONAMES.COUNTRY 
 	DBPEDIA.LATITUDE=GEONAMES.LATITUDE 
 	DBPEDIA.LONGITUDE=GEONAMES.LONGITUDE 
 	DBPEDIA.ELEVATION=GEONAMES.ELEVATION 
 	DBPEDIA.POPULATION=GEONAMES.POPULATION 

Tvorba KB typu Artworks

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)

Ako to funguje?

1. Skript si po zapnutí získa prepínače z príkazovej riadky a otvorí potrebné súbory (trieda Init).

2. Snaží sa spracovať všetky konfiguračné súbory (trieda kb_config.Config).

3. Načíta datové zdroje do internej datovej štruktúry (každý riadok je objekt typu kb_data.Data).

4. Vytvára indexy zo --second - potrebné kvôli redukcii časovej zložitosti matchovania (trieda kb_index.Index).

5. Nastáva samotné matchovanie (kb_match.Match). Matchovanie je jeden veľký cyklus, ktorý vezme riadok z datového zdroja --first a porovnáva ho so všetkými údajmi zo --second na základe relácií definovaných v --rel_conf. Využíva pri tom indexovaný --second datový zdroj.

6. Poslednou úlohou je samotné generovanie KB z interných datových štruktúr (trieda kb_match.Output).

Popis hledání odpovídajících si entit

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.

Případy, kdy se entity nepřiřadí k sobě

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

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.

Skript dates.py pro vytažení dat různých formátů z čistého textu (xdolez52)

Ú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

Třídy

Třída 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)

Vlastnosti

Podporované formáty

Datum

Pouze měsíc a rok:

Pouze rok:

Interval

Problémy a nejasnosti

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'

Statistické údaje

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.

Testování skriptu start.sh (xgraca00)

Ú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

Sady testů

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í

Porovná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

Aktuální výsledky shody ke dni 24. 3. 2015 pro soubory ze secapi/NER/data/input:

Paul_Kane: 56.6037735849%
travelling_artist_part2: 69.0909090909%
travelling_artist_part3: 81.6513761468%
Dossier_and_OS_texts.docx: 56.5020576132%

Rozpoznávanie mien osôb v texte (xklima22)

Úč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 (je potrebné zmeniť branch na NameRecognizer).

Postup

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) do /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

/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.

/mnt/minerva1/nlp/projects/decipher_ner/xklima22/scripts/run.sh

Použitie:

./run.sh [--show-filtered]

Nepovinný parameter --show-filtered spôsobí, že sa odfiltrované mená zapíšu do súboru.

Príklad použitia:

./run.sh < ./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 highlight_names.py

/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:

./highlight_names.py

Príklad použitia:

./run.sh < ./test_data/test.txt > figa.out
./highlight_names.py < ./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.

Obalovací skript

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:

 ./name_recognizer.py

Pomocné nástroje

Name Collector

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:

./main.py

Skript sa automaticky spúšťa pri použití skriptu run.sh v pomocnom nástroji KB List.

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:

./run.sh

KB Locations

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 run.sh:

./run.sh

SWN

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:

./swn.py

Ukážkové výstupy

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/

Sloučení artist a person (xkebis01)

Nový popis typov po zlúčení:

 ARTIST
 ==========================================
 01 ID
 02 TYPE
 03 SUBTYPE
 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 NOTE
 21 ART FORM (MULTIPLE VALUES) 
 22 INFLUENCED (MULTIPLE VALUES)
 23 INFLUENCED BY (MULTIPLE VALUES)
 24 ULAN ID
 25 OTHER URL (MULTIPLE VALUES)
 PERSON
 ==========================================
 01 ID
 02 TYPE
 03 SUBTYPE
 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)

Integrace projektu Ner4 (xhavra13)

Cílem projektu je kompletní nahrazení FSA automatů v projektu FIGA za CEDAR tries (implementované v projektu 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.

NER

Pro projekt Ner se skripty většinou pouze mírně aktualizovaly, aby využívaly/podporovaly novou verzi Figy.

NER/figa/sources/kb_loader_fast.cc
NER/figa/sources/kb_loader_slow.cc
NER/start.sh
NER/uploadKB.sh
NER/deleteKB.sh
NER/ner.py

FIGA

V projektu Figa byly provedeny velké změny. Nejdůležitější je náhrada FSA automatů za CEDAR tries. Byla snaha novou Figu 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é Figy).

Výkonnostní srovnání (FIGA)

Ná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.

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):

Time Využití paměti 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:

Time 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:

Time 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
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
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:

Time 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
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
testing_data.txt 1,67s 2m 26s 2m 340,5 MB 934,8 MB 347,3 MB

Závěr

CEDAR 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.