Анализ эмоциональной тональности переписки Н.Р. Эрдмана и А.И. Степановой (1928-1935 гг.)

Author

Галкина Дарья

Published

November 29, 2024

Слово не воробей, выпустишь – не поймаешь, так вот, значит, выпустишь – не поймаешь, а за это тебя поймают и не выпустят.

…дайте нам право на шёпот!

Н.Р. Эрдман “Самоубийца”

Николай Робертович Эрдман (1900 - 1970), советский поэт, драматург и киносценарист. Ангелина Иосифовна Степанова (1905 - 2000), советская и российская актриса театра и кино, педагог.

Это исследование посвящено переписке советского писателя Н.Р. Эрдмана и актрисы МХТ А.И. Степановой, роман которых продлился семь лет.

Краткая история романа

Они познакомились в 1928 году, оба состояли в браке. Эрдман стал часто бывать в доме семьи Степановой, роман захватил их, и Степанова, поняв насколько сильны её чувства, рассталась с супругом и переехала к подруге Елене Елиной. Николай Эрдман навещал актрису в её новом жилище, приезжал в те города, где она была с гастролями театра. Он называл её Худырой, сравнивая это прозвище с, по его мнению, “пошлым” расхожим именем для возлюбленных “Земфира”. Позже за наивность и непосредственность он стал звать её птенчиком, а затем - Пинчиком.

В 1933 году Николая Эрдмана и Владимира Месса арестовали во время съёмок фильма «Весёлые ребята», над которым они оба работали в качестве авторов сценария. Причиной были сатирические басни, написанные Мессом и Эрдманом, и прочтённые на правительственном приёме Василием Качаловым. Вспомним одну из таких басен, которые и по просшествии практически ста лет не теряют своей остроты и очарования в глазах читателей.

***
Мы любим подмечать у недругов изъяны
И направлять на них насмешки острие.

Однажды молоко спросило у сметаны:
«Скажите, вы еда или питье?»
Сметана молвила: «Оставьте ваши шутки,
Действительно, я где-то в промежутке.
Но ведь важна
Не эта сторона,
Всего важней, что я вкусна,
И то, что все бывают мною сыты...»

Вот так порою и гермафродиты:
Тот, кто на свет их произвел,
Конечно, допустил ужасную небрежность,
Но ведь, в конце концов, существенен не пол,
А классовая принадлежность.

Когда стало известно о предстоящей высылке драматурга в Сибирь, Степанова решила оправиться на приём к секретарю ЦИК СССР Авелю Енукидзе, которого попросила дать разрешение на свидание с Эрдманом в Москве и навестить его в ссылке. Енукидзе не просто уговаривал её отказаться от идеи поехать в Сибирь, но даже предупреждал: для неё это может иметь очень печальные последствия, вплоть до её собственной ссылки. Но Степанова была непреклонна. Их первое после ареста Эрдмана свидание состоялось на Лубянке. Когда же Ангелина Степанова узнала об отправке Николая в Енисейск на три года, то стала писать ему открытки и ежедневно отправляла их в Сибирь. Ей хотелось, чтобы они встретили его в незнакомом городе и скрасили его дни. Три года они писали друг другу письма, полные тоски, любви, нежности и надежды. Он называл её длинноногой и ненаглядной, а она его – роднушей и единственным. Подписывали они свои письма просто, Лина и Николай.

…Вокруг все течет, кроме Енисея. Дорог нет — писем тоже…

Н.Р. Эрдман (из писем Шершеневичу)

Актриса познакомилась с родителями Николая, и они стали постоянно обмениваться новостями. А летом 1934 года она приехала к нему в Енисейск, где они вместе провели 10 дней. Стараниями Степановой Эрдмана перевели из Енисейска в Томск. Они продолжали переписываться, но потом Ангелина Степанова узнала о том, что к Эрдману в Томск собирается приехать жена, Дина Воронцова. После этого Степанова перестала отвечать на его письма.

