Авторство “Тихого Дона”

Автор

Екатерина Егоренкова

Дата публикации

21.02.2025

Исследование Бориса Орехова и Натальи Великановой подтвердило, что именно Михаил Шолохов автор знаменитого романа-эпопеи “Тихий Дон”. Попробуем пройти часть пути этого исследования и построим деревья на основе датасета «Стилеметрические данные “Тихого Дона” и современной ему прозы».

Загружаем и транспонируем данные.

library(stylo)

data <- read.table("table_with_frequencies.txt", quote="\"", comment.char="")

transposed_data <- t(data)

transposed_data <- as.data.frame(transposed_data)

Строим дерево

par(mar = c(2, 2, 2, 2))

bct_result <- stylo(gui = FALSE, 
                    frequencies = transposed_data,
                    analysis.type = "BCT",
                    mfw.min = 100,
                    mfw.max = 500,
                    mfw.incr = 100,
                    distance.measure = "wurzburg",
                    write.png.file = FALSE,
                    consensus.strength = 0.5,
                    plot.custom.width = 10, 
                    plot.custom.height = 1
)

Получившееся дерево отлично иллюстрирует близость “Тихого Дона” к другим произведениям Шолохова, ни один другой автор не раположен так близко. Можно заметить, что 4 часть “Тихого Дона” оказалась в отдельном кластере вместе с другими произведениями Шолохова, а “Донские Рассказы”, наоборот, близки к первым 3-м частям “Тихого Дона”.

Построим 12 филогенетических деревьев (число выбрано по количеству предполагаемых авторов) и используем метод простого большиснтва. Отдельное внимание уделим уникальной окраске для каждого автора.

library(ape)

get_tree <- function(df) {
  X <- df[ , sample(3000, replace = F, size = 100)]
  distmx <- dist(scale(X))
  tr <- as.phylo(hclust(distmx))
  tr
}

library(purrr)
set.seed(123)

trees_result <- map(1:12, ~get_tree(transposed_data))

library(tidyverse)
library(RColorBrewer)

authors_df <- transposed_data |> 
  mutate(author = str_extract(rownames(transposed_data), "^[^_]+"))

# Уникальные цвета для каждого автора
set.seed(124)
author_colors <- brewer.pal(length(unique(authors_df$author)), "Paired")

authors_df <- authors_df |> 
  mutate(color = author_colors[as.factor(author)])

authors_df <- authors_df |> 
  select(author, color)

authors_names <- rownames(transposed_data)

color_map <- setNames(authors_df$color, authors_df$author) # Соответствие цветов

tip_colors <- map_chr(authors_names, ~ color_map[str_extract(.x, "^[^_]+")])

cons <- consensus(trees_result, p = 0.5, rooted = FALSE)

par(mar = c(1,1,1,1))
plot.phylo(cons, 
           type = "phylogram", 
           use.edge.length = FALSE,
           edge.width = 1.5, 
           node.color = "grey30",
           font = 2, 
           no.margin = TRUE, 
           label.offset = 0.8,
           direction = "rightwards", 
           plot = TRUE, 
           lab4ut = "a",
           node.depth = 1, 
           tip.color = tip_colors)  # Применяем цвета для листьев

nodelabels(text=sprintf("%.2f", cons$node.label),
           node=1:cons$Nnode+Ntip(cons),
           frame="circle",
           bg = "#E0FFFF",
           cex = 0.5)

Окарска по авторам должна быть автоматической, чтобы не перечислять цвета вручную, используем палитру Paired. Ее главный минус в том, что желтый цвет слишком светлый и надпись “Фурманов Чапаев” сложно прочитать, но в других стандартных палитрах количество цветов меньше, чем авторов, поэтому оставляем эту.
К сожалению, на основе этого дерева невозможно сделать каких-либо выводов относительно авторства “Тихого Дона”.

Более интересные результаты может дать изменение количества деревьев, например, для 15 деревьев все части “Тихого Дона” образуют самостоятельный, ни с кем не связанный кластер, причины появления которого вызывают интерес, но здесь будем рассматривать только вариант с 12 деревьями.

Построим консенсусную сеть.

# вычисляем консенсус
library(TreeTools)
library(phangorn)

mph <- as.multiPhylo(trees_result)

cons.nw <- consensusNet(mph, prob = 0.3, rooted = FALSE)

cons.nw$col <- str_extract(cons.nw$tip.label, "^[^_]+")

color_group <- tibble(label = unique(cons.nw$col)) %>%
  left_join(authors_df, by = c("label" = "author"))

cons.nw$col <- color_group$color[match(cons.nw$col, color_group$label)]

# Рисуем
set.seed(125)
par(mar = c(0, 0, 0, 0))
plot(cons.nw, type = "2D", 
     direction = "axial",
     tip.color = cons.nw$col,
     edge.color = "grey30",
     edge.width = 1,
     label.offset = 0.2,
     cex = 0.8,           
     no.margin = TRUE,
     font = 3, 
     lab4ut = "a")

Части “Тихого Дона” оказываются связанными между собой, и единственный связанный с ними автор - Михаил Шолохов. Отметим, что все остальные произведения Шолохова образовали отдельную ветвь, и только “Донские рассказы” свзяны с “Тихим Доном”, в связи с этим было бы интересно отдельно рассмотерть это произведение отдельно.

Подводя итоги, построив деревья и проанализировав консенсусную сеть, можно с уверенностью сказать, что Михаил Шолохов является автором “Тихого Дона”.