Volba programovacího jazyka: Python
Nadační fond nezávislé žurnalistiky (NFNZ) má seznam "konspiračních a dezinformačních serverů". Celkem 22 webů:
Jako zajímavé časové období jsem vybral 1. 6. až 5. 9. 2025.
Z každého článku extrahován titulek, datum, text a tagy.
cloudscraper)Celkově staženo 16046 článků (~125 MB).
Během průzkumů jsem narazil na několik perliček:
http://.../__trashedXYZ)Moje poprvé s LLM/AI. Navíc chudý student využívající free tiery.
Modely gemini-2.5-flash a gemini-3-flash-preview.
Modelu předán titulek, text a tagy článku.
Vstupem je několik extrahovaných článků z webu. Úkol je určit vůči kterým tématů jsou jednotlivé články pozitivní (např. vyzdvihování úspěchů, propagace/podpora dané osoby/věci, ...) a vůči kterým negativní (např. diskreditování, ponižování, označování dané osoby jako lháře / dané věci jako leži, ...). Články budou často emociálně zabarvené, což indikuje prezenci pozitivní/negativní postoje vůči nějakému tématu. U každého článku omez výstup na maximálně 5 nejvýraznějších pozitivních a 5 nejvýraznějších negativních témat. **Je velmi důležité všechny články analyzovat postupně a odděleně - obsah jednoho článku nesmí ovlivnit analýzu jiného!**
Články jsou z doby, kdy v ČR probíhaly kampaně pro volby poslanecké sněmovny, mezi hlavní témata (mimo jiné) patří:
- Politické ČR osoby, např. prezident Petr Pavel, premiér Petr Fiala, Vít Rakušan, Jiří Raichl, Tomio Okamura, Kateřina Konečná, ...
- Politické ČR strany, např. ODS, SPOLU, SPD, STAN, STAČILO!, ...
- Pohledy na geopolitiku, primárně názory např. na Rusko, Čínu, Ameriku, Evropskou Unii, ...
Je nutné dbát na separaci jednotlivých článků. **Každý článek musí být analyzovaný zvlášť!**
Přes Google SDK API předáno modelu i JSON schéma:
class SingleArticleAnalysisOutput(BaseModel):
id: int = Field(description="ID článku; Musí být stejné jako ID článku ve vstupu")
positive: list[str] = Field(description="Seznam témat vyobrazených pozitivně")
negative: list[str] = Field(description="Seznam témat vyobrazených negativně")
relevant: bool = Field(
description="`true` pokud článek míří na volby v ČR, jinak `false`"
)
class AnalysisOutput(BaseModel):
outputs: list[SingleArticleAnalysisOutput] = Field(
description="Výsledek pro každý článek ze vstupu"
)
Problémy:
503 UNAVAILABLE - The model is overloadedProblémy kvůli špatnému promptu:
Další zajímavosti:
"Nekvalitní" (resp. nečistá) data z předchozí fáze. Problémů špatného promptu jsem si všiml až příliš pozdě.
Filtrace jen podle "relevant" flagu.
Provedl jsem normalizace a základní seskupení pomocí kódu, pak následovaly pokusy o seskupení pomocí LLM, které ale nedopadly tak dobře, jak bych chtěl... Nakonec zdlouhavá manuální práce.
Většina webů se nezaměřovala výhradně na otázky voleb/politiky. Výjimku tvoří weby Pravý prostor,
Protiproud a Skrytá pravda.
V počtu relevantních/zajímavých článků jsem nepozoroval žádný výrazný trend, krom počátku léta, kdy byl počet článků větší.
Podobně tak weby nebyly v počtu článků v průběhu času intenzivnější. Výjimku tvoří TOPNews, který s blížícími se volbami kvantitu článků zvyšoval.
Pozitivní
Negativní
Celkově
Skóre jednotlivých vybraných stran/politků
(pozitivní pohled = +1; negativní pohled = -1)

Nejčastější témata spolu:
Ověřil se "přepoklad", že weby budou značně pro-Ruské - jak v obecných tématech, tak i politických tématech ČR.
Z mé analýzy se nejeví, že by weby "silně reagovali na volby" (ovšem analyzoval jsem jen relativně krátké období).
Obecně tak na těchto webech byl silně kritizován Petr Fiala, Evropská unie a (předvolební) vláda obecně. Naopak velice pozitivně bylo vyobrazováno Rusko, Donald Trump a (předvolební) nevládní strany.
Z technického hlediska jsem vytvořil kód pro provedení této analýzy - troufám si tvrdit, že kód lze relativně jednoduše aplikovat na podobné analýzy, ovšem rozhodně se nejedná o "framework", kde by existovala jedna funkce do_analysis().
Za výstup zkoumání také považuji zjištění, že volba LLM modelu může mít drastický efekt na výsledek (viz silná zaujatost Gemma modelu proti Rusku).