Определение авторства: Тихий дон

Домашнее задание № 14

Автор

Елизавета Копылова

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

20.02.2025

Аннотация
В этом домашнем задании используется датасет «Стилеметрические данные “Тихого Дона” и современной ему прозы», подготовленный Б.В. Ореховым. Этот датасет содержит частотные слова из ряда произведений, в числе которых “Тихий Дон” и различные рассказы Шолохова.

Предобработка данных

Установим все необходимые для работы библиотеки и палитру для графика:

library(stylo)
library(paletteer)
pal <- paletteer_c("scico::berlin", n=12)
library(ape)
library(purrr)
library(tidyverse)

Скачаем данные и приведём к нужному формату (транспонируем таблицу)

freq_data <- read.table("table_with_frequencies.txt", sep=" ",header=T) |> 
  t() |> 
  data.frame()

Консенсусное дерево: stylo

bct_result <- stylo(gui = FALSE, 
                    frequencies = freq_data,
                    analysis.type = "BCT",
                    mfw.min = 100,
                    mfw.max = 500,
                    mfw.incr = 100,
                    distance.measure = "wurzburg",
                    write.png.file = TRUE,
                    consensus.strength = 0.5,
                    custom.graph.title = "Тихий дон: кто автор?",
                    plot.custom.width = 10, 
                    plot.custom.height = 10
)

stylo

По этому графику мы можем заметить, что рассказы Шолохова похожи по авторскому сигналу на Тихий дон, так как они смешались.

Консенсусное дерево: purrr + ape

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

set.seed(1902)

trees_result <- map(1:5, ~get_tree(freq_data))
cons <- consensus(trees_result, p = 0.5, rooted = TRUE)

cols <- tibble(author = str_remove(cons$tip.label, "_.+")) |> 
  mutate(color = case_when(author == "Булгаков"  ~ pal[6],
                           author == "Шолохов" ~ pal[11],
                           author == "Фурманов"  ~ pal[3],
                           author == "Фадеев" ~ pal[4],
                           author == "Иванов"  ~ pal[5],
                           author == "Крюков" ~ pal[1],
                           author == "Леонов"  ~ pal[7],
                           author == "Островский" ~ pal[8],
                           author == "Платонов"  ~ pal[9],
                           author == "Севский" ~ pal[10],
                           author == "Серафимович"  ~ pal[2],
                           author == "Dubia" ~ pal[12])
         )


par(mar = c(5,5,5,5))
plot.phylo(cons, 
           type = "phylogram", 
           use.edge.length = TRUE,
           edge.width = 1.5, 
           node.color = "grey30",
           font = 2, 
           no.margin = TRUE, 
           label.offset = 0.1,
           direction = "rightwards", 
           plot = TRUE, 
           lab4ut = "a",
           node.depth = 1, 
           tip.color = cols$color)

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

На этом графике уже нет каких-то чётких свидетельств в пользу авторства Шолохова!