url <- "https://github.com/locusclassicus/text_analysis_2024/raw/refs/heads/main/files/table_with_frequencies.txt"
tab <- read.table(url, header = TRUE, check.names = FALSE)
freqs <- as.matrix(tab[,-1])
X <- t(freqs)
vars <- apply(X, 2, var, na.rm = TRUE)
top_n <- min(100, ncol(X))
sel_words <- names(sort(vars, decreasing = TRUE))[1:top_n]
X_sel <- as.matrix(X[, sel_words, drop = FALSE])
X_log <- log1p(X_sel)
dist_mat <- dist(X_log, method = "euclidean")
hc <- hclust(dist_mat, method = "ward.D2")
library(ggplot2)
library(ggdendro)
dend_data <- dendro_data(hc, type = "rectangle")
offset <- 0.1
ggplot() +
geom_segment(
data = segment(dend_data),
aes(x = -y, y = x, xend = -yend, yend = xend),
color = "#1f4e79", linewidth = 0.4
)+
geom_text(
data = label(dend_data),
aes(x = -y - 0.9, y = x, label = label),
hjust = 0,
size = 3.5,
family = "sans",
color = "#222222"
) +
scale_x_continuous(
name = "Расстояние",
breaks = function(z) -pretty(-z),
labels = function(z) abs(z)
) +
labs(
y = NULL,
title = "Стилометрическое дерево текстов",
subtitle = "100 наиболее вариативных слов, метод Ward. "
) +
theme_minimal(base_size = 12) +
theme(
panel.grid = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
plot.title = element_text(face = "bold", size = 14),
plot.subtitle = element_text(size = 10, color = "#555555"),
plot.margin = margin(10, 20, 10, 20)
)
library(ape)
set.seed(123)
get_tree <- function(X, mfw = 200) {
mfw <- min(mfw, ncol(X_log)) # не больше, чем есть столбцов
cols <- sample(ncol(X_log), size = mfw, replace = FALSE)
d <- dist(X_log[ , cols], method = "euclidean")
as.phylo(hclust(d, method = "ward.D2"))
}
trees_list <- lapply(1:50, function(i) get_tree(X_log, mfw = 200))
cons_tr <- consensus(trees_list, p = 0.5, rooted = FALSE)
par(mar = c(1, 1, 1, 1))
plot.phylo(
cons_tr,
type = "unrooted",
cex = 0.5,
font = 2,
no.margin = TRUE
)
title("Консенсусное дерево по корпусу «Тихого Дона» и современной прозы", cex.main = 0.9)
На дендрограмме видно, что тексты каждого автора образуют довольно компактные группы, что указывает на наличие устойчивых стилометрических особенностей, отличающих авторов друг от друга. Внутри кластера Шолохова фрагменты «Тихого Дона» оказываются ближе друг к другу, чем к текстам других писателей, что подтверждает относительное единство авторского стиля в пределах одного произведения.
При этом часть произведений других авторов тяготеет к «шолоховскому» кластеру или, наоборот, оказывается удалённой от собственной группы, что может быть связано с жанром, повествовательной перспективой или тематическим сдвигом конкретного текста. Консенсусное дерево сглаживает влияние случайного выбора набора слов и показывает только те связи, которые воспроизводятся в большинстве отдельных деревьев, поэтому получившаяся структура отражает не разовые флуктуации, а более стабильные стилометрические отношения между текстами.
Я пытался сделать так, чтобы лучи дендрограммы не перекрывали текст,а на консенсусном дереве все выглядело презентабельнее, но все безуспешно