# marmel-grammar
Библиотека русской морфологии и транслитерации для Python
## Описание
`marmel-grammar` — это мощная библиотека для работы с русскими именами, включающая транслитерацию, определение рода, склонение по падежам и спряжение глаголов. Библиотека поддерживает автоматическое склонение имен, не входящих в базу данных, и работу с кастомными именами.
## Установка
```bash
pip install marmel-grammar
```
## Быстрый старт
```python
from marmel_grammar import MarmelGrammar
# Создание экземпляра библиотеки
grammar = MarmelGrammar()
# Транслитерация имени
russian_name = grammar.transliterate_to_russian("Mika")
print(russian_name) # Мика
# Определение рода
gender = grammar.detect_gender(russian_name)
print(gender) # female
# Склонение по падежам
print(grammar.decline(russian_name, "gen")) # Мики
```
## Основные возможности
### 1. Транслитерация имен
Библиотека поддерживает транслитерацию с английского на русский язык с использованием интеллектуальных правил и базы специальных имен.
```python
grammar = MarmelGrammar()
# Базовая транслитерация
print(grammar.transliterate_to_russian("Alexander")) # Александр
print(grammar.transliterate_to_russian("Maria")) # Мария
print(grammar.transliterate_to_russian("Mika")) # Мика
# Специальные имена из базы данных
print(grammar.transliterate_to_russian("anna")) # Анна
print(grammar.transliterate_to_russian("john")) # Джон
print(grammar.transliterate_to_russian("gazenvagen")) # Газенваген
# Пакетная транслитерация
names = ["Alexander", "Maria", "John", "Mika"]
result = grammar.batch_transliterate(names)
print(result)
# {'Alexander': 'Александр', 'Maria': 'Мария', 'John': 'Джон', 'Mika': 'Мика'}
```
### 2. Определение рода
Автоматическое определение рода имени на основе базы данных и морфологических правил.
```python
grammar = MarmelGrammar()
# Имена из базы данных
print(grammar.detect_gender("Мария")) # female
print(grammar.detect_gender("Иван")) # male
print(grammar.detect_gender("Саша")) # unisex
# Автоматическое определение по окончаниям
print(grammar.detect_gender("Алина")) # female (окончание -а)
print(grammar.detect_gender("Михаил")) # male (согласная)
print(grammar.detect_gender("Олег")) # male (согласная)
```
### 3. Склонение имен по падежам
Полная поддержка русских падежей с автоматическим склонением неизвестных имен.
```python
grammar = MarmelGrammar()
# Склонение конкретного имени
name = "Мария"
print(grammar.decline(name, "nom")) # Мария (именительный)
print(grammar.decline(name, "gen")) # Марии (родительный)
print(grammar.decline(name, "dat")) # Марии (дательный)
print(grammar.decline(name, "acc")) # Марию (винительный)
print(grammar.decline(name, "prep")) # Марии (предложный)
# Получение всех форм сразу
all_forms = grammar.get_all_forms("Ника")
print(all_forms)
# {'nom': 'Ника', 'gen': 'Ники', 'dat': 'Нике', 'acc': 'Нику', 'prep': 'Нике'}
# Автоматическое склонение неизвестных имен
all_forms = grammar.get_all_forms("Мика")
print(all_forms)
# {'nom': 'Мика', 'gen': 'Мики', 'dat': 'Мике', 'acc': 'Мику', 'prep': 'Мике'}
```
### 4. Спряжение глаголов
Спряжение глаголов по временам и лицам с поддержкой рода подлежащего.
```python
grammar = MarmelGrammar()
# Простое спряжение в прошедшем времени
print(grammar.conjugate("танцевать", "past", "Мария")) # танцевала
print(grammar.conjugate("танцевать", "past", "Иван")) # танцевал
print(grammar.conjugate("пукнуть", "past", "Ноах")) # пукнул
# Спряжение в настоящем времени
print(grammar.conjugate("танцевать", "present", "я")) # танцую
print(grammar.conjugate("танцевать", "present", "ты")) # танцуешь
print(grammar.conjugate("танцевать", "present", "он")) # танцует
# Умное спряжение (для глаголов не в базе)
print(grammar.smart_conjugate("работать", "Мария")) # работала
print(grammar.conjugate_any_verb("изучать", "Иван")) # изучал
```
### 5. Создание предложений
Автоматическое создание грамматически правильных предложений.
```python
grammar = MarmelGrammar()
# Обычные предложения (субъект + глагол + объект в винительном падеже)
sentence = grammar.make_sentence("Иван", "читать", "Анна")
print(sentence) # Иван читал Анну.
sentence = grammar.make_sentence("Мария", "изучать", "Python")
print(sentence) # Мария изучала Python.
# Предложения с предлогом "для" (объект в родительном падеже) (marmel-grammar — не умеет подставлять предлоги, мы совершенствуемся)
sentence = grammar.make_sentence_for("Ноах", "пукнуть", "Мика")
print(sentence) # Ноах пукнул для Мики.
sentence = grammar.make_sentence_for("Александр", "работать", "Мария")
print(sentence) # Александр работал для Марии.
```
### 6. Обработка кастомных имен
Библиотека корректно обрабатывает имена с нестандартными символами.
```python
grammar = MarmelGrammar()
# Имена с нестандартными символами остаются без изменений
custom_name = "ᴇɢʟᴀɴᴛɪɴᴀ"
processed = grammar.clean_name(custom_name)
print(processed) # ᴇɢʟᴀɴᴛɪɴᴀ
# Обычная очистка сохраняет пробелы только в начале/конце
name_with_spaces = " Мария Ивановна "
cleaned = grammar.clean_name(name_with_spaces)
print(f"'{cleaned}'") # 'Мария ивановна'
```
### 7. Добавление новых имен
Расширение базы данных собственными именами.
```python
grammar = MarmelGrammar()
# Добавление нового имени с полными падежными формами
new_name_cases = {
"nom": "Артур",
"gen": "Артура",
"dat": "Артуру",
"acc": "Артура",
"prep": "Артуре"
}
grammar.add_name("Артур", "male", new_name_cases)
# Теперь можно использовать новое имя
print(grammar.decline("Артур", "gen")) # Артура
print(grammar.detect_gender("Артур")) # male
```
## Справочник методов
### Основные методы
| Метод | Описание | Параметры | Возвращает |
|-------|----------|-----------|------------|
| `transliterate_to_russian(text)` | Транслитерация с английского на русский | `text: str` | `str` |
| `detect_gender(name)` | Определение рода имени | `name: str` | `str` ('male'/'female'/'unisex') |
| `decline(name, case, gender=None)` | Склонение имени по падежу | `name: str, case: str, gender: str` | `str` |
| `get_all_forms(name)` | Получение всех падежных форм | `name: str` | `Dict[str, str]` |
| `conjugate(verb, tense, subject)` | Спряжение глагола | `verb: str, tense: str, subject: str` | `str` |
| `make_sentence(subj, verb, obj, tense='past')` | Создание предложения | `subj: str, verb: str, obj: str, tense: str` | `str` |
| `make_sentence_for(subj, verb, obj, tense='past')` | Предложение с "для" | `subj: str, verb: str, obj: str, tense: str` | `str` |
| `clean_name(name)` | Очистка имени | `name: str` | `str` |
| `add_name(name, gender, cases)` | Добавление нового имени | `name: str, gender: str, cases: Dict` | `None` |
### Дополнительные методы
| Метод | Описание | Параметры | Возвращает |
|-------|----------|-----------|------------|
| `batch_transliterate(names)` | Пакетная транслитерация | `names: List[str]` | `Dict[str, str]` |
| `smart_conjugate(verb, subject, tense='past')` | Умное спряжение | `verb: str, subject: str, tense: str` | `str` |
| `conjugate_any_verb(verb, subject, tense='past')` | Спряжение любого глагола | `verb: str, subject: str, tense: str` | `str` |
## Поддерживаемые падежи
| Падеж | Код | Вопросы | Пример |
|-------|-----|---------|--------|
| Именительный | `nom` | кто? что? | Мария |
| Родительный | `gen` | кого? чего? | Марии |
| Дательный | `dat` | кому? чему? | Марии |
| Винительный | `acc` | кого? что? | Марию |
| Предложный | `prep` | о ком? о чем? | Марии |
## Поддерживаемые роды
| Род | Код | Описание | Примеры |
|-----|-----|----------|---------|
| Мужской | `male` | Мужские имена | Иван, Александр, Игорь |
| Женский | `female` | Женские имена | Мария, Анна, Ольга |
| Универсальный | `unisex` | Имена любого рода | Саша, Женя, Валя |
## Поддерживаемые времена глаголов
| Время | Код | Описание | Пример |
|-------|-----|----------|--------|
| Прошедшее | `past` | Действие в прошлом | танцевал, читала |
| Настоящее | `present` | Действие в настоящем | танцую, читает |
## Полный пример использования
```python
from marmel_grammar import MarmelGrammar
def demo():
# Создаем экземпляр библиотеки
grammar = MarmelGrammar()
# Тест транслитерации
print("=== Транслитерация ===")
english_names = ["Mika", "Alexander", "Anna", "John"]
for name in english_names:
russian_name = grammar.transliterate_to_russian(name)
print(f"{name} → {russian_name}")
# Тест определения рода и склонения
print("\n=== Склонение имен ===")
test_names = ["Мика", "Александр", "Анна"]
for name in test_names:
gender = grammar.detect_gender(name)
print(f"\nИмя: {name} (род: {gender})")
forms = grammar.get_all_forms(name)
for case, form in forms.items():
print(f" {case}: {form}")
# Тест спряжения глаголов
print("\n=== Спряжение глаголов ===")
verbs = ["танцевать", "читать", "работать"]
subjects = ["Мария", "Иван", "Саша"]
for verb in verbs:
for subject in subjects:
conjugated = grammar.conjugate(verb, "past", subject)
print(f"{subject} {conjugated}")
# Тест создания предложений
print("\n=== Создание предложений ===")
sentences = [
("Иван", "читать", "Анна"),
("Мария", "изучать", "Python"),
("Саша", "готовить", "обед")
]
for subj, verb, obj in sentences:
sentence1 = grammar.make_sentence(subj, verb, obj)
sentence2 = grammar.make_sentence_for(subj, verb, obj)
print(f"Обычное: {sentence1}")
print(f"С 'для': {sentence2}")
print()
if __name__ == "__main__":
demo()
```
## База данных
Библиотека включает мелкую базу данных + автоматически обрабатывает:
- **Имена**: более 50 популярных русских имен с полными падежными формами
- **Глаголы**: 20+ глаголов с формами прошедшего и настоящего времени
- **Специальные имена**: англо-русские соответствия для популярных имен
- **Транслитерация**: полная карта транслитерации английских букв и сочетаний
## Особенности
### Автоматическое склонение
Для имен, отсутствующих в базе данных, библиотека применяет морфологические правила русского языка.
### Обработка кастомных имен
Имена с нестандартными символами (например, стилизованными Unicode-символами) сохраняются без изменений.
### Умное спряжение
Глаголы автоматически спрягаются даже если отсутствуют в базе данных, используя стандартные правила русского языка.
### Сохранение пробелов
При очистке имен пробелы удаляются только в начале и в конце строки, сохраняя внутренние пробелы для составных имен.
## Версия и автор
**Версия**: 0.1.8b3
**Автор**: Dev-Marmel
**Email**: marmelgpt@gmail.com
**Telegram**: [@dev_marmel](https://t.me/dev_marmel)
## Changelog
### 0.1.8b3
- Исправлена проблема со склонением в винительном/родительном падеже
- Удалена функция обратной транслитерации
- Улучшена обработка кастомных имен
- Обновлены правила очистки имен
- Расширена база данных глаголов
Raw data
{
"_id": null,
"home_page": "https://t.me/dev_marmel",
"name": "marmel-grammar",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "russian, morphology, declension, grammar, transliteration, names, verbs, linguistic",
"author": "Dev-Marmel",
"author_email": "marmelgpt@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/af/c5/04ed204d7c394ce53b0c619676dc391020fa626a2dc42f1c90ce7738a9d1/marmel_grammar-0.1.9.tar.gz",
"platform": null,
"description": "\n# marmel-grammar\n\n\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u0439 \u043c\u043e\u0440\u0444\u043e\u043b\u043e\u0433\u0438\u0438 \u0438 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f Python\n\n## \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\n\n`marmel-grammar` \u2014 \u044d\u0442\u043e \u043c\u043e\u0449\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0440\u0443\u0441\u0441\u043a\u0438\u043c\u0438 \u0438\u043c\u0435\u043d\u0430\u043c\u0438, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0430\u044f \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u043e\u0434\u0430, \u0441\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u043f\u043e \u043f\u0430\u0434\u0435\u0436\u0430\u043c \u0438 \u0441\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435 \u0433\u043b\u0430\u0433\u043e\u043b\u043e\u0432. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d, \u043d\u0435 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0432 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u043c\u0438 \u0438\u043c\u0435\u043d\u0430\u043c\u0438.\n\n## \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\n\n```bash\npip install marmel-grammar\n```\n\n## \u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442\n\n```python\nfrom marmel_grammar import MarmelGrammar\n\n# \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438\ngrammar = MarmelGrammar()\n\n# \u0422\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u043c\u0435\u043d\u0438\nrussian_name = grammar.transliterate_to_russian(\"Mika\")\nprint(russian_name) # \u041c\u0438\u043a\u0430\n\n# \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u043e\u0434\u0430\ngender = grammar.detect_gender(russian_name)\nprint(gender) # female\n\n# \u0421\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u043f\u043e \u043f\u0430\u0434\u0435\u0436\u0430\u043c\nprint(grammar.decline(russian_name, \"gen\")) # \u041c\u0438\u043a\u0438\n```\n\n## \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438\n\n### 1. \u0422\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u043c\u0435\u043d\n\n\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e \u0441 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u0433\u043e \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0430\u0432\u0438\u043b \u0438 \u0431\u0430\u0437\u044b \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u043c\u0435\u043d.\n\n```python\ngrammar = MarmelGrammar()\n\n# \u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f\nprint(grammar.transliterate_to_russian(\"Alexander\")) # \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\nprint(grammar.transliterate_to_russian(\"Maria\")) # \u041c\u0430\u0440\u0438\u044f\nprint(grammar.transliterate_to_russian(\"Mika\")) # \u041c\u0438\u043a\u0430\n\n# \u0421\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430 \u0438\u0437 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\nprint(grammar.transliterate_to_russian(\"anna\")) # \u0410\u043d\u043d\u0430\nprint(grammar.transliterate_to_russian(\"john\")) # \u0414\u0436\u043e\u043d\nprint(grammar.transliterate_to_russian(\"gazenvagen\")) # \u0413\u0430\u0437\u0435\u043d\u0432\u0430\u0433\u0435\u043d\n\n# \u041f\u0430\u043a\u0435\u0442\u043d\u0430\u044f \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f\nnames = [\"Alexander\", \"Maria\", \"John\", \"Mika\"]\nresult = grammar.batch_transliterate(names)\nprint(result)\n# {'Alexander': '\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440', 'Maria': '\u041c\u0430\u0440\u0438\u044f', 'John': '\u0414\u0436\u043e\u043d', 'Mika': '\u041c\u0438\u043a\u0430'}\n```\n\n### 2. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u043e\u0434\u0430\n\n\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u043e\u0434\u0430 \u0438\u043c\u0435\u043d\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043c\u043e\u0440\u0444\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u0430\u0432\u0438\u043b.\n\n```python\ngrammar = MarmelGrammar()\n\n# \u0418\u043c\u0435\u043d\u0430 \u0438\u0437 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\nprint(grammar.detect_gender(\"\u041c\u0430\u0440\u0438\u044f\")) # female\nprint(grammar.detect_gender(\"\u0418\u0432\u0430\u043d\")) # male\nprint(grammar.detect_gender(\"\u0421\u0430\u0448\u0430\")) # unisex\n\n# \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f\u043c\nprint(grammar.detect_gender(\"\u0410\u043b\u0438\u043d\u0430\")) # female (\u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0435 -\u0430)\nprint(grammar.detect_gender(\"\u041c\u0438\u0445\u0430\u0438\u043b\")) # male (\u0441\u043e\u0433\u043b\u0430\u0441\u043d\u0430\u044f)\nprint(grammar.detect_gender(\"\u041e\u043b\u0435\u0433\")) # male (\u0441\u043e\u0433\u043b\u0430\u0441\u043d\u0430\u044f)\n```\n\n### 3. \u0421\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d \u043f\u043e \u043f\u0430\u0434\u0435\u0436\u0430\u043c\n\n\u041f\u043e\u043b\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0445 \u043f\u0430\u0434\u0435\u0436\u0435\u0439 \u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435\u043c \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0438\u043c\u0435\u043d.\n\n```python\ngrammar = MarmelGrammar()\n\n# \u0421\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0438\u043c\u0435\u043d\u0438\nname = \"\u041c\u0430\u0440\u0438\u044f\"\nprint(grammar.decline(name, \"nom\")) # \u041c\u0430\u0440\u0438\u044f (\u0438\u043c\u0435\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439)\nprint(grammar.decline(name, \"gen\")) # \u041c\u0430\u0440\u0438\u0438 (\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439)\nprint(grammar.decline(name, \"dat\")) # \u041c\u0430\u0440\u0438\u0438 (\u0434\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439)\nprint(grammar.decline(name, \"acc\")) # \u041c\u0430\u0440\u0438\u044e (\u0432\u0438\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439)\nprint(grammar.decline(name, \"prep\")) # \u041c\u0430\u0440\u0438\u0438 (\u043f\u0440\u0435\u0434\u043b\u043e\u0436\u043d\u044b\u0439)\n\n# \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0444\u043e\u0440\u043c \u0441\u0440\u0430\u0437\u0443\nall_forms = grammar.get_all_forms(\"\u041d\u0438\u043a\u0430\")\nprint(all_forms)\n# {'nom': '\u041d\u0438\u043a\u0430', 'gen': '\u041d\u0438\u043a\u0438', 'dat': '\u041d\u0438\u043a\u0435', 'acc': '\u041d\u0438\u043a\u0443', 'prep': '\u041d\u0438\u043a\u0435'}\n\n# \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0438\u043c\u0435\u043d\nall_forms = grammar.get_all_forms(\"\u041c\u0438\u043a\u0430\")\nprint(all_forms)\n# {'nom': '\u041c\u0438\u043a\u0430', 'gen': '\u041c\u0438\u043a\u0438', 'dat': '\u041c\u0438\u043a\u0435', 'acc': '\u041c\u0438\u043a\u0443', 'prep': '\u041c\u0438\u043a\u0435'}\n```\n\n### 4. \u0421\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435 \u0433\u043b\u0430\u0433\u043e\u043b\u043e\u0432\n\n\u0421\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435 \u0433\u043b\u0430\u0433\u043e\u043b\u043e\u0432 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0430\u043c \u0438 \u043b\u0438\u0446\u0430\u043c \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0440\u043e\u0434\u0430 \u043f\u043e\u0434\u043b\u0435\u0436\u0430\u0449\u0435\u0433\u043e.\n\n```python\ngrammar = MarmelGrammar()\n\n# \u041f\u0440\u043e\u0441\u0442\u043e\u0435 \u0441\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435 \u0432 \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438\nprint(grammar.conjugate(\"\u0442\u0430\u043d\u0446\u0435\u0432\u0430\u0442\u044c\", \"past\", \"\u041c\u0430\u0440\u0438\u044f\")) # \u0442\u0430\u043d\u0446\u0435\u0432\u0430\u043b\u0430\nprint(grammar.conjugate(\"\u0442\u0430\u043d\u0446\u0435\u0432\u0430\u0442\u044c\", \"past\", \"\u0418\u0432\u0430\u043d\")) # \u0442\u0430\u043d\u0446\u0435\u0432\u0430\u043b\nprint(grammar.conjugate(\"\u043f\u0443\u043a\u043d\u0443\u0442\u044c\", \"past\", \"\u041d\u043e\u0430\u0445\")) # \u043f\u0443\u043a\u043d\u0443\u043b\n\n# \u0421\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435 \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438\nprint(grammar.conjugate(\"\u0442\u0430\u043d\u0446\u0435\u0432\u0430\u0442\u044c\", \"present\", \"\u044f\")) # \u0442\u0430\u043d\u0446\u0443\u044e\nprint(grammar.conjugate(\"\u0442\u0430\u043d\u0446\u0435\u0432\u0430\u0442\u044c\", \"present\", \"\u0442\u044b\")) # \u0442\u0430\u043d\u0446\u0443\u0435\u0448\u044c\nprint(grammar.conjugate(\"\u0442\u0430\u043d\u0446\u0435\u0432\u0430\u0442\u044c\", \"present\", \"\u043e\u043d\")) # \u0442\u0430\u043d\u0446\u0443\u0435\u0442\n\n# \u0423\u043c\u043d\u043e\u0435 \u0441\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435 (\u0434\u043b\u044f \u0433\u043b\u0430\u0433\u043e\u043b\u043e\u0432 \u043d\u0435 \u0432 \u0431\u0430\u0437\u0435)\nprint(grammar.smart_conjugate(\"\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c\", \"\u041c\u0430\u0440\u0438\u044f\")) # \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430\nprint(grammar.conjugate_any_verb(\"\u0438\u0437\u0443\u0447\u0430\u0442\u044c\", \"\u0418\u0432\u0430\u043d\")) # \u0438\u0437\u0443\u0447\u0430\u043b\n```\n\n### 5. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439\n\n\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439.\n\n```python\ngrammar = MarmelGrammar()\n\n# \u041e\u0431\u044b\u0447\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u0441\u0443\u0431\u044a\u0435\u043a\u0442 + \u0433\u043b\u0430\u0433\u043e\u043b + \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u0432\u0438\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0430\u0434\u0435\u0436\u0435)\nsentence = grammar.make_sentence(\"\u0418\u0432\u0430\u043d\", \"\u0447\u0438\u0442\u0430\u0442\u044c\", \"\u0410\u043d\u043d\u0430\")\nprint(sentence) # \u0418\u0432\u0430\u043d \u0447\u0438\u0442\u0430\u043b \u0410\u043d\u043d\u0443.\n\nsentence = grammar.make_sentence(\"\u041c\u0430\u0440\u0438\u044f\", \"\u0438\u0437\u0443\u0447\u0430\u0442\u044c\", \"Python\")\nprint(sentence) # \u041c\u0430\u0440\u0438\u044f \u0438\u0437\u0443\u0447\u0430\u043b\u0430 Python.\n\n# \u041f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u043f\u0440\u0435\u0434\u043b\u043e\u0433\u043e\u043c \"\u0434\u043b\u044f\" (\u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0430\u0434\u0435\u0436\u0435) (marmel-grammar \u2014 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043b\u043e\u0433\u0438, \u043c\u044b \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u0443\u0435\u043c\u0441\u044f)\nsentence = grammar.make_sentence_for(\"\u041d\u043e\u0430\u0445\", \"\u043f\u0443\u043a\u043d\u0443\u0442\u044c\", \"\u041c\u0438\u043a\u0430\")\nprint(sentence) # \u041d\u043e\u0430\u0445 \u043f\u0443\u043a\u043d\u0443\u043b \u0434\u043b\u044f \u041c\u0438\u043a\u0438.\n\nsentence = grammar.make_sentence_for(\"\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\", \"\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c\", \"\u041c\u0430\u0440\u0438\u044f\")\nprint(sentence) # \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0434\u043b\u044f \u041c\u0430\u0440\u0438\u0438.\n```\n\n### 6. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0445 \u0438\u043c\u0435\u043d\n\n\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0438\u043c\u0435\u043d\u0430 \u0441 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438.\n\n```python\ngrammar = MarmelGrammar()\n\n# \u0418\u043c\u0435\u043d\u0430 \u0441 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439\ncustom_name = \"\u1d07\u0262\u029f\u1d00\u0274\u1d1b\u026a\u0274\u1d00\"\nprocessed = grammar.clean_name(custom_name)\nprint(processed) # \u1d07\u0262\u029f\u1d00\u0274\u1d1b\u026a\u0274\u1d00\n\n# \u041e\u0431\u044b\u0447\u043d\u0430\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u0431\u0435\u043b\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043d\u0430\u0447\u0430\u043b\u0435/\u043a\u043e\u043d\u0446\u0435\nname_with_spaces = \" \u041c\u0430\u0440\u0438\u044f \u0418\u0432\u0430\u043d\u043e\u0432\u043d\u0430 \"\ncleaned = grammar.clean_name(name_with_spaces)\nprint(f\"'{cleaned}'\") # '\u041c\u0430\u0440\u0438\u044f \u0438\u0432\u0430\u043d\u043e\u0432\u043d\u0430'\n```\n\n### 7. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0438\u043c\u0435\u043d\n\n\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0438\u043c\u0435\u043d\u0430\u043c\u0438.\n\n```python\ngrammar = MarmelGrammar()\n\n# \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0438\u043c\u0435\u043d\u0438 \u0441 \u043f\u043e\u043b\u043d\u044b\u043c\u0438 \u043f\u0430\u0434\u0435\u0436\u043d\u044b\u043c\u0438 \u0444\u043e\u0440\u043c\u0430\u043c\u0438\nnew_name_cases = {\n \"nom\": \"\u0410\u0440\u0442\u0443\u0440\",\n \"gen\": \"\u0410\u0440\u0442\u0443\u0440\u0430\", \n \"dat\": \"\u0410\u0440\u0442\u0443\u0440\u0443\",\n \"acc\": \"\u0410\u0440\u0442\u0443\u0440\u0430\",\n \"prep\": \"\u0410\u0440\u0442\u0443\u0440\u0435\"\n}\n\ngrammar.add_name(\"\u0410\u0440\u0442\u0443\u0440\", \"male\", new_name_cases)\n\n# \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u0438\u043c\u044f\nprint(grammar.decline(\"\u0410\u0440\u0442\u0443\u0440\", \"gen\")) # \u0410\u0440\u0442\u0443\u0440\u0430\nprint(grammar.detect_gender(\"\u0410\u0440\u0442\u0443\u0440\")) # male\n```\n\n## \u0421\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a \u043c\u0435\u0442\u043e\u0434\u043e\u0432\n\n### \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b\n\n| \u041c\u0435\u0442\u043e\u0434 | \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 | \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b | \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 |\n|-------|----------|-----------|------------|\n| `transliterate_to_russian(text)` | \u0422\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u0441 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u0433\u043e \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 | `text: str` | `str` |\n| `detect_gender(name)` | \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u043e\u0434\u0430 \u0438\u043c\u0435\u043d\u0438 | `name: str` | `str` ('male'/'female'/'unisex') |\n| `decline(name, case, gender=None)` | \u0421\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u0438 \u043f\u043e \u043f\u0430\u0434\u0435\u0436\u0443 | `name: str, case: str, gender: str` | `str` |\n| `get_all_forms(name)` | \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043f\u0430\u0434\u0435\u0436\u043d\u044b\u0445 \u0444\u043e\u0440\u043c | `name: str` | `Dict[str, str]` |\n| `conjugate(verb, tense, subject)` | \u0421\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435 \u0433\u043b\u0430\u0433\u043e\u043b\u0430 | `verb: str, tense: str, subject: str` | `str` |\n| `make_sentence(subj, verb, obj, tense='past')` | \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f | `subj: str, verb: str, obj: str, tense: str` | `str` |\n| `make_sentence_for(subj, verb, obj, tense='past')` | \u041f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \"\u0434\u043b\u044f\" | `subj: str, verb: str, obj: str, tense: str` | `str` |\n| `clean_name(name)` | \u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u0438\u043c\u0435\u043d\u0438 | `name: str` | `str` |\n| `add_name(name, gender, cases)` | \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0438\u043c\u0435\u043d\u0438 | `name: str, gender: str, cases: Dict` | `None` |\n\n### \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b\n\n| \u041c\u0435\u0442\u043e\u0434 | \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 | \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b | \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 |\n|-------|----------|-----------|------------|\n| `batch_transliterate(names)` | \u041f\u0430\u043a\u0435\u0442\u043d\u0430\u044f \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f | `names: List[str]` | `Dict[str, str]` |\n| `smart_conjugate(verb, subject, tense='past')` | \u0423\u043c\u043d\u043e\u0435 \u0441\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435 | `verb: str, subject: str, tense: str` | `str` |\n| `conjugate_any_verb(verb, subject, tense='past')` | \u0421\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435 \u043b\u044e\u0431\u043e\u0433\u043e \u0433\u043b\u0430\u0433\u043e\u043b\u0430 | `verb: str, subject: str, tense: str` | `str` |\n\n## \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u0430\u0434\u0435\u0436\u0438\n\n| \u041f\u0430\u0434\u0435\u0436 | \u041a\u043e\u0434 | \u0412\u043e\u043f\u0440\u043e\u0441\u044b | \u041f\u0440\u0438\u043c\u0435\u0440 |\n|-------|-----|---------|--------|\n| \u0418\u043c\u0435\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 | `nom` | \u043a\u0442\u043e? \u0447\u0442\u043e? | \u041c\u0430\u0440\u0438\u044f |\n| \u0420\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 | `gen` | \u043a\u043e\u0433\u043e? \u0447\u0435\u0433\u043e? | \u041c\u0430\u0440\u0438\u0438 |\n| \u0414\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 | `dat` | \u043a\u043e\u043c\u0443? \u0447\u0435\u043c\u0443? | \u041c\u0430\u0440\u0438\u0438 |\n| \u0412\u0438\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 | `acc` | \u043a\u043e\u0433\u043e? \u0447\u0442\u043e? | \u041c\u0430\u0440\u0438\u044e |\n| \u041f\u0440\u0435\u0434\u043b\u043e\u0436\u043d\u044b\u0439 | `prep` | \u043e \u043a\u043e\u043c? \u043e \u0447\u0435\u043c? | \u041c\u0430\u0440\u0438\u0438 |\n\n## \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0440\u043e\u0434\u044b\n\n| \u0420\u043e\u0434 | \u041a\u043e\u0434 | \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 | \u041f\u0440\u0438\u043c\u0435\u0440\u044b |\n|-----|-----|----------|---------|\n| \u041c\u0443\u0436\u0441\u043a\u043e\u0439 | `male` | \u041c\u0443\u0436\u0441\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u0430 | \u0418\u0432\u0430\u043d, \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440, \u0418\u0433\u043e\u0440\u044c |\n| \u0416\u0435\u043d\u0441\u043a\u0438\u0439 | `female` | \u0416\u0435\u043d\u0441\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u0430 | \u041c\u0430\u0440\u0438\u044f, \u0410\u043d\u043d\u0430, \u041e\u043b\u044c\u0433\u0430 |\n| \u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 | `unisex` | \u0418\u043c\u0435\u043d\u0430 \u043b\u044e\u0431\u043e\u0433\u043e \u0440\u043e\u0434\u0430 | \u0421\u0430\u0448\u0430, \u0416\u0435\u043d\u044f, \u0412\u0430\u043b\u044f |\n\n## \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u0433\u043b\u0430\u0433\u043e\u043b\u043e\u0432\n\n| \u0412\u0440\u0435\u043c\u044f | \u041a\u043e\u0434 | \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 | \u041f\u0440\u0438\u043c\u0435\u0440 |\n|-------|-----|----------|--------|\n| \u041f\u0440\u043e\u0448\u0435\u0434\u0448\u0435\u0435 | `past` | \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c | \u0442\u0430\u043d\u0446\u0435\u0432\u0430\u043b, \u0447\u0438\u0442\u0430\u043b\u0430 |\n| \u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 | `present` | \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c | \u0442\u0430\u043d\u0446\u0443\u044e, \u0447\u0438\u0442\u0430\u0435\u0442 |\n\n## \u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f\n\n```python\nfrom marmel_grammar import MarmelGrammar\n\ndef demo():\n # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438\n grammar = MarmelGrammar()\n \n # \u0422\u0435\u0441\u0442 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438\n print(\"=== \u0422\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f ===\")\n english_names = [\"Mika\", \"Alexander\", \"Anna\", \"John\"]\n for name in english_names:\n russian_name = grammar.transliterate_to_russian(name)\n print(f\"{name} \u2192 {russian_name}\")\n \n # \u0422\u0435\u0441\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0440\u043e\u0434\u0430 \u0438 \u0441\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f\n print(\"\\n=== \u0421\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d ===\")\n test_names = [\"\u041c\u0438\u043a\u0430\", \"\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\", \"\u0410\u043d\u043d\u0430\"]\n \n for name in test_names:\n gender = grammar.detect_gender(name)\n print(f\"\\n\u0418\u043c\u044f: {name} (\u0440\u043e\u0434: {gender})\")\n \n forms = grammar.get_all_forms(name)\n for case, form in forms.items():\n print(f\" {case}: {form}\")\n \n # \u0422\u0435\u0441\u0442 \u0441\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u044f \u0433\u043b\u0430\u0433\u043e\u043b\u043e\u0432\n print(\"\\n=== \u0421\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435 \u0433\u043b\u0430\u0433\u043e\u043b\u043e\u0432 ===\")\n verbs = [\"\u0442\u0430\u043d\u0446\u0435\u0432\u0430\u0442\u044c\", \"\u0447\u0438\u0442\u0430\u0442\u044c\", \"\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c\"]\n subjects = [\"\u041c\u0430\u0440\u0438\u044f\", \"\u0418\u0432\u0430\u043d\", \"\u0421\u0430\u0448\u0430\"]\n \n for verb in verbs:\n for subject in subjects:\n conjugated = grammar.conjugate(verb, \"past\", subject)\n print(f\"{subject} {conjugated}\")\n \n # \u0422\u0435\u0441\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439\n print(\"\\n=== \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439 ===\")\n sentences = [\n (\"\u0418\u0432\u0430\u043d\", \"\u0447\u0438\u0442\u0430\u0442\u044c\", \"\u0410\u043d\u043d\u0430\"),\n (\"\u041c\u0430\u0440\u0438\u044f\", \"\u0438\u0437\u0443\u0447\u0430\u0442\u044c\", \"Python\"),\n (\"\u0421\u0430\u0448\u0430\", \"\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c\", \"\u043e\u0431\u0435\u0434\")\n ]\n \n for subj, verb, obj in sentences:\n sentence1 = grammar.make_sentence(subj, verb, obj)\n sentence2 = grammar.make_sentence_for(subj, verb, obj)\n print(f\"\u041e\u0431\u044b\u0447\u043d\u043e\u0435: {sentence1}\")\n print(f\"\u0421 '\u0434\u043b\u044f': {sentence2}\")\n print()\n\nif __name__ == \"__main__\":\n demo()\n```\n\n## \u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445\n\n\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043c\u0435\u043b\u043a\u0443\u044e \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 + \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442:\n\n- **\u0418\u043c\u0435\u043d\u0430**: \u0431\u043e\u043b\u0435\u0435 50 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0440\u0443\u0441\u0441\u043a\u0438\u0445 \u0438\u043c\u0435\u043d \u0441 \u043f\u043e\u043b\u043d\u044b\u043c\u0438 \u043f\u0430\u0434\u0435\u0436\u043d\u044b\u043c\u0438 \u0444\u043e\u0440\u043c\u0430\u043c\u0438\n- **\u0413\u043b\u0430\u0433\u043e\u043b\u044b**: 20+ \u0433\u043b\u0430\u0433\u043e\u043b\u043e\u0432 \u0441 \u0444\u043e\u0440\u043c\u0430\u043c\u0438 \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0435\u0433\u043e \u0438 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438\n- **\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430**: \u0430\u043d\u0433\u043b\u043e-\u0440\u0443\u0441\u0441\u043a\u0438\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0438\u043c\u0435\u043d\n- **\u0422\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f**: \u043f\u043e\u043b\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0430 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0445 \u0431\u0443\u043a\u0432 \u0438 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0439\n\n## \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438\n\n### \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435\n\u0414\u043b\u044f \u0438\u043c\u0435\u043d, \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u043c\u043e\u0440\u0444\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430.\n\n### \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0445 \u0438\u043c\u0435\u043d\n\u0418\u043c\u0435\u043d\u0430 \u0441 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0442\u0438\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 Unicode-\u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438) \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.\n\n### \u0423\u043c\u043d\u043e\u0435 \u0441\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435\n\u0413\u043b\u0430\u0433\u043e\u043b\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043f\u0440\u044f\u0433\u0430\u044e\u0442\u0441\u044f \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430.\n\n### \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432\n\u041f\u0440\u0438 \u043e\u0447\u0438\u0441\u0442\u043a\u0435 \u0438\u043c\u0435\u043d \u043f\u0440\u043e\u0431\u0435\u043b\u044b \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0440\u043e\u043a\u0438, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u0435\u043b\u044b \u0434\u043b\u044f \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0445 \u0438\u043c\u0435\u043d.\n\n## \u0412\u0435\u0440\u0441\u0438\u044f \u0438 \u0430\u0432\u0442\u043e\u0440\n\n**\u0412\u0435\u0440\u0441\u0438\u044f**: 0.1.8b3\n\n**\u0410\u0432\u0442\u043e\u0440**: Dev-Marmel \n**Email**: marmelgpt@gmail.com \n**Telegram**: [@dev_marmel](https://t.me/dev_marmel)\n\n## Changelog\n\n### 0.1.8b3\n- \u0418\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441\u043e \u0441\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435\u043c \u0432 \u0432\u0438\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c/\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0430\u0434\u0435\u0436\u0435\n- \u0423\u0434\u0430\u043b\u0435\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438\n- \u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0445 \u0438\u043c\u0435\u043d\n- \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0438\u043c\u0435\u043d\n- \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0430 \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0433\u043b\u0430\u0433\u043e\u043b\u043e\u0432\n",
"bugtrack_url": null,
"license": null,
"summary": "\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u0439 \u043c\u043e\u0440\u0444\u043e\u043b\u043e\u0433\u0438\u0438 \u0438 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f Python",
"version": "0.1.9",
"project_urls": {
"Bug Reports": "https://t.me/dev_marmel",
"Documentation": "https://t.me/dev_marmel",
"Homepage": "https://t.me/dev_marmel",
"Source": "https://t.me/dev_marmel",
"Telegram": "https://t.me/dev_marmel"
},
"split_keywords": [
"russian",
" morphology",
" declension",
" grammar",
" transliteration",
" names",
" verbs",
" linguistic"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "26c77d9d9e4ebb30d746341890bb293722438afc89a03f527b6911c25d89e14a",
"md5": "7c36732eea0c27b447a0a87d541bb85c",
"sha256": "0a5f9b46d43419fab9ec984e1c3e2660394cb4d29bad37d6b114d57a1ddbc3b8"
},
"downloads": -1,
"filename": "marmel_grammar-0.1.9-py3-none-any.whl",
"has_sig": false,
"md5_digest": "7c36732eea0c27b447a0a87d541bb85c",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 10844,
"upload_time": "2025-07-26T16:56:06",
"upload_time_iso_8601": "2025-07-26T16:56:06.425426Z",
"url": "https://files.pythonhosted.org/packages/26/c7/7d9d9e4ebb30d746341890bb293722438afc89a03f527b6911c25d89e14a/marmel_grammar-0.1.9-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "afc504ed204d7c394ce53b0c619676dc391020fa626a2dc42f1c90ce7738a9d1",
"md5": "cb27827bfa93005f969948e1ac26f744",
"sha256": "6397d4c4e0ec3fcd93de71eba71ecc6b298dccdea25a52a2e0212c372907c4f2"
},
"downloads": -1,
"filename": "marmel_grammar-0.1.9.tar.gz",
"has_sig": false,
"md5_digest": "cb27827bfa93005f969948e1ac26f744",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 14944,
"upload_time": "2025-07-26T16:56:08",
"upload_time_iso_8601": "2025-07-26T16:56:08.122036Z",
"url": "https://files.pythonhosted.org/packages/af/c5/04ed204d7c394ce53b0c619676dc391020fa626a2dc42f1c90ce7738a9d1/marmel_grammar-0.1.9.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-26 16:56:08",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "marmel-grammar"
}