Используем словарь и метод get (или defaultdict/Counter).
import re
from collections import Counter
def word_freq(text: str) -> dict[str, int]:
# Извлекаем слова, убирая знаки препинания
words = re.findall(r"\w+", text.lower())
freq: dict[str, int] = {}
for word in words:
freq[word] = freq.get(word, 0) + 1
return freq
text = "Кот и пёс. Кот спит, пёс играет. Кот рыжий."
print(word_freq(text))
# {'кот': 3, 'и': 1, 'пёс': 2, 'спит': 1, 'играет': 1, 'рыжий': 1}
re.findall(r"\w+", ...) находит все «словесные» подстроки (буквы/цифры/_), отбрасывая запятые и точки.
Идиоматичнее — через Counter:
freq = Counter(re.findall(r"\w+", text.lower()))
Counter — специализированный словарь для подсчёта.