Serializátor

2nd Oct 2026

Počítanie slov v titulkoch

Učíte slovenčinu ako cudzí jazyk na strednej škole. Svoj učebný plán ste sa rozhodli založiť na slovenských televíznych seriáloch, ako sú Panelák, Horná Dolná či Oteckovia. Aby ste mohli pripraviť vhodné cvičenia, potrebujete zistiť, ktoré slová sa v titulkoch používajú a ako často sa opakujú.

Vašou úlohou je napísať funkciu word_count(phrase), ktorá spočíta výskyty jednotlivých slov v zadanom texte a výsledok vráti ako slovník.

Ciele

Po vyriešení úlohy by ste mali vedieť:

  • použiť slovník ako počítadlo,
  • pridať do slovníka nový kľúč a aktualizovať jeho hodnotu,
  • získať hodnotu zo slovníka pomocou metódy get(),
  • normalizovať text pomocou metód ako lower(), split(), strip() a replace(),
  • rozlišovať interpunkciu od apostrofu uprostred slova,
  • spracovať text obsahujúci slovenskú diakritiku,
  • použiť triedu collections.Counter na počítanie opakujúcich sa hodnôt,
  • porovnať vlastné riešenie so slovníkom s riešením využívajúcim štandardnú knižnicu.

Čo si preštudovať

Pred riešením si zopakujte najmä tieto témy:

Zadanie

Napíšte funkciu:

word_count(phrase)

Parameter phrase obsahuje celý text titulkov. Funkcia má vrátiť slovník, v ktorom je každé slovo uložené ako kľúč a počet jeho výskytov ako hodnota.

word_count("Ahoj, ahoj!")

# {"ahoj": 2}

Pravidlá spracovania textu

Pri počítaní slov dodržte tieto pravidlá:

  • Veľké a malé písmená sa nerozlišujú. Slová Ahoj, AHOJ a ahoj sa počítajú ako rovnaké slovo.
  • Slová môžu byť oddelené medzerou, tabulátorom, novým riadkom alebo interpunkciou.
  • Apostrof uprostred slova zostáva jeho súčasťou. Napríklad don't, it's a they're sú samostatné slová.
  • Apostrof na začiatku alebo na konci slova sa odstráni.
  • Čísla sa tiež považujú za slová. Napríklad 100 je jedno slovo.
  • Slovenská diakritika sa zachováva. Slovo Panelák sa normalizuje na panelák, nie na panelak.
  • Prázdny text má vytvoriť prázdny slovník.
  • Poradie položiek vo výslednom slovníku nie je dôležité.

Príklady

word_count("Pes, pes a mačka.")

# {"pes": 2, "a": 1, "mačka": 1}
word_count("Jedna,dve;tri!")

# {"jedna": 1, "dve": 1, "tri": 1}
word_count("Don't stop, don't give up.")

# {"don't": 2, "stop": 1, "give": 1, "up": 1}
word_count("100 žiakov a 100 zošitov")

# {"100": 2, "žiakov": 1, "a": 1, "zošitov": 1}

Slovník ako počítadlo

Slovník je vhodný na počítanie slov, pretože ku každému kľúču dokáže priradiť jednu hodnotu. V tejto úlohe bude kľúčom konkrétne slovo a hodnotou počet jeho výskytov.

Na začiatku je slovník prázdny:

counts = {}

Pri spracovaní každého slova musíte zistiť, či sa už v slovníku nachádza. Ak slovo spracúvate prvýkrát, vložíte ho do slovníka s hodnotou 1. Ak sa v slovníku už nachádza, jeho doterajšiu hodnotu zvýšite o 1.

Pri spracovaní textu "red red blue" sa obsah slovníka mení takto:

{}
{"red": 1}
{"red": 2}
{"red": 2, "blue": 1}

Tento postup môžete zapísať pomocou podmienky:

if word in counts:
    counts[word] += 1
else:
    counts[word] = 1

Výraz word in counts zisťuje, či sa dané slovo nachádza medzi kľúčmi slovníka. Zápis counts[word] += 1 potom zvýši jeho súčasnú hodnotu.

Takéto riešenie je názorné a dobre ukazuje obe situácie, ktoré môžu pri počítaní nastať. Je preto vhodné najmä vtedy, keď sa so slovníkmi ešte len oboznamujete.

Použitie metódy get()

Rovnakú operáciu možno zapísať kratšie pomocou metódy get():

counts[word] = counts.get(word, 0) + 1

