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(lemma) |>
summarise(n = n()) |>
arrange(-n)
“Видеть” и “знать” - могут служить символами понимания и прозрения. Герои Нарнии смотрят на окружающий мир не только глазами, но и сердцем, открывая истину, скрытую за мрачными тенями.
“Мочь” говорит о силе выбора и возможностей. Это слово напоминает нам, что каждый герой способен преодолеть себя, если найдёт в себе решимость двигаться вперёд.
Имена героев - “Люси”, “Аслан”, “Джил” - звучат как напоминание о том, что магия Нарнии живёт в их поступках. Люси воплощает чистоту и веру, Аслан - мудрость и любовь, а Джил - силу преодоления своих страхов.
Слово “король” раскрывает тему лидерства и ответственности. В Нарнии стать королём - значит служить, защищать и вдохновлять.
“Говорить” и “спросить” - о важности диалога. Эти слова символизируют, что понимание между героями рождается через общение, через искренность вопросов и ответов.
Наиболее значимые слова TF-IDF
Применяем метод TF-IDF (Term Frequency-Inverse Document Frequency), чтобы определить наиболее значимые слова в текстах. Этот подход позволяет выявить слова, которые часто встречаются в отдельных документах, но реже появляются в корпусе в целом.
Удаляем имена персонажей и общие слова, чтобы сфокусироваться на содержательных терминах, имеющих важное значение для анализа текста. Затем рассчитываем вес TF-IDF для каждого токена, чтобы выделить ключевые слова.
<- annotated_data |>
no_names_data filter(!lemma %in% c("люси", "полли", "аслан", "аслана", "джадис", "джил", "дигори", "каспиан", "мираз", "питер", "сьюзен", "шаста", "эдмунд", "эдмунд.", "юстас", "юстас.", "юстэс", "хитр", "хитр.", "льюис", "льюиса", "клайв", "лопух", "конь.", "четверти", "нарнии", "пока", "снова", "'вспыльчива"))
<- no_names_data |>
data_counts count(id, lemma, name = "n")
<- data_counts |>
data_tf_idf bind_tf_idf(term = lemma, document = id, n = n) |>
arrange(desc(tf_idf)) |>
select(lemma, id, tf_idf)
|>
data_tf_idf slice_max(tf_idf, n = 19) |>
ggplot(aes(x = reorder(lemma, 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(lemma, 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, 13, 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: Обман и искушение
Тема объединяет элементы обмана, манипуляции и искушений, которые встречаются на пути героев. Обезьяна и Таш символизируют ложные верования и иллюзии, под которыми скрываются темные силы. Тириан, принц Нарнии, и Джил - воплощение героизма и сопротивления этим искушениям. Шкура, Тархан и Ерш играют роль тех, кто либо попадает под влияние злых сил, либо сражается с ними, сталкиваясь с личными моральными выборами.
Тема 13: Путешествие и изменение
Эта тема отражает путешествие в неизведанное, символизируемое берегом, шкафом и дверцей, которые становятся порталами в другие миры. Профессор и Рипичип воплощают мудрость и наставничество, помогая героям понять истинный смысл их путешествий.
Тема 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()
Аслан
Аслан, воплощение мудрости и силы, выделяется как единственный представитель своего кластера. Его одиночество в этой группе подчеркивает уникальность и величие, которые делают его центром притяжения всех героев и событий. Близость к Бобру, Бобрихе и Тамнусу отражает его связь с существами, которые олицетворяют дружелюбие, преданность и первозданную природу Нарнии.
Люси Певенси
Самая чуткая и невинная из Певенси, занимает отдельное место в своем кластере. Её расположение рядом с братьями и сестрой символизирует крепкую связь семьи, но её уникальность подчеркивает роль первооткрывательницы и духовного лидера среди Певенси. Люси всегда была ближе к магии и чудесам Нарнии, и её одиночество в кластере подтверждает её способность видеть и чувствовать то, что недоступно другим.
Семейные и дружеские узлы
Этот кластер разделён на две подгруппы:
Бобры и Тамнус - жители Нарнии и преданные союзники. Бобёр и Бобриха олицетворяют надежду и уютный домашний очаг, а Тамнус - символ искупления и дружбы.
Эдмунд, Питер и Сьюзен - старшие Певенси, чья близость друг к другу отражает их общую ответственность за Нарнию и совместные испытания.
Дигори, Полли и Джадис
Дигори и Полли - герои, пережившие драму становления Нарнии, - находятся в одном кластере с Джадис, символом разрушения и зла. Одержав верх над Джадис они позволили Нарнии выжить.
Юстас, Рилиан и Джил
Этот кластер объединяет героев, связанных испытаниями в “Серебряном кресле”. Юстас, прошедший путь от эгоизма к искуплению, находится рядом с Джил, символом верности, и Рилианом, героем, чья борьба с пленением отражает внутренние и внешние конфликты. Вместе они представляют тему борьбы и искупления, подчеркивая силу дружбы и верности.
Аравита и Шаста
Этот кластер рассказывает историю двух беглецов из “Коня и его мальчика”. Аравита и Шаста, символизируют преодоление предрассудков и различий. Их близость отражает общий путь от одиночества и сомнений к мужеству и новым открытиям.
Хитр и Лопух
Хитр и Лопух, антагонисты из “Последней битвы”, разделяют кластер, который олицетворяет жадность, предательство и ложь. Их союз построен на взаимной корысти и стремлении к власти, а их отдалённость от остальных персонажей отражает изоляцию, к которой приводит зло.
Заключение
“Хроники Нарнии” - это не просто детские сказки, а многослойное произведение, наполненное символизмом и увлекательными сюжетами. Это маленькое исследование позволило заглянуть глубже в структуру текста, обнаружив уникальные особенности персонажей и локаций. Этот анализ служит напоминанием о том, как тщательно построена Нарния - мир, который всегда остаётся открытым для тех, кто готов в него поверить.
Проведённый анализ оставляет простор для дальнейших исследований. Например, можно сосредоточиться на сравнении использования языка в разных книгах или изучить развитие персонажей в динамике повествования, чтобы более четко отследить их трансформацию. Еще одним вектором развития может стать исследование диалогов, а не всего текста целиком. Также можно сравнить тексты книги и сценарий экранизации.