В архивах Николая Эрдмана сохранились 280 писем от Ангелины Степановой. Она сберегла 70 его посланий. Они пересеклись потом только однажды, в 1957 году, в квартире брата Николая Эрдмана Бориса. К тому времени Ангелина Иосифовна уже похоронила второго мужа, писателя Александра Фадеева, с которым прожила почти 20 лет. Подробнее об истории романа можно прочитать по этой ссылке.

Спустя много лет А.И. Степанова написала воспоминания об этом романе, которые вошли, наряду с некоторыми из писем, в книгу (Вульф 2000). На сайте опубликован текст этой книги, которая и стала отправной точкой данного исследования.

Для того, чтобы составить представление о содержании книги, я создала слепок памяти Степановой об отношениях с Эрдманом в виде облака слов на основе опубликованных “Воспоминаний”.

Warning: пакет 'tidytext' был собран под R версии 4.4.2
Warning: пакет 'stopwords' был собран под R версии 4.4.2
Warning: пакет 'paletteer' был собран под R версии 4.4.2

Вызовы исследования

Письма - не самый удобный жанр для количественного анализа.

Во-первых, у них не всегда присутствует датировка (здесь я полагалась на хронологическое расположение писем редактором, которое, на мой взгляд, не противоречит логике).

Во-вторых, письма не формализованы: в них не всегда указаны автор и адресат (которых, впрочем, можно восстановить по содержанию), даты могут быть указаны в самых разнообразных форматах.

Кроме того, в используемом ресурсе воспоминания Степановой и письма перемешаны, а бессодержательная разметка на сайте не способствует извлечению нужной информации. Всё это делает приведение текста к формату tidy data весьма трудоёмким процессом.

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

Подготовка данных

Установим необходимые библиотеки.

#library(rvest)
#library(tidyverse)
library(udpipe)
Warning: пакет 'udpipe' был собран под R версии 4.4.2
library(rulexicon)
library(showtext)
library(plotly)
Warning: пакет 'plotly' был собран под R версии 4.4.2

Присоединяю пакет: 'plotly'
Следующий объект скрыт от 'package:ggplot2':

    last_plot
Следующий объект скрыт от 'package:stats':

    filter
Следующий объект скрыт от 'package:graphics':

    layout
library(ggimage)
Warning: пакет 'ggimage' был собран под R версии 4.4.2
library(htmlwidgets)
Warning: пакет 'htmlwidgets' был собран под R версии 4.4.2

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

url <- "https://fb2.top/pisyma-nikolay-erdman-angelina-stepanova-1928-1935-gg-457615/read/part-2"
html <- read_html (url) |>
  html_nodes(".col-xl-8 p , .subtitle") |> 
  html_text() 

html <- html [-568] 
text <- paste0(unlist(html), collapse = " ")

Удалим издательские сноски и продублированный при загрузке заголовок “Воспоминания А.И. Степановой”.

regex1 <- "\\[\\d*\\]"
no_footnotes <- gsub(regex1, "", text) 
regex2 <- "\\[.*?\\]\\s(?=\\[Вос)"
no_doubles <- gsub(regex2, "", no_footnotes, perl = TRUE)

Разделим текст на отдельные письма и воспоминания и получим 81 запись.

regex3 <- "\\s+(?=\\*\\s\\*\\s\\*|\\[Вос)" 
split_list <- no_doubles|>
  str_split(pattern = regex3) |>
  unlist()

Создадим тиббл, в котором будут отражены тип текста (воспоминания или письма) и автор. Эти сведения извлечём из текста при помощи регулярных выражений. Также очистим тексты от “разделителей”, которые позволили ранее определить их тип и границы.

table <- tibble(Жанр = character(), Автор = character(), Текст = character())

for (letter in split_list) {
  lina_present <- any(str_detect(letter, "\\.\\sЛина\\."))
  nikolay_present <- any(str_detect(letter, "\\.\\sНиколай\\."))
  vospomynanya_present <- any(str_detect(letter, "\\[Вос"))
  if (vospomynanya_present) {
    Жанр <- "Воспоминания"
    Автор <- "А.И. Степанова"
  }
  else if (lina_present) {
    Жанр <- "Письмо"
    Автор <- "А.И. Степанова"
  } 
  else if (nikolay_present) {
    Жанр <- "Письмо"
    Автор <- "Н.Р. Эрдман"
  } 
  table <- bind_rows(table, tibble(Жанр = Жанр, Автор = Автор, Текст = letter))
}

