Разные возвышенные мысли проходят. Разные гуманные фразы теснятся в голове. Разные стихотворения на ум приходят. Из Пушкина что-то такое выплывает в память: "Тятя, тятя, наши сети притащили мертвеца..."
Михаил Зощенко. "В трамвае".
В 20-30-х годах Михаила Зощенко активно печатали в СССР. Очевидно, советским литературным властям нравилось, как писатель клеймит словом общечеловеческие грехи – жадность, корыстолюбие, местничество и невежество. Зощенко умел писать точно, коротко и смешно. Его рассказы наполнены тонким юмором и даже его язык кажется таким специфически "зощенковским", комичным. Какими же инструментами писатель достигал такой легкости восприятия текста и что делал его язык таким авторским? Мне стало интересно попробовать с помощью Python математически установить те лексические средства, которые делают язык писателя столь особенным и смешным.
Я скачал из интернета полное собрание Зощенко в 7 томах, превратил эти тексты в один файл .txt и сделал анализ.
Даже беглое прочтение рассказов и фельетонов показывает, что Зощенко часто использует повествование от первого лица как ключевую особенность текста. Я использовал синтаксический анализатор, чтобы выявить и подсчитать все местоимения 1-го лица.
def count_first_person(self, text: str) -> Dict: tokens = re.findall(r'[а-яА-ЯёЁ]+', text.lower())
Что у меня получилось
Всего слов: 750,303
Местоимений 1-го лица: 19,741
Средняя плотность: 33.91 / 1000 слов

Такое большое количество местоимений первого лица говорит нам, что писатель не просто переносит читателя в обстоятельства героя, а скорее демонстрирует высокую субъективность, погружение рассказчика в текст. За счет этого приема проза у Зощенко становится более исповедальной. Такой прием так же хорошо имитирует устную речь.
Имитация устной речи проявляется еще и в том, что писатель намеренно разбивает текст на несколько фрагментов, разбивает интонацией и пунктуацией. Такая "рваная" речь характерна именно для разговорного синтаксиса. В литературоведческой науке этот прием называется "парцелляцией". Я применил код, чтобы вычислить парцелляцию у Зощенко. Код перебирает паттерны регулярных выражений, каждый из которых ищет конструкцию, нарушающую плавность синтаксиса. Это точка, затем тире, затем заглавная буква. Многоточие, затем заглавная. Точка, перевод строки и резкий обрыв. Тире в конце предложения – обрыв речи.
def detect_parcellation(self, text: str) -> List[Dict]: found = [] patterns = [ r'\.\s*—\s*[А-Я]', r'\.\s*\n\s*[А-Я]', r'\.\.\.\s*[А-Я]', r'!\s*—\s*[А-Я]', r'\?\s*—\s*[А-Я]', r'—\s*[А-Я][а-я]+\s*$', ]
Что получилось:
Всего слов: 750,303
Парцелляций: 28,784

А познакомился Володька Завитушкин со своей невестой в трамвае.Дней за пять до брака.
Михаил Зощенко. "Свадебное происшествие".
Далее обращает на себя внимание краткость предложений. Я вычислил среднюю длину предложений и количество коротких предложений в корпусе текстов. Код разбивает текст на предложения, подсчитывает количество слов в каждом, и если оно меньше или равно 5, фиксирует такое предложение. Код позволяет выявить намеренно короткие, рубленые фразы, это ещё один маркер устной речи у писателя.
Что получилось:
Всего слов: 750,303
Коротких предложений: 27,644
Средняя длина предложения: 8.7 слов

Результаты обработки всего корпус текстов я вывел в таблицу для удобства анализа. По таблице видно, что во многих рассказах парцелляция составляет 40–70 на 1000 слов. Это исключительно высокий показатель, подтверждающий, что Зощенко активно использует разрыв синтаксической плавности, имитируя спонтанную, "сломанную" речь рассказчика. Доля коротких предложений из 1–5 слов часто превышает 0,5. Это показывает "недалекость" многих персонажей, от лица которых выступает автор. И усиливает эффект разговорности, лаконичности текста.
В одном общежитии жила некто Маруся Кораблева. Очень кокетливая особа. Молоденькая. Лет восемнадцати. Довольно вертлявая и вообще склонная к мещанскому уюту.
Михаил Зощенко. "Хитрость, допущенная в одном общежитии".
Интересные результаты показывает вычисление средней длины предложений. Это значение колеблется от 3,5 до 12–15 слов. В рассказах, где парцелляция и короткие предложения особенно часты, средняя длина падает. В более "спокойных" текстах средняя длина растёт.
У читателя Зощенко складывается и определенный фонетический портрет героев за счет того, что писатель им в язык закладывает много просторечных местоимений ("ихний", "евонный") и подозрительных падежных окончаний ("-ям", -"их").
Чтобы выявить такие элементы в корпусе текстов, я создал ручной словарь просторечий. Использовал детектор морфологически нарушений, чтобы найти слова с подозрительными окончаниями.
Что у меня получилось:
Слов: 750,303
Просторечных местоимений: 86
Подозрительных окончаний: 1,676
Всего: 1,762
Плотность: 2.32 / 1000 слов
Наибольший вклад в такие "ошибки" дают случаи с подозрительными окончаниями (например, "девях", "мильёнах"). Это соответствует стилю Зощенко, который намеренно искажал слова для имитации просторечия.

