Jak funguje Mazaný Čtvereček.
04.02.2018

O víkendu mezi prvním a druhým kolem nedávné volby prezidenta jsem si jen tak ze zvědavosti četl pár příspěvků na Twitter účtu @PREZIDENTmluvci. Je to vskutku výživný materiál a tak jsem si řekl, že by stálo za to jej nějak „vytěžit“.

Nejprve tedy vysvětlím, co vlastně Mazaný Čtvereček je. Jedná se jednoduchou hříčku, která generuje příspěvky na Twitter s použítím výraziva výše zmíněného mluvčího prezidenta. Věty jsou gramaticky správně, ale často nedávají významový smysl (a tím jsou také někdy zábavné).

Jádrem generování vět je mechanismus, který se nazývá Markovův řetězec. Zjednodušeně řečeno Markovův řetězec popisuje proces, kde možnost přechodu z jednoho stavu do druhého je dána pouze aktuálním stavem systému a pravděpodobností přechodu. Na následujícím (neumělém) schématu je vidět situace, kdy se nacházíme ve stavu A a máme stejnou pravděpodobnost přechodu do stavu B nebo C.

                  1/2
             -> A --- B
                  \
               1/2 \
                    C
            

Pravděpodobnost přechodu z A do B (50%) nebo C (50%)

Naopak pokud budeme mít následující situaci

                   0
             -> A --- B
                  \
               1   \
                    C
            

Pravděpodobnost přechodu z A do B (0%) nebo C (100%)

ze stavu A se vždy dostaneme do stavu C a nikdy do stavu B.

Tolik tedy k základní teorii, pojďme se podívat, jak je to použito v praxi. Vzhledem k tomu, že se jedná o webovou stránku, vše jsem implementoval v Javascriptu. Pro reprezentaci řetězu jsem použil JS objekt, kde jednotlivé stavy jsou klíče a pravděpodobnosti přechodu do dalších stavů jsou uloženy jako pole. Ukažme si to na příkladu, kde je pravděpodobnost přechodu z A do B (50%) nebo C (50%):

                {
                    "A": ["B", "C"]
                }
            

Pokud bychom chtěli dosáhnout pravděpodobnosti přechodu z A do B (66%) nebo C (33%), definovali bychom:

                {
                    "A": ["B", "B", "C"]
                }
            

Snad je tedy základní myšlenka zřejmá. Nyní, pokud vezmeme za stavy jednotlivá slova, můžeme definovat například následující řetěz:

                {
                    "START": ["Mám", "Máme"],
                    "Mám": ["doma", "venku"],
                    "Máme": ["venku"],
                    "doma": ["televizi", "rádio", "počítač"],
                    "venku": ["popelnici", "auto"]
                }
            

a z něj pak snadno :

No a to je vlastně všechno. Nejvíc času zabralo sestavení dostatečně velkého řetězu slov, na což jsem použil CSV soubor se staženými twíty, které bylo potřeba vyčistit a připravit. Poté jsem si napsal krátkou utilitu opět v JS, která data zpracuje a podle četnosti výskytu slov sestaví výsledný řetěz. A ten už pak slouží na stránce se Čtverečkem. Všechny zdrojové kódy jsem dal na Github, pokud máte zájem, použijte dle libosti :).