Консенсусная сеть для стилеметрического анализа «Тихого Дона» и современной ему прозы

Author

Ekaterina Kulyatina

В данном гайде рассматривается способ построения консенсусной сети для стилеметрического анализа «Тихого Дона» и современной ему прозы (на основе данных, подготовленных Б. В. Ореховым).

Загрузка библиотек

library(tidyverse)
library(tidytext)
library(purrr)
library(stylo)
library(ggraph)
library(igraph)

Получение узлов и ребер для будущей консенсусной сети

С помощью stylo и network = True получим две .csv таблицы с информаией об узлах и ребрах сети, которую мы планируем построить.

Количеству соседей присваиваем значение 2. Это в дальнейшем сделает наш график более читаемым.

Ниже вывод дендрограммы намеренно скрыт через параметры блока кода.

tbl <- read.table("table_with_frequencies.txt", sep = " ", header = TRUE) %>% 
  t()


stylo(network = TRUE, 
      frequencies = tbl, 
      network.type="undirected",
      network.tables="both",
      linked.neighbors=2,
      edge.weights="linear",
      gui=FALSE)

Переходим к мясу

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

my_csv <- list.files(pattern = "csv")
tbl_edges <- read_csv(my_csv[1])
tbl_nodes <- read_csv(my_csv[2])

net_data <- tbl_edges |> 
  left_join(tbl_nodes, 
            by = join_by(Source == Id)) |> 
  select(-Source) |> 
  rename(Source = Label) |> 
  relocate(Source, .before = Target) |> 
  left_join(tbl_nodes, 
            by = join_by(Target == Id)) |> 
  select(-Target) |> 
  rename(Target = Label) |> 
  relocate(Target, .after = Source) |> 
  select(Source, Target, Weight)

tbl_graph <- graph_from_data_frame(net_data, directed = FALSE)

weights <- (E(tbl_graph)$Weight - min(E(tbl_graph)$Weight)) / (max(E(tbl_graph)$Weight) - min(E(tbl_graph)$Weight))
E(tbl_graph)$Weight <- weights

labels = str_remove(V(tbl_graph)$name, "_.+$")
V(tbl_graph)$label <- labels

А теперь десерт

Наконец мы можем строить сеть!

ggraph(tbl_graph, layout = "stress") +
  geom_edge_link(aes(alpha = Weight), 
                 linewidth = 1.1,
                 show.legend = T, 
                 color = "grey70") +
  geom_node_point(aes(color = label),
                  size = 3, shape = 21, 
                  fill = "white", 
                  show.legend = T) +
  geom_node_label(aes(label = name, color = label), 
                  size = 3,
                  vjust = -1, cex = 2,
                  show.legend = F) +
  labs(x = NULL, y = NULL) + 
  labs(title = "Консенсусная сеть",
       subtitle = "Связи между текстами на основе частотности слов",
       color = "Author",
    alpha = "Вес связи") +
  theme_void() + 
  theme(
      plot.title = element_text(hjust = 0.5, size = 30, face = "bold"),
      plot.subtitle = element_text(hjust = 0.5, size = 20, color = "gray30"),
      aspect.ratio = 0.5,
      text = element_text(size = 12),
      legend.position = "bottom",
      legend.direction = "horizontal",
    legend.box = "vertical",
    legend.margin = margin(10, 10, 10, 10),
    legend.text = element_text(size = 14),
    legend.title = element_text(size = 16)
  )

Выделю изменения в параметрах ggraph, которые я внесла:

  1. Параметру layout присвоено значение stress. В документации указано, что он быстрее, качественне и стабильнее алгоритма Камада-Каваи.

  2. Добавлены заголовок и подзаголовок, увеличен текст лейблов, добавлена легенда для лучшей читаемости графика.

  3. Так же еще на этапе построения таблиц с узлами и ребрами я указала linked.neighbors = 2, что тоже повлияло на красоту и читаемость сети.

Анализ графика и размышления

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

Мы видим достаточно обособленный «Шолоховский кластер», состоящий из произведений «Судьба человека», «Они сражались за родину» и обеих частей «Поднятой целины». «Тихий дон-4» расположен к этим произведениям ближе остальных томов, вероятно, из-за более позднего времени написания (тома 1–3 написаны с 1925 по 1932 год, том 4 написан в 1932 году, а опубликован аж в 1937–1940 годах).

От этого кластера отделились «Донские рассказы» (предположительно из-за того, что это более раняя проза Шолохова), однако их разделил подкластер «Тихого дона» (1-3), что дает нам возможность сделать вывод о стилистической близости всех этих произведений и высокой вероятности одного авторства.

Рядом с подсетью «Тихого дона» также расположились подсети Островского и Иванова, но связи с ними находятся в диапазоне 0.25–0.50и соединяются только с «Тихим доном-2», поэтому сделать заключение о не-Шолоховском авторстве всего произведения мы не можем. Вероятно, второй том по какому-то другому параметру близок к «Как закалялась сталь», «Голубым пескам» и «Бронепоезду 14-69».


Таким образом, на основе анализа построенной консенсусной сети мы можем сделать вывод, что «Тихий дон» наш! То есть Шолохова.