regex4 <- "\\*\\s\\*\\s\\*\\s|^.*?\\]\\s"
table <- table |>
  mutate(Текст = str_remove_all(Текст, regex4))

Основная трудность заключается в том, чтобы написать регулярное выражение, которое извлекает из текста письма дату его написания, так как она может быть оформлена самимы разнообразными способами. Создадим столбец “Дата” для извлечённой информации и сделаем данные опрятными.

Я вручную заполнила недостающие даты писем (Воспоминания Степановой датируются 1995-м годом), руководствуясь прочитанными свидетельствами и датами написания ближайших по времени писем (в поисках данных для более точного заполнения пропусков, я обнаружила ошибку в указании года перевода Эрдмана в Томск в Википедии). Отмечу, что здесь же я удалила из таблицы “Воспоминания”: они были полезны для построения облака слов выше, но не требуются для дальшейшего исследования.

regex5 <- "(\\b\\d{1,2}\\.\\d{1,2}\\.\\d{2,4}\\b)|(\\b\\d{1,2}/\\w{1,3}\\-\\d{1,2}\\b)|(\\b\\d{1,2}\\s(января|февраля|февр(\\.\\s)?|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября|декабря|дек(\\.\\s)?|янв(\\.\\s)?|нояб(\\.\\s)?)(?:\\s\\d{2,4})?\\b)|(\\b\\d{2,4}(?=\\\\.|\\sгод|\\sгода)\\b)"
table <- table |>
  mutate(Дата = str_extract(Текст, regex5))

table <- table |>
  mutate(Дата = ifelse(Жанр == "Воспоминания", "1995", Дата))|>
  select (Жанр, Автор, Дата, Текст)

table <- table |>
  filter (Жанр == "Письмо")|>
  mutate(Дата = str_replace_all(Дата, c("нояб\\." = "ноября","янв\\." = "января", "дек\\." = "декабря", "февр\\." = "февраля", "(?<=\\d)()(?=\\w)" = " ")))|>
  mutate(Дата = str_replace_all(Дата, c(" января" = ".01.", " февраля" = ".02.", " марта" = ".03.", " апреля" = ".04.", " мая" = ".05.", " июня" = ".06.", " июля" = ".07.", " августа" = ".08.", " сентября" = ".09.", " октября" = ".10.", " ноября" = ".11.", " декабря" = ".12.")))|>
  mutate(Дата = str_replace_all(Дата, c(" (?=\\d)" = "", "/VI-" = ".06.", "/III-" = ".03.", "/V-" = ".05.", "05 I" = "06")))|>
  mutate(Дата = str_replace_all(Дата, c("(?<=\\.)33" = "1933","(?<=\\.)34" = "1934","(?<=\\.)35" = "1935", " " = "")))|>
  mutate(Дата = if_else(row_number() <= 21 & str_detect(Дата, "\\d{2}\\.\\s?$"),
                        paste0(Дата, "1933"),Дата)) |>
  mutate(Дата = if_else(between(row_number(), 22, 65) & str_detect(Дата, "\\d{2}\\.\\s?$"),
                        paste0(Дата, "1934"),Дата)) |>
  mutate(Дата = if_else(between(row_number(), 66, 72) & str_detect(Дата, "\\d{2}\\.\\s?$"),
                        paste0(Дата, "1935"),Дата)) |>
  mutate(Дата = if_else(str_detect(Дата, "^\\d\\.\\d{2}\\.\\d{4}"),
                        paste0("0", Дата),Дата)) 

