Эмоциональная окраска топонимов в «Игре престолов» Дж. Р. Мартина
Автор
Екатерина Моисеева
Дата публикации
20 декабря 2025 г.
Аннотация
smth
О чём этот проект
Главная задача этого проекта — проанализировать, как в художественном тексте эмоционально окрашены упомянутые в нем лексемы, обозначающие место. Книги из цикла «Песнь льда и пламени» Джорджа Мартина хорошо подходят для этого, поскольку, во-первых, все главы в книгах написаны от лица различных персонажей (а это значит, что подобный анализ можно провести в контексте восприятия места отдельных героев), а во-вторых, сама географическая местность играет большую роль в сюжете практически наравне с людьми и часто подвергается субъективной оценке с их стороны.
Здесь я буду анализировать эмоциональную окраску только одной локации — Винтерфелла — через призму центральных героев этой книги (семьи Старков).
Что я собираюсь делать: 1. Собрать необходимые данные 2. Лемматизировать и векторизовать текст (последнее нужно для поиска «соседей» слова, которое я собираюсь анализировать) 3. Провести непосредственно анализ эмоциональной окраски.
Код целиком и данные можно посмотреть в репозитории.
Подготовка текста
Книга не находится в открытом доступе, поэтому вместо стандартного парсинга с сайта я сначала скачала её в html-формате, а уже затем достала из нее текст. Мне понадобились следующие библиотеки
library(rvest)library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.4 ✔ readr 2.1.5
✔ forcats 1.0.0 ✔ stringr 1.6.0
✔ ggplot2 4.0.0 ✔ tibble 3.3.0
✔ lubridate 1.9.4 ✔ tidyr 1.3.1
✔ purrr 1.2.0
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ readr::guess_encoding() masks rvest::guess_encoding()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
[1] "Scanned 3/5/02 by sliph; Proofed by Nadie PROLOGUE We should start back,\u0094 Gared urged as the woods began to grow dark around them. \u0093The wildlings are dead.\u0094 \u0093Do the dead frighten you?\u0094 Ser Waymar Royce asked with just the hint of a smile. Gared did not rise to the bait. He was an old man, past fi..."
Как мы видим, мы случайно захватили текст, не относящийся к основному. Кроме того, некоторые символы были неправильно распознаны (это ’ и “), видимо, при прочтении файла. Исправим это все регулярными выражениями и выведем результат на экран:
[1] "PROLOGUE We should start back,” Gared urged as the woods began to grow dark around them. “The wildlings are dead.” “Do the dead frighten you?” Ser Waymar Royce asked with just the hint of a smile. Gared did not rise to the bait. He was an old man, past fifty, and he had seen the lordlings come an..."
В книге нет нумерации по главам: все они записываются как имя персонажа, от чьего лица будет вестись повествование (за исключением пролога). Все названия глав записаны капсом. Запишем их в отдельный вектор:
# A tibble: 74 × 1
text_agot
<chr>
1 ""
2 "PROLOGUE We should start back,” Gared urged as the woods began to grow dark…
3 "BRAN The morning had dawned clear and cold, with a crispness that hinted at…
4 "CATELYN Catelyn had never liked this godswood. She had been born a Tully, a…
5 "DAENERYS Her brother held the gown up for her inspection. “This is beauty. …
6 "EDDARD The visitors poured through the castle gates in a river of gold and …
7 "JON There were times — not many, but a few — when Jon Snow was glad he was …
8 "CATELYN Of all the rooms in Winterfell's Great Keep, Catelyn's bedchambers …
9 "ARYA Arya's stitches were crooked again. She frowned down at them with dism…
10 "BRAN The hunt left at dawn. The king wanted wild boar at the feast tonight.…
# ℹ 64 more rows
Теперь добавим к нашей таблице столбец с заголовком. Кроме того, уберем 1 строку, которая осталась пустой, и добавим id к каждой главе, чтобы различать главы одних и тех же персонажей (в целом, можно обойтись и без этого, поскольку конкретно здесь номер главы не играет особой роли):
# A tibble: 73 × 2
chapter_id text
<chr> <chr>
1 PROLOGUE_1 " We should start back,” Gared urged as the woods began to grow d…
2 BRAN_2 " The morning had dawned clear and cold, with a crispness that hi…
3 CATELYN_3 " Catelyn had never liked this godswood. She had been born a Tull…
4 DAENERYS_4 " Her brother held the gown up for her inspection. “This is beaut…
5 EDDARD_5 " The visitors poured through the castle gates in a river of gold…
6 JON_6 " There were times — not many, but a few — when Jon Snow was glad…
7 CATELYN_7 " Of all the rooms in Winterfell's Great Keep, Catelyn's bedchamb…
8 ARYA_8 " Arya's stitches were crooked again. She frowned down at them wi…
9 BRAN_9 " The hunt left at dawn. The king wanted wild boar at the feast t…
10 TYRION_10 " Somewhere in the great stone maze of Winterfell, a wolf howled.…
# ℹ 63 more rows
Лемматизация текста
Прежде чем приступить к этому пункту, загрузим модель Udpipe для английского языка:
Сперва выделим из нашей размеченной таблицы главы только тех персонажей, которые нас интересуют. Это Эддард, Кейтилин, Джон, Санса, Арья и Бран. Запишем для этого функцию:
После этого приступаем к векторизации. Сперва зададим функцию для скользящих окон:
library(stopwords)library(widyr)library(uwot)
Loading required package: Matrix
Attaching package: 'Matrix'
The following objects are masked from 'package:tidyr':
expand, pack, unpack
library(word2vec)library(text)
[0;34mThis is text (version 1.7.0).
[0m[0;32mNewer versions may have improved functions and updated defaults to reflect current understandings of the state-of-the-art.
[0m[0;35mMacOS detected: Setting OpenMP environment variables to avoid potential crash due to libomp conflicts.
[0m[0;35mWhen using the L-BAM library, be aware that models may be downloaded from external sources. Using models may carry security risks, including the possibility of malicious code in RDS files. Always review and trust the source of any model you load.
[0m[0;35mThe text package is provided 'as is' without any warranty of any kind.
[0m[0;32m
For more information about the package see www.r-text.org and www.r-topics.org.[0m
library(slider)
Warning: package 'slider' was built under R version 4.5.2
У нас получились смешанные результаты: во многих случаях позитивные и негативные ассоциации поделились практически поровну. Отчасти это связано с проблемами модели для оценки тональности. Некоторые слова (к примеру, noble или gorgeous) имеют, согласно ей, негативную коннотацию, другие, как unable, наоборот, почему-то оказываются позитивно окрашенными.
С другой стороны, если не смотреть на столбец value, мы смогли выделить интересные ассоциации, связанные с конкретным топонимом, которые достаточно редко повторяются в различных главах персонажей. Подобный подход может быть полезен при сравнительном анализе эмоциональных окрасок (скорее всего, при смене модели) других топонимов в главах других персонажей, а также не на материале одной книги, а сразу нескольких.