Интересные результаты получились при анализе нарушения согласований прилагательных и существительных по роду и числу. В текстах Зощенко такие приемы встречаются часто. Например, герой рассказа "Светлый гений" товарищ Фиолетов говорит своей жене "Ну, конечно, работаешь, как собака, как сукина дочь, а тут суп несоленый". По читательскому впечатлению кажется, что эта очевидное искажение речи применено автором намеренно. Однако код по поиску таких "ошибок" ничего не нашел.
def detect_gender_number_errors(text: str) -> List[Dict]: found = [] if not USE_MORPHY: return found
Причин такой работы кода может быть несколько. Скорее всего, pymorphy3 неправильно классифицирует просторечные слова. Например, слово "пальто" всегда среднего рода, но в речи персонажа может употребляться как мужского, и морфологический анализатор этого не замечает. Ошибка анализа может быть связана еще и с тем, что код не учитывает, что прилагательное может относиться к существительному, стоящему не непосредственно за ним, а через запятую или в другой синтаксической позиции. Таким образом, одну из интереснейших особенностей языка писателя Зощенко кодом обработать не получилось.
Зато вот другая несомненная черта именно зощенковской речи детектируется кодом легко. Можно выявить канцеляризмы, то есть слова длиннее 6 символов, оканчивающиеся на "ств", "аци", "иров", "ующ", "тель", "ние". Эти окончания характерны для официально-деловой речи, но у Зощенко служат маркерами бюрократии, которую сатирик обличает. Далее я выявил кодом заимствования, то есть слова с суффиксами "ция", *мент", "тор", "лог". Это латинские суффиксы, часто указывающие на иностранное происхождение.
bureaucratic_suffixes = ['ств', 'аци', 'иров', 'ующ', 'тель', 'ние'] colloquial_suffixes = ['к', 'ок', 'ик', 'ушк', 'юшк', 'оньк', 'еньк'] foreign_patterns = [r'.*ция$', r'.*мент$', r'.*тор$', r'.*лог$'] registers = defaultdict(int) for word in set(tokens): # Заимствования if any(re.match(p, word) for p in foreign_patterns): registers['заимствование'] += word_freq[word] continue # Канцеляризмы if any(word.endswith(s) for s in bureaucratic_suffixes) and len(word) > 6: registers['канцеляризм'] += word_freq[word] continue # Просторечия if any(word.endswith(s) for s in colloquial_suffixes) and len(word) > 3: registers['просторечие'] += word_freq[word]
Кодом можно выявить другие ключевые элементы комического, складывающие уникальный стиль писателя Зощенко. Для выявления сравнений я сделал подсчет вхождений слов-маркеров "как", "словно", "будто", "точно", "подобно". Для фиксации гипербол я сделал выявление слов-интенсификаторов "крайне", "чрезвычайно", "ужасно", "страшно". Чтобы выявить кодом иронию, я искал предложения с "конфликтом полярностей". В таких предложениях одновременно встречаются положительные слова "хорошо", "отлично", "прекрасно" и отрицательные "плохо", "ужасно", "страшно". Количество таких предложений служит мерой иронии.
comparison_markers = ['как', 'словно', 'будто', 'точно', 'подобно'] hyperbole_intensifiers = ['очень', 'крайне', 'чрезвычайно', 'ужасно', 'страшно'] tropes = { 'сравнение': sum(1 for m in comparison_markers if m in text.lower()), 'гипербола': sum(1 for m in hyperbole_intensifiers if m in text.lower()), } positive = {'хорошо', 'отлично', 'прекрасно', 'великолепно'} negative = {'плохо', 'ужасно', 'страшно', 'кошмарно'} irony_count = 0 sentences = re.split(r'[.!?…]+', text) for sent in sentences: tokens_sent = set(re.findall(r'[а-яё]+', sent.lower())) if (tokens_sent & positive) and (tokens_sent & negative): irony_count += 1 tropes['ирония'] = irony_count
Интересный результат дает попытка нахождения кодом иронии по моему способу. Результат почти всегда получается нулевой, так как требуется одновременное присутствие положительных и отрицательных слов в одном предложении, а это редкое явление даже при наличии иронии в тексте. К тому же ирония часто выражается через контекст, а не через прямое соседство положительных и отрицательных слов.

По таблице хорошо видно, что просторечия встречаются во всех текстах и часто преобладают над канцеляризмами. Это подтверждает ориентацию Зощенко на имитацию живой, нелитературной речи. Заимствования относительно редки, что характерно для сознательного избегания иностранных слов в пользу русских просторечных форм.
Литературный успех Михаила Зощенко был однозначным – постановки в театрах, гонорары, поездки по стране, лекции и выступления. В 1939 году писатель получил Орден Трудового Красного Знамени. Но в августе 1946 года появилось "постановление о журналах "Звезда" и "Ленинград". Писатель Зощенко был из советской литературы фактически вычеркнут. Возможно, что такой разгром был отчасти следствием его авторитета и высокой популярности у читателей. Несомненно другое – в комических персонажах и сценах советская власть разглядела пародию на саму себя.
