Недалеко от Москвы, на берегу Оки есть небольшой город Таруса. В конце 19 века семья профессора Цветаева сняла здесь дачу и Марина Цветаева провела все детство в этих местах. Позднее уже в 70-х в Тарусе поселилась и поэтесса Белла Ахмадулина. Женщины, конечно, никогда не встречались при жизни. Но памятники обеим поэтесса стоят ровно напротив друг друга на набережной Оки в центре Тарусы. Мне стало интересно с помощью Python проанализировать цветаевские следы в творчестве Ахмадулиной и математически проявить диалог поэтических миров двух авторов.
В одном из стихотворений Ахмадулина прямо обращается к Цветаевой:
Я целовала крутолобье волн,
просила море: Притворись водою!
Страшусь тебя, словно изгнали вон
в зыбь вечности с невнятною звездою.
Та любит твердь за тернии пути,
пыланью брызг предпочитает пыльность
и скажет: Прочь! Мне надобно пройти.
И вот проходит — море расступилось.
Я начал с того, чтобы выявить, как в поэзии Ахмадулиной реализуются ключевые образы Цветаевой "лоб", "горло", "путь", "дом".
TARGET_LEMMAS = {'лоб', 'горло', 'гортань', 'путь', 'дом'} def normalize_and_tokenize(text): text = re.sub(r'[^а-яё\s]', ' ', text.lower()) return [token.text for token in razdel.tokenize(text)] def count_lemmas(tokens): counts = {lemma: 0 for lemma in TARGET_LEMMAS} for token in tokens: if len(token) < 2: continue parsed = morph.parse(token) if parsed: lemma = parsed[0].normal_form if lemma in TARGET_LEMMAS: counts[lemma] += 1
Этот код удаляет всё, кроме букв и пробелов, и разбивает текст на слова. Далее count_lemmas использует pymorphy3 для определения начальной формы каждого слова. Это позволяет учитывать все грамматические формы слов "лба", "лбу", "горлом", "путей".
Результаты: частотность мотивов
Мотив | Ахмадулина | Цветаева |
дом | 40 | 179 |
лоб | 10 | 111 |
горло | 4 | 17 |
гортань | 4 | 4 |
путь | 4 | 89 |
У Цветаевой все мотивы встречаются значительно чаще, это её авторская система. Но у Ахмадулиной все мотивы присутствуют, даже редкое слово "гортань". Это подтверждает мою гипотезу, что Ахмадулина входит в цветаевскую образную систему, а не просто ее цитирует.
Затем я решил проверить характерность этих мотивов для обеих поэтесс с помощью TF-IDF, чтобы проверить насколько "вес" слова пропорционален частоте его употребления в корпусе и обратно пропорционален частоте его употребления.
vectorizer = TfidfVectorizer(vocabulary=TARGET_LEMMAS, lowercase=True, token_pattern=r'(?u)\b[а-яё]+\b')
tfidf_matrix = vectorizer.fit_transform([text_bella, text_marina])
TF-IDF по целевым мотивам
мотив | Ахмадулина | Цветаева |
дом | 0.9748 | 0.7573 |
путь | 0.1625 | 0.5128 |
горло | 0.1083 | 0.0868 |
лоб | 0.1083 | 0.3944 |
гортань | 0.0000 | 0.0222 |
"Дом" имеет высокий TF-IDF у обоих авторов, получается, что это ключевой мотив их диалога. У Ахмадулиной "дом" даже более характерен, чем у Цветаевой (0.97 > 0.75), но возможно, из-за меньшего размера корпуса.
Далее я решил вычислить семантическое сходство контекста с помощью SBERT. Эта модель позволяет представить текст в виде векторных представлений и построить эмбеддинги, компактные числовые векторы фиксированной длины, которые сохраняют смысл текста. Эти векторы можно сравнить, чем они ближе, тем более похожи тексты.
model = SentenceTransformer('sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2') def extract_contexts_full(text, target_lemmas, window=5): tokens = normalize_and_tokenize(text) contexts = [] for i, token in enumerate(tokens): parsed = morph.parse(token) if parsed and parsed[0].normal_form in target_lemmas: start = max(0, i - window) end = min(len(tokens), i + window + 1) context = ' '.join(tokens[start:end]) contexts.append(context) return contexts
SBERT преобразует контекст предложения в 384-мерный вектор. Я беру плюс-минус 4 слова вокруг целевого. Косинусное сходство 0.9 означает почти идентичный смысл.
Результат:
«лоб»: сходство = 0.914
«горло»: сходство = 0.856
«путь»: сходство = 0.826
«дом»: сходство = 0.957
Косинусное сходство > 0.8 означает почти идентичные семантические контексты. "Дом" у обеих поэтесс связан с одиночеством и судьбой. "Лоб" и "горло" с творческим страданием и физиологией голоса.
Вот что пишет Ахмадулина о Цветаевой в 1968 году:
Тяжелой болью памяти к тебе,
когда, хлебая безвоздушность горя,
от задыхания твоих тире
до крови я откашливала горло.
Здесь Ахмадулина воспроизводит "телесный" образ поэта, где голос рождается в горле, а мысль во лбу.
Цифровой анализ количественно подтверждает мою гипотезу, что Ахмадулина ведёт диалог с Цветаевой через систему образов, а не через отдельные цитаты. Код позволяет увидеть, как один поэт входит в художественный мир другого, воссоздавая его образную систему. Он позволяет увидеть, как связаны поэтические миры двух женщин.
