marmel-grammar


Namemarmel-grammar JSON
Version 0.1.9 PyPI version JSON
download
home_pagehttps://t.me/dev_marmel
SummaryБиблиотека русской морфологии и транслитерации для Python
upload_time2025-07-26 16:56:08
maintainerNone
docs_urlNone
authorDev-Marmel
requires_python>=3.8
licenseNone
keywords russian morphology declension grammar transliteration names verbs linguistic
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            
# 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"
}
        
Elapsed time: 0.48327s