В этой роще березовой,

Вдалеке от страданий и бед,

Где колеблется розовый

Немигающий утренний свет,

Где прозрачной лавиною

Льются листья с высоких ветвей, —

Спой мне, иволга, песню пустынную,

Песню жизни моей.

Стихотворение "В этой роще березовой" Николай Заболоцкий написал в 1946 году. В 1968 году режиссер Станислав Ростоцкий снял фильм "Доживем до понедельника", в котором артист Вячеслав Тихонов проникновенно исполняет песню композитора Кирилла Молчанова, написанную на основе этих строк.

Заболоцкий писал стихотворение, живя в Переделкино в окружении берез и эмоционально реагируя на трагедию недавней войны, в конце которой атомные бомбы падали на японские города.

Когда я читал это стихотворение, мне показалось, что по звучанию оно похоже на молитву или литургию. Мне стало интересно провести анализ этого стихотворения с помощью Python и попытаться раскрыть его богословский смысл.

Python здесь послужит как инструмент и поможет увидеть то, что глаз пропускает при чтении. Моя цель проверить, действительно ли стихотворение построено как "литургический текст". Для этого я решил посчитать "духовную насыщенность", то есть вычислить в тексте слова из литургического словаря. Затем проверить тональность с помощью RuSentiLex и вывести ключевые образы.

Буду использовать "re" для выделения слов без знаков препинания, pymorphy3 для лемматизации и matplotlib для визуализации.

Для анализа тональности буду использовать именно RuSentiLex. Я скачал словарь в виде txt файла с табличной структурой, разделённой запятыми и комментариями. Мой файл не содержит заголовков, поэтому я парсил .txt напрямую без pandas.

def load_rusentilex(filepath):
    sentiment_dict = {}
    with open(filepath, 'r', encoding='utf-8') as f:
        for line in f:
            line = line.strip()
            if not line or line.startswith(('!', '#')):
                continue

Это позволило мне обойтись без заголовков, игнорировать строки с комментариями и использовать pymorphy3 для лемматизации входного текста и корректного сопоставления с леммами из словаря.

RuSentiLex содержит слова, значения которых связаны с тональностью и для которых хотя бы одно значение имеет оценочный компонент. Это означает, что слово в этом значении имеет либо явно выражает отношение к обсуждаемому объекту, либо передается через выражаемую эмоцию и не передает оценку автора.

Я решил не использовать нейросети. По моему опыту, они не понимают литургического контекста. Для них "война" будет просто негативным словом, в то время как у Заболоцкого это жертвенная борьба, часть пути к воскрешению.

Для начала анализа я решил установить структуру стихотворения. Но это оказалось не простой задачей. Если открыть книгу, где "Иволга" напечатана, то структура текста видна сразу, ее когда-то определили редакторы книжного издательства и, возможно, даже согласовали с автором. Но я имею дело с файлом .txt, скачанным из интернета и не имеющим типографской разметки.

Так стихотворение напечатано в книге
Так стихотворение напечатано в книге

Пришлось подумать, как узнать структуру с помощью Python. Способ определить строки по пустой строке не подойдет, их нет в файле. После нескольких экспериментов, я пришел к решению посчитать кодом количество строк, найти однозначный признак окончания строки (в русской поэзии строфы часто завершаются полным предложением) и исключить точки внутри строфы.

all_lines = text.split('\n')
print(f"Всего строк в файле: {len(all_lines)}\n")
def get_ending_punctuation(line):
    """Знак препинания в конце строки"""
    line = line.rstrip()
    if not line:
        return None
    match = re.search(r'[.?!,:;—–-]$', line)
    if match:
        return match.group(0)
    
    if line.endswith('...'):
        return '...'
    
    return None
lines_data = []
for i, line in enumerate(all_lines):
    stripped = line.strip()
    if not stripped:  # пропускаю пустые строки
        continue
    
    punct = get_ending_punctuation(stripped)
    lines_data.append({
        'index': i + 1,  # номер строки в файле 
        'text': stripped,
        'punctuation': punct,
        'is_sentence_end': punct in ['.', '!', '?', '...']
    })

По этому коду получилось, что в стихотворении 5 строф. Но строк код посчитал 48, это число на 5 не делится. Поэтому разумно скорректировать вывод и предположить, что строф всего 6 по 8 строк в каждой. Это больше соответствует каноническому представлению о ритмическом устройстве стихотворения и такая строфа называется октавой.

Получается, что стихотворение имеет ровно 48 строк, то есть 6 строф по 8 строк. Скорее всего, такое построение текста у автора вышло не случайно. Это выглядит как отсылка к "шестопсалмию" - центральной части утренней службы в церкви. Шестопсалмие читается на каждой утрене при закрытых царских вратах и погашенных свечах. Но важно, что шестопсалмие состоит именно из шести избранных псалмов. Вот даже на начальном этапе цифровой анализ уже начинает показывать, почему стихотворение "Иволга" так похоже на богослужебный текст. Оно устроено так по структуре.

Далее я решил составить список богословских терминов. Но одного только словаря богослужебных слов мне показалось не достаточно и я решил совместить его со словарем поэтических "символов священного". Теперь посчитаю долю таких слов в каждой строфе, это и будет "духовное напряжение". Для каждой леммы проверяю, есть ли она в словаре. Если да, то прибавляю +1 или -1.