table$Дата[1] <- "01.07.1933"
table$Дата[2] <- "01.08.1933"
table$Дата[19] <- "05.12.1933"
table$Дата[25] <- "15.01.1934"
table$Дата[27] <- "25.01.1934"
table$Дата[28] <- "01.02.1934"
table$Дата[29] <- "10.02.1934"
table$Дата[31] <- "20.02.1934"
table$Дата[32] <- "10.03.1934"
# при расстановке дат была обнаружена ошибка в определении авторства (мне не удалось понять, чем это было вызвано: код для установлении авторства не предполагал отсутствие в тексте письма подписи и, следовательно, программа должна была выдать NA, то есть я не усталавливала дефолтного значения)
table$Автор[37] <- "А.И. Степанова"
table$Дата[38] <- "15.04.1934"
table$Дата[58] <- "27.08.1934"
table$Дата[62] <- "01.11.1934"
table$Дата[66] <- "15.01.1935"
table$Дата[67] <- "01.02.1935"
table$Дата[72] <- "15.04.1935"

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

table <- table[-c(1,2), ]
head(table)
# A tibble: 6 × 4
  Жанр   Автор          Дата       Текст                                        
  <chr>  <chr>          <chr>      <chr>                                        
1 Письмо Н.Р. Эрдман    03.11.1933 Москва, проезд Художественного театра, Худож…
2 Письмо А.И. Степанова 04.11.1933 4 ноября 1933 года Дорогой, прекрасный, люби…
3 Письмо А.И. Степанова 05.11.1933 5 ноября Дорогой мой, посылка халтурно соста…
4 Письмо Н.Р. Эрдман    06.11.1933 6 ноября 1933 года Большая Мурта. Застрял в …
5 Письмо А.И. Степанова 06.11.1933 6 ноября Николашенька, вчера пришла телеграм…
6 Письмо А.И. Степанова 16.11.1933 16 ноября Хороший, дорогой, любимый, вчера п…

Аннотируем письма при помощи модели Russian SynTagRus и изменим тип данных в столбце “Дата” на “Date”. Это потребуется для визуализации в ggplot2. Также сохраним полные тексты писем для каждого наблюдения. Это нужно для создания интерактивного графика.

udpipe_download_model(language = "russian-syntagrus")
Downloading udpipe model from https://raw.githubusercontent.com/jwijffels/udpipe.models.ud.2.5/master/inst/udpipe-ud-2.5-191206/russian-syntagrus-ud-2.5-191206.udpipe to D:/Desktop/R directory/russian-syntagrus-ud-2.5-191206.udpipe
 - This model has been trained on version 2.5 of data from https://universaldependencies.org
 - The model is distributed under the CC-BY-SA-NC license: https://creativecommons.org/licenses/by-nc-sa/4.0
 - Visit https://github.com/jwijffels/udpipe.models.ud.2.5 for model license details.
 - For a list of all models and their licenses (most models you can download with this package have either a CC-BY-SA or a CC-BY-SA-NC license) read the documentation at ?udpipe_download_model. For building your own models: visit the documentation by typing vignette('udpipe-train', package = 'udpipe')
Downloading finished, model stored at 'D:/Desktop/R directory/russian-syntagrus-ud-2.5-191206.udpipe'
           language
1 russian-syntagrus
                                                     file_model
1 D:/Desktop/R directory/russian-syntagrus-ud-2.5-191206.udpipe
                                                                                                                                       url
1 https://raw.githubusercontent.com/jwijffels/udpipe.models.ud.2.5/master/inst/udpipe-ud-2.5-191206/russian-syntagrus-ud-2.5-191206.udpipe
  download_failed download_message
1           FALSE               OK
syntagrus <- udpipe_load_model(file = "russian-syntagrus-ud-2.5-191206.udpipe")

annotated <- udpipe_annotate(syntagrus, table$Текст, doc_id = paste0(table$Жанр, ",",table$Автор, ",",table$Дата)) |>
          as_tibble() 

temp_table <- tibble(doc_id = paste0(table$Жанр, ",",table$Автор, ",",table$Дата), text = table$Текст)

annotated <- annotated |>
  left_join(temp_table, by = "doc_id") 
Warning in left_join(annotated, temp_table, by = "doc_id"): Detected an unexpected many-to-many relationship between `x` and `y`.
ℹ Row 3068 of `x` matches multiple rows in `y`.
ℹ Row 1 of `y` matches multiple rows in `x`.
ℹ If a many-to-many relationship is expected, set `relationship =
  "many-to-many"` to silence this warning.
