LIBCAS / DL4DH

DL4DH – development of tools for effective utilization and mining of data from digital libraries to reinforce digital humanities research
GNU General Public License v3.0
8 stars 2 forks source link

Diagram komponent + procesy #15

Closed bodnarIQ closed 2 years ago

bodnarIQ commented 3 years ago

Zdravím, zakladám toto issue pre ukážku aktuálneho stavu komponent diagramu spolu s popisom jednotlivých procesov. Diagram som znovu prerobil podľa pripomienok z pondelkového meetingu. Prikladám taktiež stručný popis jednotlivých komponent.

Prikladám aj link na poznámkový blok v aplikácii Evernote, kde by malo byť to isté, čo je popísané nižšie(sekcie Diagram komponent a Popis procesov), ale o niečo lepšie čitateľné, pretože formátovanie dlhších textov v githube nie je najšťastnejšie. V poznámkovom bloku v Evernote som zvýraznil nedoriešené body/dotazy na KNAV, ku ktorým by som poprosil vaše vyjadrenie.

Evernote link

Diagram komponent ![Component Diagram](https://user-images.githubusercontent.com/76157153/112493700-afd26c00-8d82-11eb-9b31-f8415bdda411.png)
Popis procesov

1. Proces obohacovania

- spúšťa **správca** Krameria+ - proces začína volaním rozhrania K+ _publicationId_, kde sa pošle množina _root_id_(PID) publikácií pre obohatenie - pre testovacie účely bude API brať množinu ID, neskôr sa doimplementuje spôsob, ktorý zaručí obohatenie **celého** obsahu Krameria(**nutná podpora zo strany Krameria - vystaví API**) alebo obohatenie väčších celkov - rozhranie môže byť volané napriamo skrze API, alebo cez grafické rozhranie (možnosť vlastného UI pre K+)

Postup:

1. **Scheduler** príjme množinu ID, ktorú pridá do fronty pre spracovanie, zároveň bude jednotlivé requesty z fronty postupne posúvať ďalej komponente **Filler** - fronta by mala slúžiť pre zabránenie zahltenia Krameria+ - _môže dôjsť k zahlteniu? neprebehne celý proces obohatenia pred sprístupnením systému verejnosti?_ 2. **Filler** riadi proces obohacovania, zaisťuje volanie jednotlivých komponent v správnom poradí (**Filler** riadi volanie komponent **Enricher**, **TEI Converter**, **MongoDB**) * V prvom rade sa dotáže na **jadro Krameria** pre plný obsah publikácie - Skontroluje sa, že ide o root_id, t.j. ID objektu s typom **monograph**, **periodical**, **periodcalVolume**, ..., NIE typ **PAGE** - Skontroluje sa, že existuje ALTO - Ak neexistuje, potreba zavolať _recognitionServer_ (stačí upozorniť správcu?) - Získa z API **Krameria** všetkých potomkov danej root publikácie (množinu objektov typu **page**) * Získanú štruktúru (titulok/výtisk + stránky) pošle na obohatenie do komponenty **Enricher** - **Enricher** sa stará o konkrétny proces obohatenia jednotlivých dát volaním externých služieb 1. Najprv sa obohatia dáta na úrovni výtisku - pripojenie metadát z MARC záznamu - pripojenie metadát z NDK balíčkov 2. Následne sa obohatia jednotlivé stránky - Ak neexistuje OCR text, extrahuje sa text z ALTO formátu - Ak existuje OCR text, použije sa ten - Text stránky sa pošle na tokenizáciu/lematizáciu do nástroja **UDPipe**, spracuje sa odpoveď, vytvorí sa pole objektov = tokenov, na ktoré sa naviažu príslušné metadáta - Text stránky sa pošle na NER do nástroja **NameTag**, spracuje sa odpoveď, získané metadáta sa namapujú na tokeny - Metadáta z formátu **ALTO** sa namapujú na pole tokenov 3. Pri prvom obohatení stránky sa zapíše verzia použitých nástrojov 4. Po každom ďalšom obohatení stránky sa skontroluje, či nedošlo k zmene verzii externého nástroja (verzie LINDAT nástrojov sa môžu zmeniť počas obohacovania, čo by mohlo spôsobiť inkonzistencie) 1. Ak áno - chyba, každá stránka výtisku musí byť obohatená rovnakou verziou nástroja 2. Vyhodí sa chyba, proces obohacovania sa musí spustiť znovu nad celou publikáciou 5. Po obohatení poslednej stránky sa uložia paradata (metadata o použitých nástrojoch) do obohateného objektu na úrovni výtisku 6. Obohatené objekty sa vrátia komponente **Filler** 3. Po získaní obohatených objektov sa táto štruktúra pošle do komponenty **TEI Convertor** - **TEI Convertor** vráti obohatené dáta v TEI formáte - Pre objekty na úrovni výtisku vráti TEI Header - Pre objekty na úrovni stránok vráti TEI Body - TEI Convertor vytvorí tei formát obsahujúci kompletní množinu metadát ktorá sa uloží ako atribút(stĺpec) objektu (TEI formát sa pri exporte vo Feederi na základe uživateľského dotazu môže orezávať o nechcené tagy) 4. Po získaní TEI formátu sú dáta plne obohatené a posielajú sa na uloženie do komponenty **MongoDB** - **MongoDB** je síce logickou súčasťou Krameria+, ale v skutočnosti je to plnohodnotná samostatná aplikácia s vlastným rozhraním - Môže byť provozovaný na rovnakom stroji ako K+, ale zároveň môže byť aj na inom servery/skupine serverov alebo v cloude (pre rozloženie zátaže - záťaž na vyťažovanie z DB neovplyvní vyťaženie stroja s K+ zodpovedného za proces obohacovania) - Z tohoto dôvodu je komponenta **MongoDB** znázornená iba polovičným presahom do modulu Kramerius+ 5. Po úspešnom uložení do DB sa upozorní komponenta **Indexer** v module **Feeder BE**, že došlo k úspešnému obohateniu publikácie - **Indexer** následne obohatenú publikáciu zaindexuje do Solru a prípadne upozorní užívateľa/správcu o úspešnom dokončení obohacovania

2. Proces synchronizácie

- spúšťa sa automaticky - **Kramerius** by mal poskytovať rozhranie implementujúce protokol OAI PMH, na ktoré sa Kramerius+ bude dotazovať - Ak sa detekuje zmena v dátach nejakej publikácie, publikácia sa pošle do fronty pre znovuobohatenie (prejde celým procesom obohacovania znovu a výsledok sa nahradí v DB)

3. Proces dotazovania

- spúšťa autentifikovaný vedecký pracovník buď cez grafické rozhranie Feeder FE, alebo priamym pripojením na rozhranie Feedru BE

Postup:

1. **Scheduler** bude slúžiť ako most medzi užívateľskými dotazmi a komponentou pre ich spracovanie - príjme dotazy od užívateľov - pokusí sa vyhodnotiť ich zložitost - podľa zložitosti dotazu ich posunie ďalej na vyhodnotenie, alebo uloží do fronty pre vyhodnotenie neskôr - bude taktiež zodpovedný za spúšťanie odložených dotazov vo fronte 2. **QueryProcessor** bude riadiť proces dotazovania a pripravovať výsledok dotazu pre užívateľov 1. Prijatý dotaz sa pošle na vyhodnotenie do komponenty **Solr** 1. **Solr** bude hlavnou komponentou pre vyhodnocování výsledku dotazu z indexu - Solr je, podobne ako MongoDB, logickou súčasťou **Feeder BE**, ale v skutočnosti je to plnohodnotná samostatná aplikácia s vlastným rozhraním - Môže byť provozovaný na rovnakom servery ako **Feeder BE**, ale kľudne aj na inom servery/skupine serverov pre rozloženie záťaže a urýchlenie vyhodnocovania dotazov - Solr **nie je optimalizovaný pre vracanie veľkého objemu dát**, ale pre vyhľadávanie nad veľkým objemom dát. - To, čo sa do Solru uloží (atribút fieldu stored=true) a to, čo sa do Solru zaindexuje (atribút fieldu indexed=true) nemá na sebe žiadnu závislosť - nie všetko čo je zaindexované musí byť aj uložené - Fieldy(stĺpce) môžu byť: - _indexed=true, stored=true_ - nad obsahom tohto fieldu sa dá vyhľadávať a pri vyhodnocovaní sa field vrátí v odpovedi - _indexed=true, stored=false_ - nad obsahom tohto fieldu sa dá vyhľadávať ale pri vyhodnocovaní sa field nevráti v odpovedi - _indexed=false, stored=true_ - nad obsahom tohto fieldu sa nedá vyhľadávať, ale pri vyhodnocovaní sa field vráti v odpovedi - _indexed=false, stored=false_ - nad obsahom tohto fieldu sa nedá vyhľadávať a pri vyhodnocovaní sa field nevráti v odpovedi, field prakticky nie je súčasťou Solru(využitie pri pokročilom dynamickom mapovaní fieldov) - Z dokumentácie: - _indexed=true|false_ - _True if this field should be "indexed". If (and only if) a field is indexed, then it is searchable, sortable, and facetable._ - _stored=true|false_ - _True if the value of the field should be retrievable during a search, or if you're using highlighting or MoreLikeThis._ - Preto by sme sa do Solru nemali snažiť ukladať čo najviac dát a tým obmedziť prístup do **Krameria+** v snahe optimalizovať rýchlosť dotazovania. - Namiesto toho by sme mali od **Solru** požadovať pri vrátení výsledkov malú sadu dát(ID odpovedajúcich dokumentov) a na základe nich siahať do **MongoDB** pre plné objemy dát. - V snahe znížiť záťaž na systém **Kramerius** by sme mohli uvažovať o ukladaní dát(metadát - napr. autor, vydavateľstvo, rok vydania, čislo stránky, ...) do **Solru**, ktoré by sme mohli často potrebovať, a ktoré nemáme uložené v **Krameriu+**. Tieto objemy dát by neboli také veľké, ako objemy obohatených dát v **Krameria+** 2. Výsledok vyhodnoteného dotazu zo **Solru** sa vráti užívateľovi ako náhľad s minimálnym množstvom informácií - Môže užívateľ(vedecký pracovník) nejakým spôsobom zažiadať správcu **Krameria+** o obohatenie publikácie, ktorá nie je v Krameriu+? Prípadne akým? - napr. ak užívateľ pozná PID z Krameria, môže zistiť, že publikácia nie je obohatená v Krameriu+ dotazom na Feeder typu "vráť mi všetky publikácie, kde ID=1234" a Feeder vráti 0 výsledkov -> užívateľ vie, že publikácia s ID=1234 sa nenachádza v Krameriu+ 3. Užívateľ môže manuálne vyfiltrovať nechcené publikácie a zvyšok pošle naspäť do **Feederu** 4. Komponenta **QueryProcessor** zaistí získanie obsahu na vyžiadanej úrovni (nie stále plný obsah) z **Krameria+** 5. V prípade potreby získať data z **Krameria** sa využije komponenta Joiner pre spojenie dát z Krameria a dát z **Krameria+** do jednotného formátu 6. Komponenta **QueryProcessor** zaistí vrátenie dát užívateľovi v zvolenom formáte (default TEI?) a v zvolenom rozsahu (ktoré fieldy, ktoré tagy a pod.)
Popis jednotlivych komponent

Kramerius+

Scheduler

Scheduler bude vstupná brána do systému Kramerius+, ktorá bude zabraňovať prehlteniu systému. Prichádzajúci request na systém Kramerius+ bude zachytený v komponente Scheduler, ktorý rozhodne, či môže byť obohatenie spustené, alebo bude odložené do fronty požiadaviek pre spustenie neskôr. Správca systému bude volať API, ktoré bude prijímať ID publikácie/množinu ID na obohatenie. Scheduler posunie nezmenený dotaz na rozhranie komponenty Filler

Synchronizer

Synchronizer bude komponenta, ktorá sa bude starať o synchronizáciu systému Kramerius a Kramerius+. Kramerius vystaví API, ktoré bude implementovať OAI PMH protokol, pomocou ktorého bude komponenta Synchronizer upozornená v prípade, že dôjde k zmenám v systéme Kramerius. V takomto prípade sa vyhodnotí ID publikácie, v ktorej došlo k zmene, a spustí sa znovu proces obohacovania pre danú publikáciu

Filler

Filler bude mať na starosti riadenie obohacovacieho procesu, predávanie informácií medzi jednotlivými komponentami a zaistí správne poradie volaných komponent. Filler príjme ID publikácie a dotáže sa na jadro Krameria pre plný obsah publikácie. Túto publikáciu následne pošle na obohatenie komponente Enricher. Po obohatení Enricherom sa výsledný objekt pošle do TEI Convertoru pre prevod do TEI formátu. Získaný TEI formát sa pribalí na obohatený objekt a odošle komponente MongoDB pre uloženie do databázy. Po úspešnom uložení sa upozorní Feeder BE, že pribudla nová obohatená publikácia a je potrebné ju zaindexovať.

Enricher

Enricher bude jadro obohacovacieho procesu. Enricher bude komponenta, ktorá bude priamo volať interné a externé obohacovacie služby a zabezpečovať spracovávanie výsledkov, mapovanie metadát a celkové vytvorenie obohatených objektov.

MongoDB

Do komponenty MongoDB sa bude ukladať obohatený obsah. MongoDB bude samostatná aplikácia, s ktorou bude jadro Krameria+ komunikovať cez vlastné rozhrania. Prístup do MongoDB bude zaručený iba priamo cez Kramerius+ (**_v diagrame momentálne možné z Feederu priamo do MongoDB, bude upravené_**). MongoDB môže byť provozované na inom servery, ako Kramerius+. Pripojenie na MongoDB z Krameria+ bude konfigurovateľné.

TEI Converter

TEI Converter bude zaisťovať prevod obohatených objektov do valídného TEI formátu. Objekty na úrovni strany budú prevedené do formátu TEI reprezentujúce TEI body. Objekty na vyššej úrovni (výtisky, monografie, ročník periodika,...) budú prevedené do formátu TEI reprezentujúce TEI header.

Feeder Backend

Scheduler

Scheduler sa bude snažiť určit výpočetnú zložitosť prichádzajúcich dotazov. V prípade, že bude dotaz príliš zložitý, ho scheduler odloži do fronty pre vykonanie neskôr. V prípade, že sa dotaz vyhodnotí ako nie príliš zložitý, scheduler dotaz posunie ďalej pre vyhodnotenie.

QueryProcessor

QueryProcessor bude hlavná komponenta zabezpečujúca riadenie procesu dotazovania. Pri prijatí dotazu ho scheduler pošle na vyhodnotenie do Solru. Po získaní výsledku ho vrátí užívateľovi pre upresnenie výsledkov. Užívateľ následne vyfiltrované výsledky pošle naspäť komponente QueryProcessor, ktorá zaistí získanie ich plného obsahu na vyžiadanej úrovni a v zvolenom formáte. Ak dostupné údaje v Krameriu+ nebudú dostačujúce, siahne do Solr/Krameria pre ďalšie dáta, ktoré pomocou komponenty Joiner spojí a vráti užívateľovi.

Joiner

Joiner bude zaisťovať spájanie dát z rôznych zdrojov pre rovnaké publikácie do jednotného formátu.

Solr

Solr bude hlavnou komponentou zaisťujúcou vyhodnocovanie dotazu. Indexovať bude nutné všetky fieldy, nad ktorými bude mať uživateľ možnosť vyhľadávať. Ukladať by sa mali ale iba tie, ktoré sú nutné v odpovedi na dotaz v Solru. Väčšie objemy dát by sa mali doťahovať z Krameria+ priamo, Solr by mal slúžiť iba na zúženie množiny publikácií odpovedajúcich danému dotazu.

Indexer

Indexer bude poskytovať rozhranie pre pridanie nových obohatených publikácií do Indexu. Rozhranie tejto komponenty sa bude volať po úspešnom obohatení publikácie v Krameriu+.
hlageek commented 3 years ago

napr. ak užívateľ pozná PID z Krameria, môže zistiť, že publikácia nie je obohatená v Krameriu+ dotazom na Feeder typu "vráť mi všetky publikácie, kde ID=1234" a Feeder vráti 0 výsledkov -> užívateľ vie, že publikácia s ID=1234 sa nenachádza v Krameriu+

Jedna možnost je asi zaindexovat všechna přes OAI-PMH sklizená metadata z Krameria do Solr a držet u nich příznak, zda daná položka již byla obohacena. Uživatel by mohl odeslat žádost o obohacení Adminovi. Protože by ale záznam nebyl prohledávatelný s pomocí obohacených dat, bylo by to poněkud nesystémové a není jasné, jak by se uživatel mohl k neobohaceným položkám smysluplně dostat. Viděl bych to tedy spíš na příležitost pro úpravu Krameria, který by si mohl volat API Feederu a evidovat, které záznamy jsou také v Kramerius+. Žádost o zařazení PID k obohacení by Adminovi chodila z Krameria. Pokud by ze strany Krameria nebyla vůle takové rozšíření implementovat, muselo by se to asi řešit ad hoc. Ale i takové ad hoc řešení je systémovější, protože, jak jsem uvedl výše, nedává moc smysl, aby Feeder/Kramerius+ vedle obohacených dat ještě držel a prohledával metadata neobohacených publikací. Snad jedině kdyby byly jasně odlišeny dvě úrovně prohledávání - jedna, která by fungovala jen jako kopie Krameria, druhá s extenzí na obohacená data. Ale průnik mezi nimi nelze dost dobře udělat.

motyc commented 3 years ago

Jen doplňují pár drobných postřehů:

  1. Je otázka nakolik přímo provázat indexaci pro SOLR s procesem obohacování. Skoro bych řekl, že by měl volání indexace nastavovat admin, ale nemusel by to nutně být spojitý proces. Opět tím snížíme technickou závislost obou komponent a bude to pro admina i přehlednější. Něco jiného je samozřejmě synchronizace existujících záznamů (změn). Je celkově otázka, zda by neměly záznamy na úrovni publikace v K+ mít nějaký příznak, zda mají být zveřejněny pro Feeder (jednoduché boolean pole). Opět by to adminovi dalo větší možnosti. Pokud by bylo pole TRUE, automaticky by se indexovaly.
  2. Co se týče ukládání dat v SOLR, tak bych navrhoval, abychom v něm automaticky ukládali všechny údaje z hlavičky a všechny pojmenované entity, protože ty mají největší potenciál pro další využití v rámci základního interface Feederu, ale zároveň nepůjde ve srovnání s dalšími údaji o tak velká data.
  3. Souhlasím s tím, co píše Radim výše. Základní vyhledávání jsme stejně chtěli mít implementované nadále v Krameriu, který be Feederu měl předat zvolený dotaz. Před tím by asi uživateli měl Kramerius dát najevo, kolik výsledků je obohacených.
  4. Jako důležitý bod vidím ten Scheduler ve Feederu, který bude muset nejen správně řadit požadavky, ale také dát uživateli možnost se rozhodnou, zda chce za daných okolností vůbec dotaz realizovat. Tj. uživatel se zeptá, Scheduler vyhodnotí a buď dotaz rovnou provede, nebo se dotáže, jak dále postupovat (zařadit do fronty a dát odhad času, nebo nerealizovat).
  5. Čistě orientačně - na jaké technologii plánujete budovat frontend Feederu?

Celkově mi však přijde návrh dobrý a myslím, že se dostáváme k cíli.

bodnarIQ commented 3 years ago
  1. Ano, myslel som na to, a riesil by som to konfiguracne + parametrami dotazu. Kramerius+ musí byt mozne vyvyjat nezavisle od existencie Feederu, ale zaroven treba pocitat s tym, ze ten Feeder k nemu môže (a väčšinu času bude) existovať. Cez konfiguračný súbor by sme mohli nastaviť existenciu Feedera k danej inštancii Krameria+ identifikovaním IP na ktorej Feeder beží. V prípade, že Feeder bude existovať, môžeme pri obohacovaní prijať od admina parameter (niečo ako "indexOnFinished" = true/false, default=false), ktorým by mohol indexáciu do Feederu nastavovať.
  2. 👍 Konkretne polia, ktore sa budu do Solru indexovat a ukladat budu presne specifikovane pri Feeder BE a implementovani Solru, toto sa moze pocas vyvoja menit podla poziadaviek na dotazovanie a podla mna nie je nutne(a asi ani mozne) presne specifikovat vsetky fieldy v tejto faze
  3. @hlageek Za nas je momentalne tazke odhadnut, ako dlho realne bude proces obohacovania trvat. Nebol by ale lepsi pristup obohatit vsetko/co najviac publikacii z Krameria a poskytnut verejnosti/vyskumnikom Kramerius+ az po plnom obohateni? Myslim si, ze aj keby to malo trvat tyzden/dva, tak by to bolo lepsie riesenie nez poskytnut prazdny/poloplny Kramerius+ hned pre dotazovanie vyskumnikom a snazit sa riesit este navyse ziadosti od vyskumnikov o prednostne obohatenie konkretnych publikacii.
  4. 👍 Pridám do postupu pri scheduleri bod, ze ak sa dotaz vyhodnoti ako zlozity, vrati sa uzivatelovi nejaky odhad doby trvania + dalsie informacie ohladom dotazu, a moznost vyberu dalsieho postupu
  5. S vyvojom FE osobne nemam skusenosti, v InQoolu ale prevazuje technologia JS + React, takze predpokladam, ze to bude React