import re from collections import Counter def count_words(text: str) -> dict[str, int]: # 1.Приводим весь текст до нижнього регістру \\\ Celý text prepíšeme do malých písmen text = text.lower # 2. Шукаємо всі слова: буквено-цифрові символи які можуть мати апостроф у середині (наприклад, don't або 'heslo') # 2. Hľadáme všetky slová: alfanumerické znaky, ktoré môžu obsahovať apostrof uprostred (napríklad don't alebo ‚heslo‘) words = re.findall(r"[a-z0-9áäčďéíľňóôŕšťúýž]+(?:'[a-z0-9áäčďéíľňóôŕšťúýž]+)?", text) # 3. Рахуємо кількість входжень кожного слова /// Spočítame počet výskytov každého slova return dict(Counter(words)) # "[a-z0-9áäčďéíľňóôŕšťúýž] шукає послідовність з однієї або більше букв (усі словацькі символи включно) чи цифр. # hľadá reťazec pozostávajúci z jedného alebo viacerých písmen (vrátane všetkých slovenských znakov) alebo číslic. # (?: необов'язкова група (може зустрічатися 0 або 1 раз). /// nevyhnutná skupina (môže sa vyskytnúť 0 alebo 1-krát). # '[a-z0-9áäčďéíľňóôŕšťúýž]+ — апостроф, за яким обов'язково йдуть букви або цифри. Це гарантує, що апостроф враховується лише всередині скорочення (наприклад, don't), але ігнорується, якщо це одинарна лапка навколо слова (наприклад, 'HESLO'). # '[a-z0-9áäčďéíľňóôŕšťúýž]+ — apostrof, za ktorým musia nasledovať písmená alebo číslice. Tým sa zaručí, že apostrof sa zohľadní iba vnútri skratky (napríklad don't), ale ignoruje sa, ak ide o jednoduché úvodzovky okolo slova (napríklad 'HESLO').