spiritual_lexicon = {
    'божественный', 'заутреня', 'душа', 'молитва', 'храм', 'ангел', 'небо',
    'воскресение', 'победа', 'роса', 'свет', 'утро', 'целомудренный', 'пустыня',
    'отшельник', 'странник', 'грех', 'благодать', 'жертва', 'смерть', 'вечность',
    'лавина', 'лист', 'ветвь', 'цветок', 'капля', 'солнце', 'река', 'камыш',
    'обрыв', 'руины', 'сердце', 'голос', 'песня', 'жизнь', 'страдание', 'беда',
    'торжественный', 'век', 'бой', 'земля', 'дом', 'крыло', 'атом', 'ум'
}

positive_words = {
    'свет', 'победа', 'торжественный', 'свежесть', 'целомудренный', 'неприметный',
    'прозрачный', 'розовый', 'лавина', 'песня', 'друг', 'утро', 'солнце', 'жизнь'
}
negative_words = {
    'страдание', 'беда', 'смерть', 'война', 'атом', 'мельница', 'взрыв', 'пулемёт',
    'ворон', 'убитый', 'опалённый', 'дрожа', 'безумный', 'смертельный', 'руины',
    'чернеет', 'облако', 'бой', 'солдат'
}

spiritual_ratios = []
sentiment_scores = []
found_images_per_stanza = []

for stanza in stanzas_texts:
    tokens = set(tokenize(stanza))

    spiritual_count = len(tokens & spiritual_lexicon)
    total = len(tokenize(stanza))
    ratio = spiritual_count / total if total > 0 else 0
    spiritual_ratios.append(ratio)

    found = tokens & key_images
    found_images_per_stanza.append(found)

    
    pos = len(tokens & positive_words)
    neg = len(tokens & negative_words)
    score = (pos - neg) / (pos + neg) if (pos + neg) > 0 else 0.0
    sentiment_scores.append(score)

Далее оценю тональность по лексикону RuSentiLex.

def rusentilex_score(text, lexicon):
    lemmas = lemmatize_text(text)
    total = 0
    score = 0
    for lem in lemmas:
        if lem in lexicon:
            score += lexicon[lem]
            total += 1
    return score / total if total > 0 else 0.0

Вычисляю ключевые образы.

key_images = {'иволга', 'роса', 'война', 'атомы', 'победа'} 

Эти слова играют роль точек перелома сюжета. Иволга здесь выступает в роли ангела-вестника, атомы символизируют вторжение технократического хаоса, победа это эсхатологический финал.

Посмотрим что вывел код.

Строфа 1: духовная лексика = 3.23%, тональность = -0.50, образы = ['иволга']

Строфа 2: духовная лексика = 3.85%, тональность = +0.00, образы = []

Строфа 3: духовная лексика = 0.00%, тональность = -0.33, образы = ['атомы', 'иволга']

Строфа 4: духовная лексика = 6.90%, тональность = -1.00, образы = []

Строфа 5: духовная лексика = 9.09%, тональность = -1.00, образы = []

Строфа 6: духовная лексика = 3.45%, тональность = +0.60, образы = []

Для каждой строфы получаю содержание духовной лексики и тональность.

Вот 1-2 строфа низкая, но растущая доля духовной лексики. Тональность в 1-й строфе отрицательная, потому что RuSentiLex помечает "беда" и "страдание" как негатив ("В этой роще березовой, Вдалеке от страданий и бед, ").  Но с точки зрения авторского замысла это не так плохо, это мир, от которого лирический герой уходит в священное пространство. 

Строфа 3 здесь в текст стихотворения врывается история ("Содрогаются атомы, Белым вихрем взметая дома. "). Нулевая духовная лексика, мир стал профанным.  Появляются атомы и войны, символы технократического апокалипсиса. Тональность падает, история разрушает священное.

В строфах 4 и 5 найдена максимальная духовная насыщенность, но тональность -1. Здесь показаны руины смерти, смертельное облако ("И смертельное облако тянется Над твоей головой.").

Строфа 6 это уже воскресение ("Где под каплей божественной Холодеет кусочек цветка, —

Встанет утро победы торжественной На века.").  Духовная лексика здесь снижается, так как мир уже преображён и много слов не нужно. Тональность резко положительная – здесь звучат слова "победа", "торжественный", "божественная капля".

Почему тональность "колеблется"? RuSentiLex не знает контекста эсхатологии. Для него смерть это всегда негатив, бой всегда конфликт. Но у Заболоцкого смерть имеет другое значение, это порог воскрешения, а бой — путь к победе.

Поэтому в строфах 4 и 5 тональность минимальна, но духовная лексика максимальна. Это парадокс христианской теодицеи - зло как путь к добру.

График "духовного напряжения" стихотворения выглядит так.

Профиль духовного напряжения стиховтоерния
Профиль духовного напряжения стиховтоерния

Начало это тихое моление, середина погружение в историческую тьму, кульминация — жертвенная скорбь и финал — эсхатологическое преображение. Это точная копия структуры утрени, утренней службы в церкви. Можно сказать, что Заболоцкий создаёт не просто стихотворение, а богословский текст в поэтической форме. Это подтверждает мою гипотезу о том, что стихотворение «Иволга» звучит как молитва, потому что устроено так.