annotated <- annotated |>
  select(-paragraph_id) |>
  select(-sentence_id) |>
  separate (doc_id,into = c("Жанр", "Автор", "Дата"), sep = ",") |>
  mutate(Дата = as.Date(Дата, format = "%d.%m.%Y")) |>
  filter (upos != "PUNCT") 
# посчитаем кол-во слов в каждом письме, чтобы потом измерить процентное
# соотношение эмоциональной лексики
counts <- annotated |>
  count(Дата, Автор)

annotated <- annotated |>
  left_join(counts, by = c("Дата", "Автор"))

head(annotated)
# A tibble: 6 × 16
  Жанр   Автор       Дата       sentence  token_id token lemma upos  xpos  feats
  <chr>  <chr>       <date>     <chr>     <chr>    <chr> <chr> <chr> <chr> <chr>
1 Письмо Н.Р. Эрдман 1933-11-03 Москва, … 1        Моск… Моск… PROPN <NA>  Anim…
2 Письмо Н.Р. Эрдман 1933-11-03 Москва, … 3        прое… прое… NOUN  <NA>  Anim…
3 Письмо Н.Р. Эрдман 1933-11-03 Москва, … 4        Худо… худо… ADJ   <NA>  Case…
4 Письмо Н.Р. Эрдман 1933-11-03 Москва, … 5        теат… театр NOUN  <NA>  Anim…
5 Письмо Н.Р. Эрдман 1933-11-03 Москва, … 7        Худо… худо… ADJ   <NA>  Case…
6 Письмо Н.Р. Эрдман 1933-11-03 Москва, … 8        театр театр NOUN  <NA>  Anim…
# ℹ 6 more variables: head_token_id <chr>, dep_rel <chr>, deps <chr>,
#   misc <chr>, text <chr>, n <int>

Анализ эмоциональной тональности

Я решила протестировать сразу два тональных словаря из пакета лексиконов русского языка. Первый - Polarity Table of Translated AFINN Based Lexicon - содержит 7268 оценочных слов, их тональность оценивается по шкале от -5 (крайне негативная) до 5 (в высшей степени положительная). Второй - Polarity Table of Chen and Skiena - построен на основе графа знаний, связывающего слова, которые оцениваются по бинарной шкале (-1/1).

Построим график на основе лексикона AFINN. Замечу, что рассматриваемые письма - тексты разной длины, поэтому для подсчёта их эмоциональной тональности я использую отношение среднего арифметического значений эмоциональной тональности не-нейтральных слов к количеству всех слов в документе.

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

set.seed(0211)
afinn <- hash_sentiment_afinn_ru

emotional_table_1 <- annotated |> 
  inner_join(afinn) |>
  mutate (n = n)
Joining with `by = join_by(token)`
sum_for_letter_1 <- emotional_table_1 |>
  group_by (Дата, Автор)|>
  summarise(sum = sum(score)/n)|>
  left_join(select(emotional_table_1, Дата, Автор, text), by = c("Дата", "Автор")) |>
  unique()
Warning: Returning more (or less) than 1 row per `summarise()` group was deprecated in
dplyr 1.1.0.
ℹ Please use `reframe()` instead.
ℹ When switching from `summarise()` to `reframe()`, remember that `reframe()`
  always returns an ungrouped data frame and adjust accordingly.
