Где заканчивается слово и начинается образ? Использую 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)
Вот что получилось в результате:
Всего слов: 261 737
Прилагательных (эпитетов): 18 363
Плотность эпитетов: 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
MadMarakuya
Вопрос: почему вы не сделали следующий шаг и не поискали по файлам полнотекстовым поиском контекст, что это за "должные человек" и "низких морю"? Выглядит как недоработка в достаточно интересном по задумке исследовании.
Есть подозрение, что в этих предложениях порядок слов измененный, чтобы атмосферу особую передать и существительное с придагательным идут не в том порядке, в котором вы ожидали...
Eco_coder Автор
спасибо за идею нового исследования