Metóda get() vyhľadá zadaný kľúč v slovníku. Ak kľúč existuje, vráti jeho hodnotu. Ak neexistuje, vráti predvolenú hodnotu uvedenú v druhom argumente — v tomto prípade 0.

Pri prvom výskyte slova teda výraz funguje takto:

counts.get(word, 0) + 1
# 0 + 1

Pri ďalšom výskyte vráti get() aktuálny počet, ku ktorému sa pripočíta jednotka. Výhodou tohto zápisu je, že nemusíte osobitne kontrolovať, či sa slovo v slovníku už nachádza.

Použitie collections.Counter

Python obsahuje v module collections triedu Counter, ktorá je určená práve na počítanie opakujúcich sa hodnôt. Môžete ju importovať takto:

from collections import Counter

Objekt Counter dostane kolekciu hodnôt, prejde jej prvky a automaticky spočíta, koľkokrát sa každý z nich vyskytuje:

words = ["red", "red", "blue"]
counts = Counter(words)

Výsledok bude obsahovať rovnaké dvojice kľúčov a hodnôt ako bežný slovník:

Counter({"red": 2, "blue": 1})

Counter je špecializovaný druh slovníka. S jeho položkami preto môžete pracovať podobne ako s položkami obyčajného slovníka. Ak zadanie alebo testy vyžadujú presne objekt typu dict, môžete výsledok previesť:

counts = dict(Counter(words))

Použitie Counter výrazne skracuje samotné počítanie, ale nevyrieši celú úlohu. Najskôr stále musíte text správne normalizovať, oddeliť jednotlivé slová, odstrániť neželanú interpunkciu a zachovať apostrofy uprostred slov. Až potom môžete pripravený zoznam slov odovzdať objektu Counter.

Je preto užitočné najskôr vytvoriť vlastné riešenie pomocou obyčajného slovníka. Lepšie tak pochopíte, ako počítanie funguje. Následne môžete riešenie prepísať pomocou Counter a porovnať oba prístupy. Slovník vám umožní vidieť jednotlivé kroky algoritmu, zatiaľ čo Counter rovnakú činnosť vykoná stručnejšie a výstižnejšie.

Ako získať jednotlivé slová

Samotná metóda split() rozdeľuje text iba podľa bielych znakov, napríklad medzier, tabulátorov a nových riadkov. Interpunkciu však neodstráni.

"Hello, hello!".split()

# ["Hello,", "hello!"]

Hodnoty "Hello," a "hello!" by sa bez ďalšej úpravy považovali za dve rozdielne slová. Pred počítaním preto musíte text normalizovať.

Najskôr ho môžete previesť na malé písmená pomocou lower(). Táto metóda pracuje aj so slovenskou diakritikou:

"ŽIAK".lower()

# "žiak"

Interpunkciu, ktorá oddeľuje slová, je potrebné nahradiť medzerou alebo spracovať iným vhodným spôsobom. Potom možno text rozdeliť pomocou split().

Na odstránenie interpunkcie zo začiatku a konca slova môžete použiť strip():

word.strip(".,!:;?'\"")

Parameter metódy strip() predstavuje množinu znakov, ktoré sa majú odstrániť z oboch koncov reťazca. Metóda však neodstraňuje znaky uprostred slova.

Napríklad:

"'ahoj!'".strip(".,!:;?'\"")

# "ahoj"

Pozor, samotné strip() nedokáže rozdeliť text "jedna,dve" na dve slová, pretože čiarka sa nachádza uprostred reťazca. Takúto interpunkciu musíte najskôr nahradiť medzerou alebo použiť iný spôsob rozdelenia textu.

Pri apostrofoch treba postupovať opatrne. Apostrof na okraji slova sa má odstrániť, ale apostrof uprostred kontrakcie musí zostať zachovaný:

"'don't'"

# výsledné slovo: "don't"

Odporúčaný postup

  1. Definujte funkciu word_count(phrase).
  2. Vytvorte prázdny slovník counts.
  3. Preveďte text na malé písmená.
  4. Upravte interpunkciu tak, aby správne oddeľovala slová.
  5. Rozdeľte text na jednotlivé slová.
  6. Odstráňte interpunkciu z okrajov slov a vynechajte prázdne reťazce.
  7. Spočítajte slová pomocou obyčajného slovníka.
  8. Vráťte výsledný slovník.
  9. Ako rozšírenie skúste počítanie prepísať pomocou collections.Counter.

Next Post

Serializátor