`summarise()` has grouped output by 'Дата', 'Автор'. You can override using the
`.groups` argument.
Warning in left_join(summarise(group_by(emotional_table_1, Дата, Автор), : Detected an unexpected many-to-many relationship between `x` and `y`.
ℹ Row 2 of `x` matches multiple rows in `y`.
ℹ Row 2 of `y` matches multiple rows in `x`.
ℹ If a many-to-many relationship is expected, set `relationship =
  "many-to-many"` to silence this warning.
plot1 <- sum_for_letter_1 |>
  ggplot(aes(x = Дата, y = sum, fill = Автор, text = text)) +
  geom_point(aes(color = Автор), size = 0.5, show.legend = FALSE) +
  geom_col(width = 3, position = position_jitterdodge(jitter.width = 0.5))+  
  guides(color = "none")+
  scale_x_date(position = "bottom", date_breaks = "2 months", 
               date_labels = "%B %Y") + 
  labs(title = "Анализ эмоциональной тональности писем: AFINN",
       x = NULL,
       y = NULL,
       fill = "Автор") +
  theme_minimal() + 
  theme(text = element_text(family = "mono", size=13, color = "brown"),
        axis.text = element_text(color = "brown"), 
        axis.text.x = element_text(family = "mono", angle = 60, hjust = 0.9, size = 11),
        title = element_text(family = "mono"),
        plot.title.position = "plot",
        legend.position = c(0.8, 0.8),
        plot.margin = unit(c(1, 1, 0.5, 1), "cm"),
        legend.title = element_blank(),
        legend.text = element_text(size = 10),
        legend.key.size = unit(0.3, "cm")) +
  scale_fill_brewer(palette = "Set1")
Warning: A numeric `legend.position` argument in `theme()` was deprecated in ggplot2
3.5.0.
ℹ Please use the `legend.position.inside` argument of `theme()` instead.
url <- "https://pixy.org/src2/625/6254827.jpg"
plot1_img <- ggbackground(plot1, url)
Warning: `position_jitterdodge()` requires non-overlapping x intervals.
plot1_img

Наблюдения и выводы

Благодаря временной шкале, построенные графики позволяют наблюдать распределение интенсивности переписки с течением времени, а разноцветные шкалы - соотношение писем каждого из авторов (чтобы наблюдать не только эмоционально заряженные тексты, но и нейтральные письма, я добавила точечный график, однако это практически не изменило картину, ведь письма редко безэмоциональны).

Очевидно, что большая часть писем отправлена Эрдманом, чем это объяснить - сохранностью свидетельств или реальной практикой - неясно. Однако, читая письма, я обнаружила, что, например, одно из самых грустных писем писателя - от 6 ноября 1934 г. - сообщает, что ему начинают доходить заплаканные открытки возлюбленной (которых мы не наблюдаем в датасете). Предположу, что в связи с переездами Эрдману не удалось сохранить все пришедшие в Сибирь письма или редактор не счёт возможным опубликовать все сохранившиеся под одной обложкой.

Рассмотрим интенсивность переписки. Можно заметить, что она наиболее активна в промежуток с осени 1933 г. по весну 1934., то есть в первые полгода после ареста и ссылки Эрдмана. Первое затишье наступает в июле 1934, что естественно, так как в этот момент Степанова приезжает к Эрдману в Сибирь. Кроме того, обмен письмами прекращается и в октярбре 1934. Эрдман замечает это, и его ноябрьское письмо полно тревоги. Со временем переписка становится менее интенсивной и заканчивается апрелем 1935, когда, как известно, Степанова перестаёт отвечать на письма Эрдмана.

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

Конечно, наибольшее внимание привлекают “выбросы” - августовские ликующие письма Степановой. Они написаны по пути в Москву черех Красноярск, путь сложный и долгий, в душе тревога из-за предстоящего прибытия, но описания тягот дороги всегда переплетаются с любовными признаниями и ласковыми словами, которые и определяют вектор эмоциональной тональности писем: “Здоров ли ты, радость моя? <…> До свидания, любовь моя, жизнь моя! Будь здоров, любимый, целую тебя”.

С противоположного полюса - негативно окрашенное письмо Эрдмана от февраля 1935. В них писатель ругает фильм “Весёлые ребята”, который к тому моменту вышел на киноэкраны. Эрдман был одним из сценаристов картины, но был арестован во время съёмок, и его имя вырезали из титров. Вот как он отзывается о кино: “Кстати, о картине — такой постыдный и глупый бред. - Неужели нельзя было сделать даже такой пустяковой вещи?” Также в этом письме писатель жалуется на то, что в городе закончились конверты и просит Степанову выслать их из Москвы: “плачусь у парикмахеров, останавливаю на улицах прохожих, изучаю бумажки на столбах — все тщетно”.

Построим график на основе второго лексикона и сравним результаты.

set.seed(0211)
chen_skiena <- hash_sentiment_chen_skiena

emotional_table_2 <- annotated |> 
  inner_join(chen_skiena) |>
  mutate (n=n)
Joining with `by = join_by(token)`
sum_for_letter_2 <- emotional_table_2 |>
  group_by (Дата, Автор)|>
  summarise(sum = mean(score)/n) |>
  left_join(select(emotional_table_1, Дата, Автор, text), by = c("Дата", "Автор"))|>
  unique()
Warning: Returning more (or less) than 1 row per `summarise()` group was deprecated in
dplyr 1.1.0.
ℹ Please use `reframe()` instead.
ℹ When switching from `summarise()` to `reframe()`, remember that `reframe()`
  always returns an ungrouped data frame and adjust accordingly.
`summarise()` has grouped output by 'Дата', 'Автор'. You can override using the
`.groups` argument.
Warning in left_join(summarise(group_by(emotional_table_2, Дата, Автор), : Detected an unexpected many-to-many relationship between `x` and `y`.
ℹ Row 5 of `x` matches multiple rows in `y`.
ℹ Row 1 of `y` matches multiple rows in `x`.
ℹ If a many-to-many relationship is expected, set `relationship =
  "many-to-many"` to silence this warning.
plot2 <- sum_for_letter_2 |>
  ggplot(aes(x = Дата, y = sum, fill = Автор, text = text)) +
  geom_point(aes(color = Автор), size = 0.5, show.legend = FALSE) +
  geom_col(width = 3, show.legend = FALSE, position = position_jitterdodge(jitter.width = 0.3)) +  
  scale_x_date(position = "bottom", date_breaks = "2 months", date_labels = "%B %Y") + 
  labs(title = "Анализ эмоциональной тональности писем: Chen&Skiena",
       x = NULL,
       y = NULL,
       fill = "Автор") +
  theme_minimal() + 
  theme(text = element_text(family = "mono", color = "brown"),
        axis.text = element_text(color = "brown"), 
        axis.text.x = element_text(size = 11, family = "mono", angle = 60, hjust = 0.9),
        title = element_text(family = "mono", size = 12),
        plot.title.position = "plot",
        legend.position = c(0.8, 0.85),
        plot.margin = unit(c(1, 1, 0.7, 1), "cm") )+
  scale_fill_brewer(palette = "Set1")

plot2_img <- ggbackground(plot2, url)
Warning: `position_jitterdodge()` requires non-overlapping x intervals.
plot2_img

График на базе второго лексикона демонстрирует значительно меньшее количество негативно окрашенных писем и в целом тенденцию к нейтрализации. Так, например, грустное письмо Эрдмана от ноября 1934 приобретает нейтральную окраску. Любопытно, что выделяется четыре крайне эмоциональных письма. Самое радостное - шутливое письмо, имитирующее стиль пропагандистских статей о производственных достижениях советских граждан. Процент эмоционально окрашенных слов в нём объясняется тем, что само сообщение очень короткое, приведу текст целиком: “Начальнику Строительства А.О.Степановой. Постройка енисейской электростанции — новый вклад в дело дальнейшего подъема нашей страны и Вашего в моих глазах. ЦК (Целую Коля).” Любопытно, что на первом графике это письмо далеко не самое позитивное. Сравним, какие слова обнаружил каждый из лексиконов. AFINN выделяет только “новый”, а Chenn&Skiena добавляют к этому списку “вклад” и “подъём”. Отличия между графиками объяснимы: шкала последнего лексикона бинарная, потому должна значительно проигрывать пятибалльной шкале первого словаря по точности оценки эмоции, но, вместе с тем, длина лексикона Chenn&Skiena больше, что позволяет этому словарю распознавать больше эмоционально окрашенных слов.

Технические неудачи

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

interactive_1 <- ggplotly(plot1, tooltip = "text", style = list(showlegend = FALSE))
Warning: `position_jitterdodge()` requires non-overlapping x intervals.
interactive_1
interactive_2 <- ggplotly(plot2, tooltip = "text", style = list(showlegend = FALSE))
Warning: `position_jitterdodge()` requires non-overlapping x intervals.
interactive_2

Общее впечатление от работы с тональными словарями

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

Тем не менее, при более пристальном рассмотрении слов, которые были обнаружены в результате сравнения лемматизированных писем и лексиконов, становится ясно следующее. Во-первых, далеко не все эмоционально окрашенные слова попадают в итоговые результаты. Например, возьмём самое негативное письмо Степановой (согласно первому лексикону) от 11 апреля 1934 года. Примедём его текст:

Сегодня пришло твое письмо, конверт был таким грязным и пятнистым, что сразу стало понятно, какой трудный путь он проделал. Бедный мой Николашенька, что за насмешка судьбы: эта преследующая тебя стайка детей. Разделявшая ранее твои детоненавистнические взгляды Елка сильно изменилась и несколько раз намекала мне на то, что неплохо бы мне родить нового Пинчика. Радость моя, я счастлива, что твоя работа продвигается, что ты бываешь собой доволен, мечтаю о дне, когда услышу ее. Вчера была в Мюзик-холле, зрелище довольно печальное, скучное и безвкусное. Мне даже стало жаль Мартинсона, эдак он скоро совсем погибнет. Сегодня вечером «Булычев», и нас смотрит Горький. Завтра опишу результаты его посещения. Не забывай свою длинноногую барышню, она ждет и даже ревнует на всякий случай! Обнимаю. Лина.

Что можно заметить? Лексикон выделил только “понятно”, “трудный”, “довольно”, “жаль”.

При этом текст содержит и более “заметные” слова: “грязный”, “бедный”, “насмешка”, “детоненавистнический”, “неплохо”, “радость”, “счастлив”, “продвигаться”, “печальный”, “скучный”, “безвкусный”, “погубнуть”. И, наконец, абстрагируясь от частностей, трудно назвать это письма печальным, наоборот, оно оставляет игривое послевкусие.

Второй лексикон ведёт себя не менее странно и не остаётся равнодушным к слову “телеграмма”, присуждая ему негативную тональность. Этот недостаток словарей предсказуем, так как они не полностью размечены вручную. Поэтому задача исследователя при анализе результатов - оценить вероятность ошибки и величину погрешности, проверив часть массива вручную. Оговорюсь, что описанные недостатки не умаляют потенциала рассмотренного метода. Также считаю справедливым уточнить, что я не принимала во внимание отрицания, учёт которых может значительно скорректировать полученные данные, ведь отрацательные местоимения и частицы, а также некоторые наречия, меняют “полюс” оценочной лексики в тексте.

Таким образом, работа с этим материалом не окончена и требует большой кропотливости, находчивости и компетентности. И хотя мне удалось ответить не на все возникшие вопросы, остаётся ясным одно: трогательные письма Эрдмана и Степановой привлекают не только запечатлённой в них романтической историей, но и теми трудносями и возможностями, с которыми встречается цифровой гуманитарий при работе с ними.

Наследние Н.Р. Эрдмана сегодня

На выбор материала меня вдохновило совершенно незапланированное посещение постановки “Кто автор этого безобразия?” театра “Эрмитаж”.

Фрагмент спектакля “Кто автор этого безобразия?”, Театр “Эрмитаж”

Надо признаться, до тех пор я ничего не слышала о Н.Р. Эрдмане и не сочла нужным прочитать об авторе перед началом пьесы, поэтому по окончании спектакля мои мысли не покидал лишь один вопрос: “Кто автор этого..?” :)

Это острый, никого не щадящий, шершавый до глянцевости и лакированный до прорех спектакль, созданный из писем, басен и фрагментов пьес драматурга. Неудобная, нелепая и смелая - такой, мне казалось, уже не будет ни одна столичная постановка. К счастью, я ошибалась. Спектакль “Кто автор этого безобразия?” вернул к жизни то, что давно было списано со счетов за давностью лет, и сделал это честно. Рекомендую эту постановку к посещению и надеюсь услышать Ваши впечатления!

References

Вульф, Виталий. 2000. “Письма: Николай Эрдман. Ангелина Степанова, 1928-1935 Гг.”