Где заканчивается слово и начинается образ?

Использую Python для поиска особенностей творчества писателя Паустовского.

Писателя Паустовского называют "мастером пейзажной прозы". Он действительно умел красиво и при этом сдержано описать богатство природы. Вот что сам Паустовский написал в своей статье "Наедине с осенью" про использование писателями эпитетов: "Обычно начинающие писатели грешат обилием образов и эпитетов. Это придает их прозе мертвую пышность, сусальную или трескучую красивость. Бывает, что к одному существительному прилагается несколько эпитетов. Эпитет должен запоминаться. А для этого он должен быть единственным. Из трех эпитетов, приложенных к существительному, один всегда будет наиболее точным, а остальные два безусловно будут ему уступать. Поэтому ясно, что этот единственный эпитет надо сохранить, а остальные безжалостно вычеркнуть. Образ, равно как и эпитет, должен быть точен, свеж и скуп".

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

Я решил установить, как часто Паустовский использует прилагательные, какие самые частотные эпитеты в его прозе и какие необычные, метафоричные сочетания он создаёт. Для исследования буду использовать корпус текстов писателя из 4 тома его собрания сочинений, где встречаются рассказы о природе.

Буду использовать pymystem3, морфологический анализатор и лемматизатор, razdel для токенизации, spaСy для определения зависимости между словами. Pandas потребуется для работы с данными. Мне потребуется так же ru_core_news_sm, предобученная модель spaCy для русского языка.

Текст часто требует очистки перед анализом, извлечения лемм и построения корпуса.

import re from razdel import sentenize, tokenize from pymystem3 import Mystem m = Mystem() clean_text = re.sub(r'-\s\n\s', '', full_text) clean_text = re.sub(r'[^а-яА-ЯёЁa-zA-Z\s\.]', ' ', clean_text) clean_text = re.sub(r'\s+', ' ', clean_text).strip()

Так же для полноценного анализа мне потребуется разбить текст на леммы, то есть снизить слова к их корневым формам. Для лемматизаци удобно использовать закрытую разработку яндеса pymystem3. Эта библиотека работает быстро, но требует запускать консольное приложение.

for sent in doc.sents: sent_text = sent.text.strip() if len(sent_text) < 10: continue try: analysis = m.analyze(sent_text) except Exception as e: print(f"Ошибка Mystem: {e}") continue word_info = {} for word_data in analysis: if 'text' in word_data and 'analysis' in word_data and len(word_data['analysis']) > 0: txt = word_data['text'].lower() first = word_data['analysis'][0] lemma = first.get('lex', '').lower() pos = first.get('gr', '').split('=')[0].split(',')[0] word_info[txt] = {'lemma': lemma, 'pos': pos}

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

for token in sent: word_lower = token.text.lower() if word_lower in word_info: pos = word_info[word_lower]['pos'] if pos == 'A': # Прилагательное lemma = word_info[word_lower]['lemma'] adjectives.append(lemma) for child in token.children: if child.pos_ == 'NOUN' and child.dep_ in ('nsubj', 'obj', 'nmod', 'appos'): adj_noun_pairs.append((lemma, child.lemma_.lower()))

Для поиска образности создам словарь ключевых слов.

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

Так как я хочу найти не просто эпитеты, а образные, метафоричные сочетания, то буду исходить из гипотезы, что если если прилагательное из poetic_adj стоит перед словом из nature_words — это потенциально поэтический образ. Mystem даст мне более точную морфологическую разметку и он особенно хорошо работает с формами прилагательных и глаголов.

Проведу поиск эпитетов и их зависимых существительных.

if child.lemma_.lower() in nature_words or lemma in ['тяжёлый', 'камфарный', 'медный', 'чёрный']: metaphors.append(f"{token.text} {child.text}") all_tokens.append(token.text)

Этот код находит все прилагательные. Затем в коде срабатывет token.children — итератор, который возвращает все непосредственные дочерние элементы токена в синтаксическом дереве. Через синтаксические зависимости он находит, какое существительное описывает это прилагательное. Затем сохраняю эту пару и если сочетание образное - добавляет в список метафор.

И затем я захотел посчитать "плотность эпитетов" по отношению к общему числу слов в тексте.

total_words = len(all_tokens) adj_count = len(adjectives) adj_density = round(adj_count / total_words * 100, 2)

Вот что получилось в результате:

Всего слов: 261737

Прилагательных (эпитетов): 18363

Плотность эпитетов: 7.02%

И посчитаю самые частотные прилагательные, самые частые образные сочетания прилагательное + существительное и возможные метафоры.

adj_counter = Counter(adjectives) print("ТОП-10 ЭПИТЕТОВ:") for adj, cnt in adj_counter.most_common(10): print(f"{adj} — {cnt} раз") print("\n НАИБОЛЕЕ ЧАСТЫЕ ОБРАЗНЫЕ СОЧЕТАНИЯ (эпитеты):") pair_counter = Counter(adj_noun_pairs) for (adj, noun), count in pair_counter.most_common(10): print(f"{adj} {noun} — {count} раз") print("\n ВОЗМОЖНЫЕ МЕТАФОРЫ И ОБРАЗНЫЕ ВЫРАЖЕНИЯ:") unique_metaphors = set(metaphors) for expr in sorted(unique_metaphors, key=lambda x: metaphors.count(x), reverse=True)[:15]: print(f"→ «{expr}»")

Вот что получилось в результате:

ТОП-10 ЭПИТЕТОВ:

черный — 269 раз

маленький — 210 раз

старый — 187 раз

белый — 182 раз

молодой — 153 раз

красный — 140 раз

большой — 134 раз

высокий — 133 раз

серый — 122 раз

хороший — 116 раз

НАИБОЛЕЕ ЧАСТЫЕ ОБРАЗНЫЕ СОЧЕТАНИЯ (эпитеты):

должный человек — 6 раз

слышный крик — 5 раз

слышный гул — 4 раз

хороший мир — 3 раз

слышный шум — 2 раз

должный жизнь — 2 раз

столетний липа — 2 раз

солнечный день — 2 раз

мокрый дождь — 2 раз

свежий голова — 2 раз

ВОЗМОЖНЫЕ МЕТАФОРЫ И ОБРАЗНЫЕ ВЫРАЖЕНИЯ: → «низких морю» → «пьющих воду» → «Вешние воды» → «шипучей воды» → «мокрой дождя» → «оранжевое небо» → «Милый сердце» → «хорошего свете» → «гнила вода» → «Велик земли» → «должна вода» → «обильнее дожди» → «загадочнее земля» → «дремучие леса» → «Ярче солнце»

Что можно сказать по результатам этого исследования.

У Паустовского плотность эпитетов в тексте 7.01%. Согласно известным исследованиям, да просто по читательскому впечатлению, в текстах Паустовского часто встречается богатая цветовая и описательная лексика. Мое цифровое исследование подтверждает это. Можно сказать, что Паустовский действительно пишет поэтической прозой, наполненной описаниями.

В топ-10 эпитетов преобладают цвета - чёрный, белый, красный, серый и размеры маленький, большой, высокий. Это говорит о визуальном восприятии писателем природы и человека. Среди образных сочетаний некоторые звучат странно ("должные человек"), но это может быть артефакт лемматизации или ошибка анализа. Но очевидно, что есть и красивые сочетания ("мокрый дождь").

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

На примере этого исследования видно, как Python помогает обнаружить и квантифицировать авторские особенности, больше узнать об эмоциональной насыщенности и поэтичности языка писателя. Подробные разборы других текстов можно посмотреть на видео https://dzen.ru/codslov

1
Начать дискуссию