k47.cz
mastodon twitter RSS
bandcamp explorer
««« »»»

Revitalizace devblogů

— k47

Agregátor devblogy je jeden z úspěšnějších samo-projektů, které vzešly z mojí klávesnice. Je úspěšný především v tom smyslu, že stále ještě funguje a nemusím se o něj nijak starat.

První verze byla PHP aplikace podle normy napsaná v Nette + backend, který který ve velkém žongloval s čísly, napsaný ve Scale. Nejen web-app, ale i polyglot, páni. Zaškrtával jsem všechny kolonky, které byly tehdy nutné pro cool faktor. Dneska by to zahrnulo docker, AWS, Rust, Go, UI v JS frameworku a díky bohu, že se tahle varinta nevyplnila.

Srdce druhé a současné verze tvoří pár PHP skriptů poslepovaných BASHem, žádná databáze, jen soubor s JSONy, žádná web aplikace, jen statický web generovaný stejným programem, který generuje i k47čku. Současná verze je mnohem víc ghetto, ale je nekonečně lepší, jednodušší a odolnější. Když se někde stane chyba, web a TW pouze přestane být aktualizován, ale pořád k němu můžete, žádný problém. Jsou to jen soubory kdesi na disku, žádná logika.

Já se jen musím čas od času přesvědčit, že počítač na kterém backend program běží, funguje, neodnesla ho velká voda, nevybuchnul a s objektivní realitou ho spojuje 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é poslání.

Tahle primitivnost se mi na verzi #2 líbí. Ve své podstatě jde o triviální problém (přečti RSS pár vývojářských blogů, nové přidej do souboru, vypiš je na stránku) & použité řešení přidává jen minimum extra komplexity.

Přesto, pár dnů zpátky se mi mozkovnou prohnal nápad (asi v tom budou mít prsty halucinace z horka), že by bylo fajn přidat doporučování podobných článků. Tu funkcionalitu měla verze #1 a staral se o ní právě ten nádor napsaný ve Scale. Proč ji nezježíšovat? Jen to nebudou tři dny, ale dva ±roky od ukřižování.

Ok, zase nic komplikovaného. Nově při aktualizaci RSS zdrojů PHP skript z stáhne stránky z blogů a pokusí se z HTML vysekat hlavní text. Sémantické značky uvedené v HTML5 tento úkol markantně zjednodušily. Stačí hledat tag <article> s největším množstvím textu nebo, když to nevyjde, něco jako xpath výzar //div[count(./p) > 8] a to pokryje 90% případů. Dost dobré pro účely devblogů.

Textový obsah blogočlánku se pak použije pro detekci podobností. RSS a ATOM umí exportovat tagy, ale ty z 99% nestojí za nic. Nedá se na ně spolehnout, často chybí, mnoho blogů vůbec netaguje, nemají konzistentní taxonomii a celkově je to stěží víc než digitální šum. Textový obsah je gró, vždy přítomen, dá se vyhmátnout a tautologicky popisuje vlastní téma.

Hledání podobných textů není příliš rafinované. Funguje skoro stejně jako tady na k47čce V prvním kole program snaží identifikovat klíčová slova popisující téma článku a ve druhém pak hledá články s největší shodou klíčových slov. Nejde o nic extra, jen lety prověřené tf-idf na steroidech – častá slova mají malou váhu, vzácná naopak větší. Super-vzácná slova seříznu, protože jde nejspíš o překlepy. Při zkoušení jsem narazil na jeden problém, kterému můžeme říkat třeba tematická inverze. Protože jde o malý korpus a všechny články jsou technického ražení a točí se kolem několika úzce provázaných témat, technické termíny které by jinak perfektně vystihly téma, se vyskytují tak často, že dostanou přidělenu jen malou váhu. Naproti tomu mnoho běžných slov je použito zřídka a algoritmus jim přiřadí anomálně velkou váhu i když nemají žádnou informační hodnotu. Jde o statistické artefakty a kazí finální výsledky. Bylo proto zapotřebí vzít korpus netechnického českého textu (pár desítek knih) a ten použít jako baseline. Pokud se nějaké slovo vyskytuje častěji, než by mělo v netechnických textech, pak jde nejspíš o odborný termín a je brán v potaz, jinak je ignorován. To o něco zlepší výsledky, ne o moc, jen trochu. Varianta v první verzi taky nebyla bůh ví jak světoborná.

Když proběhle první fáze, začnou se hledat články, které sdílejí co nejvíce klíčových slov. Když jich mají tři nebo více, jsou vybrány jako podobné. Všechno se to počítá bez žádných extra vychytávek brute-force stylem, O(n2), bez LSH, bez aproximací. 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 dopadne, zase na devblogy nebudu muset rok sáhnout.

píše k47, ascii@k47.cz