===== Žad Deljkić ===== ==== Programski alati za automatsko mapiranje tematskih područja ==== {{:studenti:zad_deljkic:zavrsni.pdf|Tekst rada}} i {{:studenti:zad_deljkic:prezentacija_zr.odp|prezentacija}}. //Software tools for automatic mapping of subject areas// ==== Zadatak ==== U svrhu brzog obuhvaćanja temeljnih informacija za neko tematsko područje, potrebno je predložiti programske alate koji bi automatski prikupljati standardne podatke o tematskom području te grafički prikazivali međuzavisnosti na način prilagođen korisniku za daljnju analizu. Naglasak staviti na programsku dogradnju i korištenje programskih alata u širokoj uporabi, poput internetskih preglednika, i rješenja zasnovana na otvorenom kodu. ---- |[[:studenti:zad_deljkic:zd-zr-dnevnik|Dnevnik rada]] |[[https://github.com/zdeljkic/academic-research|GitHub repozitorij]] | ---- ==== Plan rada ==== - Napisati upute za uspješno prevođenje i pokretanje NetGlub master-a, slave-a i klijenta (GUI) - Napraviti i dokumentirati što veći broj različitih transformacija - Napisati detaljne upute za izradu transformacija - od izrade Python skripte do integriranja u NetGlub sistem - puno o izradi transformacija za netglub se može naučiti iz resursa za Maltego ([[https://www.paterva.com/web6/documentation/developer-local.php|primjer]]) - jer na kraju krajeva Netglub je baš kopija Maltega - Uspješno prevesti i pokrenuti klijent-a na Windows OS-u, napisati upute za to - Isprobati cijeli sistem preko mreže - master i slave(ovi) na Ubuntu OS-u, klijenti na Ubuntu i Windows OS-u - Napisati popis budućih projekata u kontekstu ovog rada - Ubaciti dobivanje ISBN-a u tranformacije s knjigama - trebao bi biti posebni parametar da/ne koji nas pita jel želimo ISBN - zato što dobivanje ISBN-a može biti sporo (otvaranje nove stranice za svaki rezultat) - Slično za fraze, treba napraviti mehanizam (Python modul) koji se bavi validacijom fraza - on će nam reći jel fraza koju smo generirali ima smisla (primjerice da proba naći tu frazu u naslovu/sažetku knjiga i radova) - Onda kada imamo taj mehanizam, treba postojati parametar koji nas pita je li želimo velidaciju fraza prilikom neke od transformacija koja generira fraze - jer je opet validacija relativno spora (otvaranje nove stranice) - Ostalo: - Provjeri je li NetGlub smatra da su dva entiteta sa istim primarnim (npr. naslov knjige), ali različitim sekundarnim atributima (npr. autori, izdavač) jednaki (je li ih "merge-a") saznato - zapisano u poglavlje "Entiteti" niže - PhraseToSimilarPhrasesW - makni rezultate sa "sidebar" i "nav" u nazivu - Transformacija ili mehanizam koji provjerava je li fraza "legitimna" - pokuša naći knjige, članke, i sl. i ako ništa ne nađe onda nije? ---- ==== Upute za NetGlub ==== * Općenito o NetGlub-u, osnovno korištenje NetGlub-a * Prevođenje i pokretanje NetGlub master-a, slave-a i klijenta na Ubuntu 14.04. * Prevođenje i pokretanje NetGlub klijenta na Windows 7 * Izrada NetGlub transformacije i integriranje u cijeli sistem * Pokretanje NetGlub master-a i slave-a za mrežni rad ==== Entiteti ==== * Phrase - default entitet, najčešće ulazni * Book * Article * Conference * Author **Zapisivanje imena autora:** U entitetima Book i Article bi u polju "authors" imena autora trebala biti ovako zapisana: , ; , ; … Prezime bi trebali biti puno prezime, dok ime može biti puno ime, inicijali i slično - ovisi što nam je dostupno kod baze koju pretražujemo. U različitim stranicama/bazma je ime autora različito zapisano. U nekim slučajevima u istoj bazi ime autora može biti zapisano u različitim formatima. Zadatak transformacije koja daje knjigu ili članak kao izlaz da pokuša pročitati i zapisati imena autora u ispravnom formatu. Sam entitet autora ima jedno obavezno polje - prezime. Tako da i ako je na nekim stranicama zapisano puno ime, na nekima samo inicijali, a na nekima primjerice puno prvo ime i inicijali srednjeg imena, autor će se i dalje prepoznati kao isti. Nedostatak toga je rubni slučaj kada postoji više autora sa istim prezimenom u istom području, ali to je prihvatljiva posljedica za dobivenu fleksibilnost. **Isti (spojeni entiteti):** Netglub smatra da su dva entiteta jednaka ako su im svi obavezni atributi (optional=false) jednaki. Službeno ne postoji nikakav "primarni" atribut - no konvencija među default entitetima je da svaki entitet ima atribut nazvan "value" koji je obavezan (uz još ostale obvezne/neobvezne atribute). Tu nastaje dilema - ako je za knjige i članke jedini obvezni atribut naslov, netglub neće moći razlikovati dve knjige s istim naslovom. Zato je potrebno uvesti još neki atribut koji će ih razlikovati. Ja sam stavio da to bude polje autora. U tom slučaju se može dogoditi da netglub smatra da su dvije zapravo iste knjige različite jer imaju različiti tekst u polju autora (npr. "Doe John" i "Doe J"), no u praksi je to manji problem od prvog problema kojeg ovo rješava (različite knjige - isti naslov). Izvor: datoteka qng/src/graph.cpp, funkcija Node::isSimilitarTo ==== Transformacije ==== U sve transformacije bi trebalo implementirati mehanizam da ne "zaspammaju" stranice koje pretražuju - primjerice ako tražimo članke s nekom temom iz samo 2015 godine, mogli bi pretražiti 1000 stranica Google Scholara i naći samo par rezultata. Ukoliko je korisnik zadao da npr. pronađemo 20 takvih rezultata, transformacija ih ne smije beskonačno tražiti već pretražiti razumnu/"pristojnu" količinu. **Gotove transformacije:** * PhraseToSimilarPhrasesW - uzima frazu i nalazi slične fraze pomoću Wikipedije * PhraseToBookLOC - uzima frazu i nalazi relevantne knjige pomoću Library of Congress * PhraseToArticlesGS - uzima frazu i nalazi relevantne članke pomoću Google Scholar-a * PhraseToConferenceCA - uzima frazu i nalazi relevantne konferencije pomoću [[http://www.conferencealerts.com|www.conferencealerts.com]] * PhraseToBookArticleKoha - uzima frazu i stranicu koja koristi Koha sistem kao parametar, vraća relevantne članke i knjige. Primjeri stranica sa Koha sistemom: * [[http://lib.fer.hr/cgi-bin/koha/opac-main.pl|FER Središnja Knjižnica]] * [[https://koha.ffzg.hr/cgi-bin/koha/opac-main.pl|Knjižnica FFZG]] * Book/ArticleToAuthor - transformacija koja će izvući autore iz knjiga/članaka, bila bi korisna kako bi se mogli grafički viditi koko kojih autora se "grupiraju" knjige i članci (tj. tko je potencijalno "bitniji" unutar nekog područja) * PhraseToArticleIEEE - uzima frazu, vraća članak iz IEEE Xplore baze **Buduće transformacije:** * PhraseToBook/Article - različite transformacije koje uzimaju frazu i vraćaju relevantne knjige/članke koristeći sljedeće baze: * Amazon * NSK * Hrčak * Crosbi * Web of Science * Online baze (koristeći proxy?) * ACM Digital Library * PhraseToConference - različite transformacije koje uzimaju frazu i vraćaju relevantne konferencije koristeći sljedeće baze: * [[http://www.ieee.org/conferences_events/index.html|IEEE Conference and Events]] * Transformacije u suprotnom smjeru (autor → knjige/članci → fraze) * Transformacija koja povezuje osobu s FER-a i zavod koristeći [[https://www.fer.unizg.hr/imenik|https://www.fer.unizg.hr/imenik]] * PhraseToSimilarPhrases - transformacija za nalaženje sličnih fraza samo mijenjanjem individualnih riječi u frazi njenim sinonimima + možda mehanizam koji za svaki dobiveni rezultat provjerava jel dobar/zadovoljavajući **Lokalno testiranje transformacija:** Primjer pozivanja transformacije iz ljuske: ./transform phrase value test "" NbResult 5 Gornji primjer poziva transformaciju s ulaznim entitetom tipa "phrase", čiji je atribut "value" jednak "test" i s parametrom "NbResult" jednakim "5" ==== Bugovi/greške kod Netglub-a ==== Netglub za komunikaciju koristi XML-RPC - specifikacija ([[http://xmlrpc.scripting.com/spec.html|link]]) može pomoći kod debuggiranja. === Općenito === * Master nezna reagirati na timeout od mysql baze * ako se nista ne desava neko vrijeme (8 sati po defaultu kod mysql-a) master ce izgubit konekciju i kod sljedeceg pokusaja konekcije od klijenta ce se pojaviti serial not valid * rjesenje za sad je povecati wait_timeout na maksimalnu vrijednost od 1 godine kod mysql-a i restartat master bar 1 godisnje * bolje rješenje - promjena source koda, dvijee opcije: * a) main.cpp: setconnectoptions(mysql_opt_reconnect) ne cini se da radi * b) ntgsessionmanager.cpp: db.isopen() i isactive() navodno ne funkcionira [[https://bugreports.qt.io/browse/qtbug-223|https://bugreports.qt.io/browse/qtbug-223]] * implementirati provjeru jel db ziv na neki drugi nacin? * Kod netglub klijenta, ako se unese URL i konkretno port koji drop-a konekcije (obično firewall), klijent će se "zamrznuti" i vječno čekati odgovor * Što je još gore, ako je bio odabran "Remember settings", svaki put kod paljenja će se isto dogoditi i jedini način za spriječini to je ručno nači gdje su pohranjeni settingsi * Na windowsima su settingsi pohranjeni u registry-u pod HKEY_CURRENT_USER\Software\Diateam\qng (URL i serial) * Na nekim računalima kod netglub klijenta, klijent se nemože spojiti i baca grešku -32300 HTTP request failed * Gledajući kroz source, čini se da klasa QHttp ([[https://github.com/qtproject/qt/blob/716fbaef34386c8b05d7d63894a5bc116ddd1b6c/src/network/access/qhttp.cpp|relevantni source]], funckija QHttpPrivate::_q_slotError) interno koristi QTcpSocket i taj socket se ne uspjeva spojiti i baca neku grešku ([[http://doc.qt.io/qt-4.8/qabstractsocket.html#SocketError-enum|popis mogućih greška]]) * Ne znam još koju točno grešku baca, znam samo po source-u koje ne baca (0, 1, 2 sa popisa) * Transformacija PersonToEmailSE ima par greška: * vraća dobre rezultate za "john smith" ali ne i za "John Smith" → ubaciti pretvaranje u lowercase prije * values = [v.lower() for v in values] nakon values * regex za email u dijeli koji matcha domenu bez top dijela treba biti greedy (pretvorit *? u samo *) * inače će e-mail primjer@pod.domena.com prepoznati kao primjer@pod.domena * kad se dogodi exception ne napravi ništa (pass) i nastavi dalje, expection mogu biti razne greške, u najmanju ruku treba ispisati poruku - ali ne sa write_error jer takvo ispisivanje implicira prekid transformacije === Sigurnost === * Master na istom interfaceu/ip adresi očekuje i slaveove i klijente - to bi trebalo biti moguće odvojiti * npr. slave-ovi samo na 127.0.0.1, a klijenti na 0.0.0.0 * Master nikako ne autorizira slaveove - postoji "kostur" te funkcionalnosti ali nije implementirana * Datoteke u /etc/netglub/ obično svi korisnici mogu čitati - a između ostalog sadrže username i password za bazu podataka, privatne ključeve certifikata… ==== Budući projekti ==== === Općenito === * Alat koji prebacuje datoteku u NetGlub (.ntg) formatu u mind mapu u Freemind formatu (.mm) * .ntg je zippani XML, .mm je čisti XML - jednostavna python skripta bi bila dovoljna * Alat koji potpuno zaobilazi NetGlub i "ručno" korisničko prtraživanje direktno koristi transformacije kako bi od ulazne fraze automatski generirao mapirano područje (možda u obliku mind mape) * Alat bi prvo mogao naći slične fraze pomoću PhraseToSimilarPhrases i filtrirati dobre pomoću nekog mehanizma * Zatim bi našao knjige, članke i slično pomoću već postojećih transformacija * Na kraju bi rezultate nekako lijepo prikazao - možda u obliku Freemind mind mape (.mm) * Izrada alternativnog NetGlub klijenta koji radi unutar internet preglednika * Pokrenuti javno dostupan server koji pokreće Netglub infrastrukturu na koju se ljudi mogu spojiti samo sa klijentom, bez potrebe da sami doma imaju pokrenut master i slave * Možda je za tu svrhu moguće dobiti [[http://www.srce.unizg.hr/vps/|VPS od srca]]? === Nadogradnja Netglub-a === * Izrada dodatnih transformacija (vidi "Buduće transformacije" gore) * Izrada funkcionalnosti lokalnih transformacija u klijentu (već je započeta, postoji kostur) ~~NOTOC~~ \\