library(tm)
library(udpipe)
library(tidytext)
library(irlba)
library(tidyverse)
library(rvest)
library(widyr)
library(word2vec)
library(googledrive)
library(RColorBrewer)
library(factoextra)
library(Rtsne)
Хроники Нарнии
Вдохновением для этого исследования стала волшебная встреча Люси Певенси и Тамнуса у фонарного столба в мире Нарнии. В сумраке зимнего леса, в свете фонарного столба, Люси впервые встречает доброго фавна, который приглашает её в незнакомый, загадочный мир. Приближающийся новый год, с его атмосферой ожидания чуда, идеально гармонирует с этим мотивом.
В этом маленьком исследовании через слова и темы раскрываются некоторые сюжетные линии, характеры главных героев и описания локаций.
Подготовка текста
Сбор текста книг
Собираем материалы с сайта с помощью парсинга, который позволяет нам последовательно обходить страницы каждой книги, извлекая из них текст и объединяя его в один файл. Особое внимание уделяем первой книге серии, так как для нее на сайте предусмотрены другие структуры элементов. Удалим лишние слова в заголовках и кавычки-елочки из текста.
<- function(book_url) {
parse_book <- 1
page_number <- list()
book_text <- NULL # Для проверки повторения заголовка, иначе бесконечный парсинг
previous_title
message("Обработка книги: ", book_url)
repeat {
<- ifelse(page_number == 1, book_url, paste0(book_url, page_number, "/"))
current_url message("Обработка страницы: ", current_url)
<- tryCatch(read_html(current_url), error = function(e) NULL)
current_page if (is.null(current_page)) {
message("Ошибка, идем дальше")
break
}
<- current_page |> # Получаем заголовок страницы для определения повтора
current_title html_element("h2") |>
html_text(trim = TRUE)
if (!is.null(previous_title) && current_title == previous_title) {
message("Повтор заголовка.")
break
}
<- current_title
previous_title
<- current_page |>
current_text_elements html_elements(".poem-text p")
<- current_text_elements |>
current_text html_text(trim = TRUE) |>
paste(collapse = " ")
<- append(book_text, current_text)
book_text
<- page_number + 1
page_number
}
<- paste(book_text, collapse = " ")
full_text
<- tryCatch({
book_title read_html(book_url) |>
html_element(".entry-title") |>
html_text(trim = TRUE) |>
str_remove("^Клайв Льюис — ") # Убираем "Клайв Льюис —" из названия
error = function(e) {
}, message("Неправильный селектор заголовка для URL: ", book_url)
return(NA)
})
message("Книга завершена: ", book_title)
tibble(author = "Клайв Льюис", title = book_title, text = full_text)
}
<- "https://skazki.rustih.ru/avtorskie-skazki/klajv-lyuis-xroniki-narnii"
base_url <- read_html(base_url)
main_page
<- main_page |>
book_links html_elements(".entry-title a") |>
html_attr("href") |>
-1] # Исключаем первую ссылку
.[
<- map_dfr(book_links, parse_book)
books_narnia
save(books_narnia, file = "book_narnia.RData")
#### Парсим первую книгу
<- function(url) {
parse_page message("Обработка страницы: ", url)
# Пробуем загрузить страницу
<- tryCatch(read_html(url), error = function(e) NULL)
current_page if (is.null(current_page)) {
message("Ошибка: ", url)
return(NULL)
}
<- current_page |>
current_text_elements html_elements(".poem-text p")
<- current_text_elements |>
current_text html_text(trim = TRUE) |>
paste(collapse = " ") # Объединяем абзацы в один текст
return(current_text)
}
<- function(base_url) {
parse_first_book <- list()
book_text
for (i in 1:16) { # Проходим по страницам с 1 по 16
<- if (i == 1) {
current_url
base_urlelse {
} paste0(base_url, i, "/")
}<- parse_page(current_url)
page_text
}
<- paste(book_text, collapse = " ")
full_text
<- tryCatch({
book_title read_html(base_url) |>
html_element(".entry-title") |>
html_text(trim = TRUE) |>
str_remove("^Клайв Льюис — ")
error = function(e) {
}, message("Не удалось получить заголовок книги для URL: ", base_url)
return(NA)
})
tibble(author = "Клайв Льюис", title = book_title, text = full_text)
}
<- "https://skazki.rustih.ru/klajv-lyuis-plemyannik-charodeya-kniga-1/"
first_book_url
<- parse_first_book(first_book_url)
first_book
<- bind_rows(first_book, books_narnia) # Объединяем первую книгу с остальными
books_narnia
<- books_narnia |>
books_narnia mutate(title = str_remove(title, ": Сказка"))
<- books_narnia |>
books_narnia mutate(text = str_remove_all(text, "[«»]"))
save(books_narnia, file = "book_narnia.RData")
write.csv(books_narnia, "books_narnia.csv", row.names = FALSE)
# Ссылка на файл
<- "https://drive.google.com/uc?export=download&id=1poYoaFM4nENf1D_fa2DsczbgSwZuO-vN"
file_url
# Загрузка данных
<- read_csv(file_url)
books_narnia
<- books_narnia |>
books_narnia_1 mutate(text = paste0(str_sub(text, 1, 100), "..."))
books_narnia_1
Деление текста на отрывки
Текст разделяем на небольшие отрывки по 200 слов. Разбиение текста на меньшие части позволяет нам сосредоточиться на более четких контекстах и избавляет от возможных перегрузок информацией.
<- books_narnia |>
books_narnia_chunks select(text)
<- function(text, chunk_size = 200) {
split_text <- unlist(str_split(text, "\\s+"))
words <- split(words, ceiling(seq_along(words) / chunk_size))
chunks lapply(chunks, paste, collapse = " ")
}
<- books_narnia |>
chunks_list mutate(chunks = lapply(text, split_text)) |>
unnest(chunks) # Разворачиваем список в таблицу
<- chunks_list |>
books_narnia_chunks mutate(id = row_number()) |>
select(id, chunks)
colnames(books_narnia_chunks) <- c("id", "text")
Токенизация и лемматизация
В первую очередь, мы разделяем текст на отдельные единицы - токены. Затем лемматизация - процесс преобразования слов в их начальную форму. Это позволяет устранить вариации слов, такие как падежи, времена и другие грамматические изменения, сводя все формы к единому представлению. Лемматизация способствует тому, чтобы мы могли работать с основными значениями слов, не учитывая их грамматические особенности. Для этой задачи используется предобученная модель, которая анализирует текст и предоставляет информацию о каждой лексической единице.
# Токенизация
<- books_narnia_chunks |>
books_narnia_chunks mutate(text = sapply(text, clean_text, stopwords_list = all_stopwords))
<- books_narnia_chunks |>
tokenized_data unnest_tokens(word, text, drop = FALSE)
# Лемматизация
<- udpipe_load_model("russian-syntagrus-ud-2.5-191206.udpipe")
model
<- books_narnia_chunks |>
annotated_data rowwise() |>
mutate(lemma_data = list(as.data.frame(udpipe_annotate(model, x = text)))) |>
unnest(lemma_data)
Очистка текста
Удаляем шумные элементы, такие как знаки препинания и стоп-слова, такие как “это”, “самый”, “что-то”.
<- stopwords("ru")
stopwords_ru_tm
<- c("это", "очень", "который", "самый", "свой", "какой-то", "что-то")
stopwords
<- unique(c(stopwords_ru_tm, stopwords))
all_stopwords
<- annotated_data |>
annotated_data filter(upos != "PUNCT") |>
filter(!lemma %in% all_stopwords)
Наиболее частотные слова
Посмотрим на частотность использования слов в тексте “Хроник Нарнии”.
<- "1Fxwe1M3GbsJH1yu_VlJ8ruREhHxpQiCr"
file_id
# Загружаем файл с Google Drive в локальный файл
drive_download(as_id(file_id), path = "annotated_data_narnia_.csv", overwrite = TRUE)
<- read_csv("annotated_data_narnia_.csv")
annotated_data
|>
annotated_data group_by(token) |>
summarise(n = n()) |>
arrange(-n)
Ожидаемо, наиболее частотными оказываются имена главных героев книг. С большим отрывом по частоте упоминается Люси - центральный персонаж многих книг.
Наиболее значимые слова TF-IDF
Применяем метод TF-IDF (Term Frequency-Inverse Document Frequency), чтобы определить наиболее значимые слова в текстах. Этот подход позволяет выявить слова, которые часто встречаются в отдельных документах, но реже появляются в корпусе в целом.
Удаляем имена персонажей и общие слова, чтобы сфокусироваться на содержательных терминах, имеющих важное значение для анализа текста. Затем рассчитываем вес TF-IDF для каждого токена, чтобы выделить ключевые слова.
<- annotated_data |>
no_names_data filter(!token %in% c("люси", "полли", "аслан", "аслана", "джадис", "джил", "дигори", "каспиан", "мираз", "питер", "сьюзен", "шаста", "эдмунд", "эдмунд.", "юстас", "юстас.", "юстэс", "хитр", "хитр.", "льюис", "льюиса", "клайв", "лопух", "конь.", "четверти", "нарнии", "пока", "снова", "'вспыльчива"))
<- no_names_data |>
data_counts count(token, id)
<- data_counts |>
data_tf_idf bind_tf_idf(token, id, n) |>
arrange(tf_idf) |>
select(-n, -tf, -idf)
|>
data_tf_idf slice_max(tf_idf, n = 20) |>
ggplot(aes(x = reorder(token, tf_idf), y = tf_idf)) +
geom_col(fill = "#78C2AD") +
coord_flip() +
labs(
title = "Топ-20 токенов по tf-idf",
x = "Токены",
y = "TF-IDF"
+
) theme_minimal()
Эмоциональная окраска: Слова, такие как “горе”, “невыносимо”, и “умрем”, акцентируют внимание на трагедиях и испытаниях, через которые проходят герои.
Описания персонажей и ситуаций: Термины “вспыльчива”, “даме”, “потрясающая”, и “женщина” выделяют черты персонажей и обстановку, окружающую их.
Исторические и нарративные элементы: “Истории”, “некогда”, и “лондону” отсылают к повествованию, связывая сюжет с более широкой исторической и географической перспективой.
Символизм и предзнаменования: Слово “знамение” намекает на предстоящие события, раскрывающиеся в тексте.
Энергия действия: “Веселиться” и “возил”, добавляют динамики, передавая живость описаний и движений.
Таким образом, результаты TF-IDF анализа не только выделяют ключевые слова текста, но и помогают понять, как автор передает эмоции, описания и смысловые акценты.
Тематическое моделирование
Производим тематическое моделирование текста, чтобы выявить ключевые темы, которые лежат в основе повествования “Хроник Нарнии”. Для анализа используем метод сингулярного разложения матриц (SVD), применяемый к матрице с использованием TF-IDF. Этот подход позволяет преобразовать текстовые данные в компактное представление, где каждая тема соответствует отдельному измерению. Хотелось бы обнаружить скрытые смысловые связи между словами и группами персонажей, которые отражают основные мотивы и сюжетные линии произведения.
Тематическое моделирование провоеденно на основе TF-IDF, а не PMI, так как целью является выявление тем и их ключевых слов, а не описание семантических связей между словами.
<- data_tf_idf |>
dtm cast_sparse(token, id, tf_idf)
<- irlba::irlba(dtm, 50)
lsa_space
rownames(lsa_space$u) <- rownames(dtm)
colnames(lsa_space$u) <- paste0("dim", 1:50)
<- lsa_space$u |>
word_emb as.data.frame() |>
rownames_to_column("word") |>
as_tibble()
<- word_emb |>
word_emb_long pivot_longer(-word, names_to = "dimension", values_to = "value") |>
mutate(dimension = as.numeric(str_remove(dimension, "dim")))
|>
word_emb_long filter(dimension %in% c(1, 7, 3, 8, 12, 16, 46, 35, 27)) |>
group_by(dimension) |>
top_n(10, abs(value)) |>
ungroup() |>
mutate(word = reorder_within(word, value, dimension)) |>
ggplot(aes(word, value, fill = dimension)) +
geom_col(alpha = 0.8, show.legend = FALSE) +
facet_wrap(~dimension, scales = "free_y", ncol = 3) +
scale_x_reordered() +
coord_flip() +
labs(
x = NULL,
y = "Value",
title = "Тематическое моделирование",
subtitle = "Топ-10 слов"
+
) scale_fill_viridis_c()
Тема 1: Единство и героизм
Эта тема объединяет центральных персонажей “Хроник Нарнии”. Тема подчёркивает важность командной работы, где каждый герой вносит свою лепту в борьбу за справедливость, отражая глубину их внутреннего роста и стремление к гармонии.
Тема 3: Приключение Шасты и Аравиты
Вторая тема погружает нас в мир “Коня и его мальчика”, выделяя ключевых персонажей: Шасту, Аравиту и их верных спутников - лошадей Игого и Уинни. Их путешествие через пустыню и королевства отражает историю дружбы, упорства и взросления, где каждая преграда становится уроком на пути к истинной свободе.
Тема 7: Жизнь в Нарнии
Эта тема акцентирует внимание на повседневной жизни и ярких персонажах Нарнии, таких как мистер Бобр и миссис Бобрих, а также король Каспиан. Их взаимодействие с величественными фигурами подчёркивает богатство мира Нарнии, где смирение соседствует с королевским величием.
Тема 8: Судьба и семья
Тема выделяет Аравиту, её отца и Шасту, добавляя контекст семейных и социальных взаимоотношений. Здесь же упоминаются ее подруга Лазорилина и конь. Аслан может отсылать к идеям предопределённости и принятия своего предназначения персонажами.
Тема 12: Морские приключения
Эта тема охватывает морскую эпопею из “Плавания на ‘Рассветном путнике’”, где Каспиан, Дриниан, Рипичип и Юстэс бороздят океан в поисках приключений. Морские путешествия отражают поиск внутреннего “я”, испытания на стойкость и веру, делая корабль символом преображения героев.
Тема 16: Волшебное пробуждение
Тема возвращает нас к первым страницам “Льва, колдуньи и платяного шкафа”, акцентируя встречу Люси с фавном Тамнусом. Мистер Бобр и миссис Бобриха, как и Аслан, воплощают доброту и поддержку, которые Люси получает на своём пути.
Тема 27: Зло и искушение
Эта тема связана с противниками Нарнии: Ташем, колдуньей Джадис. Полли и знамения напоминают о роли героев в борьбе с тьмой. Темы власти, соблазна и борьбы с собственными слабостями оживают через этих персонажей, подчёркивая главные вызовы в “Хрониках Нарнии”.
Тема 35: Принятие себя
Тема посвящена внутренним конфликтам и борьбе героев за принятие себя. Шаста, Корин и Кор сталкиваются с трудностями, связанными с их происхождением и судьбой.
Тема 46: Чудесное спасение
Эта тема переносит нас в волшебный мир книги “Племянник чародея”, где Полли и Дигори становятся центральными фигурами. В конце этой истории волшебное яблоко спасает больную тётю Дигори и напоминает читателю о важности веры в чудо и добро.
Эти темы не только раскрывают сюжет, но и связывают с универсальными ценностями: борьбой за добро, поиском себя и значением семьи и дружбы.
Неожиданные пары слов PMI
Расчет PMI (Pointwise Mutual Information) измеряет силу связи между двумя словами, встречающимися в заданном контексте. Разбиваем текст на окна размером 10 слов, чтобы учитывать ограниченные контекстные фрагменты. Затем мы вычисляем PMI, оценивая, насколько часто два слова встречаются вместе по сравнению с их независимой встречаемостью. Дополнительно используем PPMI (Positive PMI), обнуляя отрицательные значения для фокусировки на положительных связях. Этот метод помогает выявить необычные или значимые сочетания слов, которые могут раскрыть дополнительные аспекты смысловых связей в тексте.
# Окна
<- annotated_data |>
annotated_data_small select(id, lemma)
<- annotated_data_small |> # Сгруппируем леммы в списки
nested_data group_by(id) |>
summarise(tokens = list(lemma))
# Функция для создания слайдов с добавлением window_id
<- function(tbl, window_size) {
slide_windows <- slider::slide(
skipgrams
tbl, ~ .x,
.after = window_size - 1,
.step = 1,
.complete = TRUE
)
<- map2(skipgrams,
out 1:length(skipgrams),
~ tibble(tokens = .x, window_id = .y))
<- bind_rows(out)
result return(result)
}
<- nested_data |>
data_windows mutate(tokens = map(tokens, slide_windows, window_size = 10)) |>
unnest(tokens)
<- data_windows |>
data_windows mutate(window_id = paste(id, window_id, sep = "_"))
# PMI
<- data_windows |>
data_pmi pairwise_pmi(tokens, window_id)
|>
data_pmi arrange(-abs(pmi))
<- data_pmi |>
data_ppmi mutate(ppmi = case_when(pmi < 0 ~ 0,
.default = pmi))
<- "https://drive.google.com/uc?export=download&id=1AmsIhZKXkwYOBp6yxdJpYs-uv7AhFjWR"
file_url
# Загрузка данных
<- read_csv(file_url)
data_ppmi
|>
data_ppmi arrange(pmi) |>
slice(1:20)
Шаста и Питер: независимы друг от друга в сюжете.
Джить(Джил) и корабль: неожиданная пара, так как Джил участвовала в морских приключяениях. Встречается редко, скорее всего, потому что имя “Джил” было лемматизировано неправильно лишь изредка.
Питер и словно: метафорические конструкции с “словно” редко связываются с образом Питера.
Королева и вода: маловероятная связь, случайная.
Анализ семантических векторов nearest_neighbors
Анализ семантических векторов позволяет найти и интерпретировать скрытые смыслы текста через сопоставление слов и их контекстов. Сопоставление ассоциаций, связанных локациями произведения, позволяет нам глубже понять, какой образ формирует автор. А также, помогает выявить, как текст подчёркивает уникальные черты характеров главных героев, взаимодействие между ними и их роли в общей динамике
<- function(df, feat, doc=F) {
nearest_neighbors <- function() {
inner_f widely(
~ {
<- .[rep(feat, nrow(.)), ]
y <- rowSums(. * y) /
res sqrt(rowSums(. ^ 2)) * sqrt(sum(.[feat, ] ^ 2)))
(
matrix(res, ncol = 1, dimnames = list(x = names(res)))
},sort = TRUE
)}if (doc) {
|> inner_f()(doc, dimension, value) }
df else {
|> inner_f()(word, dimension, value)
df |>
} select(-item2)
}
# nearest_words <- word_emb |>
# nearest_neighbors("нарния")
#
# nearest_words <- word_emb |>
# nearest_neighbors("лондон")
# nearest_words <- word_emb |>
# nearest_neighbors("люси")
# nearest_words <- word_emb |>
# nearest_neighbors("сьюзен")
# nearest_words <- word_emb |>
# nearest_neighbors("питер")
# nearest_words <- word_emb |>
# nearest_neighbors("эдмунд")
# nearest_words <- word_emb |>
# nearest_neighbors("юстэс")
# nearest_words <- word_emb |>
# nearest_neighbors("джил")
Контраст Нарнии и Англии
править, король, королевой, счастливо, адам, злодейство, протектор
потрясать, вспыльчив, переезжать, налет, вывезти, бесчинствовать
Нарния
Слова, связанные с Нарнией, несут в себе ореол королевской власти, морали и ответственности. “Править”, “король”, и “королевой” не просто титулы, а символы праведного правления, основанного на принципах справедливости и добра.
Слова “адам” и “протектор” отсылают к библейской символике. Они подчеркивают связь Нарнии с темой искупления, в которой Аслан играет роль мессии, а Люди - “дети Адама и Евы” - занимают особое место как хранители мира.
“Счастливо” борется со “злодейством” в каждой из книг. Нарния - это мир, где счастье достигается через победу над злом.
Англия
В отличие от Нарнии, Англия в данном контексте представлена динамичными, эмоционально заряженными словами. “Потрясать” и “вспыльчив” намекают на хаос и нестабильность. “Налет”, “бесчинствовать”, и “вывезти” указывают на исторические потрясения, связанные с войной, эвакуацией и насилием. Эти слова могут символизировать атмосферу Второй мировой войны, на фоне которой дети впервые попадают в Нарнию.
Интересно, что слово “переезжать” может связывать два мира: Англию и Нарнию, физическое и метафорическое.
Эти контрасты показывают, как Нарния служит детям убежищем и местом духовного очищения, противопоставленным суровой реальности Англии. Они также раскрывают тему двойственности: война и мир, реальность и фантазия, хаос и гармония.
Дети в Хрониках Нарнии
миниатюра, красивый, гласил, красавица, слез, переворачиваться
Символ чистоты и веры
Люси - самая младшая и чистосердечная из детей Певенси. Слова, связанные с её образом, подчёркивают её внутреннюю и внешнюю красоту (красивый, красавица), нежность и эмоциональную открытость (слёз). Она часто становится проводником между героями и Нарнией, что отражается в слове гласил, намекающем на её роль как “голоса истины”. Переворачиваться может метафорически указывать на перемены, которые она привносит в жизни других героев.
Питер, сосчитать, переругаться, нерешительно, светил, хвалить, помада
Переход от детства к взрослости
Сьюзен - старшая сестра, которая играет роль миротворца, но иногда демонстрирует нерешительность (нерешительно). Её отношения с братьями и сестрой часто связаны с попытками поддерживать порядок, что видно в словах сосчитать и переругаться.
Помада символизирует её переход от детства к взрослости, что особенно проявляется в её отдалении от Нарнии в конце цикла.
Сьюзен, Эдмунд, верховный, сосчитать, непослушный, огрызаться, светил, выдумывать, выстрелять
Лидер и защитник
Питер, как старший брат и верховный король Нарнии (верховный), несёт ответственность за семью. Его близость к Сьюзен и Эдмунду подчёркивает его заботу о них. Однако слова непослушный, огрызаться показывают, что он может быть строг и резок, особенно в конфликтах с Эдмундом. Выстрелять и светил отсылают к его роли защитника, часто сражающегося за правду.
Питер, Люси, голосование, сосчитать, Сьюзен, непослушный, светил, выдумывать, тащишь, отплатить
Искупление и преодоление ошибок прошлого
Эдмунд проходит путь от предательства к искуплению. Его связь с Питером и Сьюзен говорит о напряжённых отношениях в семье, особенно в ранние годы. Слова непослушный и выдумывать отражают его упрямство и склонность к конфликтам. Однако отплатить намекает на его искупление и готовность бороться со злом в более поздних книгах.
выучиться, взобраться, дуэль, европ, пылить, ливня, шуток, вылечить, ботаник, поместиться, раненый
Внутренние изменения
Юстэс предстает эгоистичным и циничным, что подчёркивается словами пылить и ботаник. Однако он переживает серьёзные изменения: выучиться и вылечить символизируют его рост и искупление. Дуэль и взобраться отражают его героические поступки в путешествиях.
наскочить, щебетать, слепой, загадочно, насвистывать, изнывать, пепел, наплакаться, езда
Стремление к самопознанию и преодолению страхов
Джил - сильный, но уязвимый персонаж, её слова указывают на эмоциональную глубину (наплакаться) и тайны, с которыми она сталкивается (загадочно). Езда и наскочить могут символизировать её участие в активных поисках и приключениях. Она часто сомневается в себе, но в то же время проявляет стойкость в испытаниях.
Эти персонажи вместе формируют богатую мозаику характеров, каждый из которых вносит свою уникальность в общее повествование. Их истории подчеркивают важность верности, искупления и внутреннего роста, что делает “Хроники Нарнии” не только приключенческой эпопеей, но и исследованием человеческой природы.
Аслан против антогонистов цикла
Сравнение Аслана, как центральной фигуры добра и порядка, с антагонистами: Джадис, Миразом и Ташем.
Это сопоставление позволяет выявить контрасты в их характеристиках, тематике и значении для сюжета. “Хроники Нарнии” наполнены аллегориями, и каждый персонаж отражает определённые моральные или философские ценности. Гипотеза заключается не только в том, что антогонисты будут окружены негативно окрашенными словами, но и в том, что каждый антигерой иллюстрирует характерные только для него пороки.
Для этого строим модель Word2Vec для анализа семантических связей. Это позволяет глубже понять, какие концепты или персонажи наиболее близки друг другу в контексте произведения.
<- annotated_data |>
annotated_data_small select(id, lemma)
<- annotated_data_small |>
corpus group_by(id) |>
mutate(text = str_c(lemma, collapse = " ")) |>
distinct(id, text)
set.seed(0206202)
<- word2vec(x = corpus$text,
model type = "skip-gram",
dim = 50,
window = 5,
iter = 20,
hs = TRUE,
min_count = 5,
threads = 6)
<- as.matrix(model)
emb
predict(model, c("аслан", "таш", "джадис", "мираз"), type = "nearest", top_n = 10) |>
bind_rows()
Аслан
осмелиться, лев, говорить, сдержать, дитя, колдунья, вздор, нехороший
Аслан представлен как воплощение добродетели, силы и истины. Слово лев подчеркивает его королевскую природу и символизирует отвагу. Осмелиться и сдержать указывают на его готовность брать ответственность и действовать ради высших целей. Противопоставление словам колдунья и вздор намекает на его борьбу с ложью и магией зла.
Таш
обезьяна, демон, сабль, ришд, гнусный, тархан, владыка, хлева, хлев
Таш представляет силы хаоса и тьмы. Демон и гнусный ясно характеризуют его злую и пугающую природу. Хлев и владыка хлева символизируют ложь и коварство, на которых строится его власть. Сабль и тархан подчеркивают его ассоциацию с жестокостью и войной.
Джадис
императрица, ведьма, собственный, чародь, дядюшка, кабинет, керк, чарн, обязанный, крайне
Джадис воплощает гордость, жажду власти и манипуляцию. Императрица и ведьма указывают на её ложное чувство превосходства и использование магии для подавления других. Слова чародь и чарн отсылают к её разрушительной природе и тёмным истокам. Собственный и обязанный подчеркивают её эгоцентризм и стремление к контролю.
Мираз
тельмаринец, поединок, глозиль, каспиан, вызов, армия, правильный, выкрикивать, тараторка, короле
Мираз, в отличие от Таш и Джадис, не пользуется магией, а действует через силу и хитрость. Слова поединок, вызов, армия показывают его склонность решать конфликты насилием. Тельмаринец и короле подчёркивают его узурпаторскую натуру, а выкрикивать намекает на его склонность к демагогии и пустословию.
Аслан противопоставлен своим антагонистам как сила, действующая ради других, ради правды и любви. Его враги, напротив, действуют из эгоизма, жажды власти и разрушения, что делает их противостояние с Асланом не только сюжетным, но и философским.
Экспериментальная часть: кластеризация персонажей
Кластеризация персонажей может помочь глубже понять взаимосвязи людей и животных Нарнии, выявить неожиданные сходства.
Для этого вручную сформирован список персонажей, который далее был разделен на кластеры по следующему алгоритму:
Задаём число кластеров k, которое определяет, на сколько групп алгоритм разделит данные. Методом подбора выбрано 8 кластеров.
Каждая точка (вектор персонажа) «привязывается» к ближайшему центру кластера. Близость измеряется с использованием евклидова расстояния.
Центры кластеров обновляются так, чтобы они располагались в среднем положении всех точек, привязанных к кластеру.
Шаги 2 и 3 повторяются, пока изменения в положении центров не станут незначительными (достижение сходимости).
<- c("люси", "аслан", "эдмунд", "питер", "полли", "джадис", "джил",
characters "дигори", "каспиан", "мираз", "питер", "сьюзена", "шаста", "юстас",
"хитр", "лопух", "рилиан", "рипичип", "трам", "тамнус", "аравита", "бобр", "бобриха",
"хмур")
<- characters[characters %in% rownames(emb)] # Удаляем отсутствующие
characters
<- emb[characters, , drop = FALSE]
character_vectors
# Устанавливаем число кластеров
<- min(8, nrow(character_vectors))
k
# Выполняем кластеризацию
set.seed(123)
<- kmeans(character_vectors, centers = k)
kmeans_result
<- data.frame( # Добавляем информацию о кластере в DataFrame
clusters character = rownames(character_vectors),
cluster = as.factor(kmeans_result$cluster)
)
<- duplicated(character_vectors)
duplicated_rows
<- duplicated(character_vectors) # Удаляем дубликаты
duplicated_rows <- character_vectors[!duplicated_rows, ]
character_vectors_unique
<- kmeans(character_vectors_unique, centers = 8)
kmeans_result
# Выполняем t-SNE для уникальных данных
<- Rtsne(character_vectors_unique, dims = 2, perplexity = 5, verbose = TRUE, max_iter = 500)
tsne_result
# Преобразуем в датафрейм для графика
<- data.frame(
tsne_data x = tsne_result$Y[, 1],
y = tsne_result$Y[, 2],
cluster = kmeans_result$cluster,
character = rownames(character_vectors_unique)
)
ggplot(tsne_data, aes(x = x, y = y, color = factor(cluster), label = character)) +
geom_point(size = 3) +
geom_text(vjust = -0.5, size = 3) +
ggtitle("t-SNE Визуализация персонажей") +
theme_minimal()
Аслан
Аслан, воплощение мудрости и силы, выделяется как единственный представитель своего кластера. Его одиночество в этой группе подчеркивает уникальность и величие, которые делают его центром притяжения всех героев и событий. Близость к Бобру, Бобрихе и Тамнусу отражает его связь с существами, которые олицетворяют дружелюбие, преданность и первозданную природу Нарнии.
Люси Певенси
Самая чуткая и невинная из Певенси, занимает отдельное место в своем кластере. Её расположение рядом с братьями и сестрой символизирует крепкую связь семьи, но её уникальность подчеркивает роль первооткрывательницы и духовного лидера среди Певенси. Люси всегда была ближе к магии и чудесам Нарнии, и её одиночество в кластере подтверждает её способность видеть и чувствовать то, что недоступно другим.
Семейные и дружеские узлы
Этот кластер разделён на две подгруппы:
Бобры и Тамнус - жители Нарнии и преданные союзники. Бобёр и Бобриха олицетворяют надежду и уютный домашний очаг, а Тамнус - символ искупления и дружбы.
Эдмунд, Питер и Сьюзен - старшие Певенси, чья близость друг к другу отражает их общую ответственность за Нарнию и совместные испытания.
Дигори, Полли и Джадис
Дигори и Полли - герои, пережившие драму становления Нарнии, - находятся в одном кластере с Джадис, символом разрушения и зла. Одержав верх над Джадис они позволили Нарнии выжить.
Юстас, Рилиан и Джил
Этот кластер объединяет героев, связанных испытаниями в “Серебряном кресле”. Юстас, прошедший путь от эгоизма к искуплению, находится рядом с Джил, символом верности, и Рилианом, героем, чья борьба с пленением отражает внутренние и внешние конфликты. Вместе они представляют тему борьбы и искупления, подчеркивая силу дружбы и верности.
Аравита и Шаста
Этот кластер рассказывает историю двух беглецов из “Коня и его мальчика”. Аравита и Шаста, символизируют преодоление предрассудков и различий. Их близость отражает общий путь от одиночества и сомнений к мужеству и новым открытиям.
Хитр и Лопух
Хитр и Лопух, антагонисты из “Последней битвы”, разделяют кластер, который олицетворяет жадность, предательство и ложь. Их союз построен на взаимной корысти и стремлении к власти, а их отдалённость от остальных персонажей отражает изоляцию, к которой приводит зло.
Заключение
“Хроники Нарнии” - это не просто детские сказки, а многослойное произведение, наполненное символизмом и увлекательными сюжетами. Это маленькое исследование позволило заглянуть глубже в структуру текста, обнаружив уникальные особенности персонажей и локаций. Этот анализ служит напоминанием о том, как тщательно построена Нарния - мир, который всегда остаётся открытым для тех, кто готов в него поверить.
Проведённый анализ оставляет простор для дальнейших исследований. Например, можно сосредоточиться на сравнении использования языка в разных книгах или изучить развитие персонажей в динамике повествования, чтобы более четко отследить их трансформацию. Еще одним вектором развития может стать исследование диалогов, а не всего текста целиком. Также можно сравнить тексты книги и сценарий экранизации.