k47.cz
výběr kolo foto Praha povídky kultura
TECH ▞▞ | twitter RSS
««« »»»

Revitalizace devblogů

30. 6. 2020 — k47

Agre­gá­tor dev­blogy je jeden z úspěš­něj­ších samo-pro­jektů, které vzešly z mojí klá­ves­nice. Je úspěšný pře­de­vším v tom smyslu, že stále ještě fun­guje a ne­mu­sím se o něj nijak starat.

První verze byla PHP apli­kace podle normy na­psaná v Nette + bac­kend, který který ve velkém žong­lo­val s čísly, na­psaný ve Scale. Nejen web-app, ale i po­ly­glot, páni. Za­škr­tá­val jsem všechny ko­lonky, které byly tehdy nutné pro cool faktor. Dneska by to za­hr­nulo docker, AWS, Rust, Go, UI v JS fra­meworku a díky bohu, že se tahle va­rinta ne­vy­pl­nila.

Srdce druhé a sou­časné verze tvoří pár PHP skriptů po­sle­po­va­ných BASHem, žádná da­ta­báze, jen soubor s JSONy, žádná web apli­kace, jen sta­tický web ge­ne­ro­vaný stej­ným pro­gra­mem, který ge­ne­ruje i k47čku. Sou­časná verze je mnohem víc ghetto, ale je ne­ko­nečně lepší, jed­no­dušší a odol­nější. Když se někde stane chyba, web a TW pouze pře­stane být ak­tu­a­li­zo­ván, ale pořád k němu můžete, žádný pro­blém. Jsou to jen sou­bory kdesi na disku, žádná logika.

Já se jen musím čas od času pře­svěd­čit, že po­čí­tač na kterém bac­kend pro­gram běží, fun­guje, ne­od­nesla ho velká voda, ne­vy­buch­nul a s ob­jek­tivní re­a­li­tou ho spo­juje aspoň jeden kabel. Může to být raspberry pi, může to být desktop, může to být cokoli. To je moje jediné po­slání.

Tahle pri­mi­tiv­nost se mi na verzi #2 líbí. Ve své pod­statě jde o tri­vi­ální pro­blém (přečti RSS pár vý­vo­jář­ských blogů, nové přidej do sou­boru, vypiš je na stránku) & po­u­žité řešení při­dává jen mi­ni­mum extra kom­ple­xity.

Přesto, pár dnů zpátky se mi mozkov­nou pro­hnal nápad (asi v tom budou mít prsty ha­lu­ci­nace z horka), že by bylo fajn přidat do­po­ru­čo­vání po­dob­ných článků. Tu funk­ci­o­na­litu měla verze #1 a staral se o ní právě ten nádor na­psaný ve Scale. Proč ji ne­zje­ží­šo­vat? Jen to ne­bu­dou tři dny, ale dva ±roky od ukři­žo­vání.

Ok, zase nic kom­pli­ko­va­ného. Nově při ak­tu­a­li­zaci RSS zdrojů PHP skript z stáhne stránky z blogů a pokusí se z HTML vy­se­kat hlavní text. Sé­man­tické značky uve­dené v HTML5 tento úkol mar­kantně zjed­no­du­šily. Stačí hledat tag <article> s nej­vět­ším množ­stvím textu nebo, když to ne­vy­jde, něco jako xpath výzar //div[count(./p) > 8] a to po­kryje 90% pří­padů. Dost dobré pro účely dev­blogů.

Tex­tový obsah blo­go­článku se pak po­u­žije pro de­tekci po­dob­ností. RSS a ATOM umí ex­por­to­vat tagy, ale ty z 99% ne­stojí za nic. Nedá se na ně spo­leh­nout, často chybí, mnoho blogů vůbec ne­ta­guje, nemají kon­zis­tentní ta­xo­no­mii a cel­kově je to stěží víc než di­gi­tální šum. Tex­tový obsah je gró, vždy pří­to­men, dá se vy­hmát­nout a tau­to­lo­gicky po­pi­suje vlastní téma.

Hle­dání po­dob­ných textů není příliš ra­fi­no­vané. Fun­guje skoro stejně jako tady na k47čce V prvním kole pro­gram snaží iden­ti­fi­ko­vat klí­čová slova po­pi­su­jící téma článku a ve druhém pak hledá články s nej­větší shodou klí­čo­vých slov. Nejde o nic extra, jen lety pro­vě­řené tf-idf na ste­ro­i­dech – častá slova mají malou váhu, vzácná naopak větší. Super-vzácná slova se­říznu, pro­tože jde nej­spíš o pře­klepy. Při zkou­šení jsem na­ra­zil na jeden pro­blém, kte­rému můžeme říkat třeba te­ma­tická in­verze. Pro­tože jde o malý korpus a všechny články jsou tech­nic­kého ražení a točí se kolem ně­ko­lika úzce pro­vá­za­ných témat, tech­nické ter­míny které by jinak per­fektně vy­stihly téma, se vy­sky­tují tak často, že do­sta­nou při­dě­lenu jen malou váhu. Na­proti tomu mnoho běž­ných slov je po­u­žito zřídka a al­go­rit­mus jim při­řadí ano­málně velkou váhu i když nemají žádnou in­for­mační hod­notu. Jde o sta­tis­tické ar­te­fakty a kazí fi­nální vý­sledky. Bylo proto za­po­třebí vzít korpus ne­tech­nic­kého čes­kého textu (pár de­sí­tek knih) a ten použít jako base­line. Pokud se nějaké slovo vy­sky­tuje čas­těji, než by mělo v ne­tech­nic­kých tex­tech, pak jde nej­spíš o od­borný termín a je brán v potaz, jinak je ig­no­ro­ván. To o něco zlepší vý­sledky, ne o moc, jen trochu. Va­ri­anta v první verzi taky nebyla bůh ví jak svě­to­borná.

Když pro­běhle první fáze, začnou se hledat články, které sdí­lejí co nej­více klí­čo­vých slov. Když jich mají tři nebo více, jsou vy­brány jako po­dobné. Všechno se to počítá bez žád­ných extra vy­chy­tá­vek brute-force stylem, O(n2), bez LSH, bez apro­xi­mací. Je tu jen pár tisíc článků a po­čí­tače jsou rychlé. Není kam spě­chat. Trvá to 9 vteřin v jednom vlákně.

Pokud všechno dobře do­padne, zase na dev­blogy nebudu muset rok sáh­nout.

píše k47 & hosté, ascii@k47.cz