library(tidyverse)
library(rvest)
library(tidytext)
library(tokenizers)
library(udpipe)
library(RColorBrewer)
library(wordcloud)
Изучение 1-15 свитков Нихон сёки
Разведывательный анализ японской летописи и работа с трибанком классического китайского языка от Университета Киото
“Нихон Сёки” (日本書紀). Что это?
“Нихон Сёки” (日本書紀) или же Анналы Японии - это одна из первых хроник Японского государства, составленная в 720 году для императрицы Гэнсё: (680-748). Эта летопись в отличие от более ранних Записок о Деянии Древности (“Кодзики”, 古事記, 712 год создания) написана на камбуне. Камбун (漢文) дословно переводится как “китайские письмена”. Так японцы именовали классический китайский язык (вэньян).
Вэньян, по сути, можно сравнить с латынью. В странах Восточной Азии он считался языком книжности и учёности. На нём писали не только в Китае и Японии, но и в Корее, Вьетнаме.
Цель создания “Нихон Сёки” - показать Японию во всей красе перед соседями.
Историческое сочинение делится на 30 свитков, рассказывающих историю Японии с мифов о появлении островов до реальных событий правления императрицы Дзито на рубеже VI-VII веков.
- Списки с 1 по 18 описывают легендарную историю Японии на основе собранных в разных провинциях мифов и сказаний
- Списки с 19 по 30 рассказывают подтверждённые другими (в том числе зарубежными) источниками реальные события Древнеяпонского государства Ямато
Давайте проведем разведывательный анализ этого выдающегося памятника Японской древности и проверим трибанк Университета Киото.
Ход работы
Подгружаем библиотеки
Для корректной работы с кодом нужно подгрузить следующие необходимые для исследования библиотеки
Загружаем текст “Нихон Сёки”
Полный текст “Нихон сёки” можно найти на ресурсе zh.wikisource.org. Оттуда мы его и возьмём.
<- 'https://zh.wikisource.org/wiki/%E6%97%A5%E6%9C%AC%E6%9B%B8%E7%B4%80'
url <- read_html(url)
html
<- html %>%
toc_ns html_elements('.ws-noexport+ ul li')
<- toc_ns %>%
toc_ns html_elements('a')
Создаем тиббл с двумя столбцами: в первом будет храниться номер свитка (в японской традиции наименования), во втором ссылки на эти свитки. Сохраняем под названием scrolls
<- tibble(
scrolls scroll = toc_ns |>
html_attr('title'),
href = toc_ns |>
html_attr('href')
)
<- scrolls |>
scrolls mutate(link = paste0('https://zh.wikisource.org', href)) |>
select(-href)
scrolls
Создаем функцию, чтобы пройти по указанным ссылкам и забрать текст
<- function(url) {
get_text read_html(url) |>
html_elements('dd , #mw-content-text p') |>
html_text2() |>
paste(collapse= " ")
}
Собираем текст в одну большую таблицу. При помощи регулярных выражений убираем лишние знаки и пробелы в начале
<- scrolls |>
urls pull(link)
<- map(urls, get_text)
ns_text
<- ns_text |>
ns_text flatten_chr() |>
as_tibble()
<- scrolls |>
nihon_syoki bind_cols(ns_text) |>
mutate(value = str_remove(value, '(日本書紀卷第\\S+\\s)')) %>%
mutate(scroll = str_remove(scroll, '日本書紀/')) %>%
mutate(text = value) %>%
select(-value)
nihon_syoki
Модель классического китайского языка KYOTO из Universal Dependencies
Интересно, что единственный доступный трибанк классического китайского языка был создан в Японии, в Университете Киото. Этот университет - один из старейших и престижнейших в Японии. Киото - это древняя столица Японии (с 792 по 1869 годы), поэтому логично, что именно здесь расположен главный центр по изучению древней истории. Помимо трибанка коллектив университета работает над созданием Сбалансированного корпуса древнеяпонских текстов (на древнеяпонском/на классическом китайском), который включает в себя не только письменные источники, но и петроглифику (например, иероглифы на гадательном панцире черепахи или на гадательной лопатке оленя).
Эта модель постоянно обновляется (последнее обновление произошло 15.11.24). Она обучена на таких классических трактатах китайской словесности разных периодов как:
- Лунь Юй (“Беседы” Конфуция)
- Мэн цзы
- Ли цзи
- Хроника Южной Сун
- Чуские строфы
- Чжаньго цэ
“Лунь Юй” был составлен около 5 века до нашей эры, тогда как “Хроника Южной Сун” датируется 14 веком нашей эры. Разница в написании составляет почти 2000 лет!!!
Целью японских ученых было создать такой трибанк, который можно применять для исследований текста на камбуне. В оригинальных японоязычных статьях, например, в То:хо: Гакухо: (“Вестник востоковедения”) используется именно термин “камбун”. См. Tokenization, Part-Of-Speech Tagging, Dependency Parsing, Sentencization, and Immediate Catena Analysis for Classical Chinese Texts (здесь даю такую ссылку, потому что не нашел в формате BibTex)
Однако подобранная для обучения литература не учитывает сложившуюся в Японии традицию письма и местную специфику словообразования. Часть документов (высокие государственные акты, законы или дневники хорошо образованных чиновников) написаны на хаку камбун или же белый/чистый камбун. Он так называется, потому что наиболее приближен к образцам классической китайской словесности. Оставшаяся - на хэнтай камбун или же грязный/извращенный камбун. По сути, это классический китайский язык с древнеяпонской логикой построения предложений.
Более подробно можно ознакомиться в следующей статье (правда, она на японском) (安岡 et al. 2022)
Загружаем модель-трибанк.
udpipe_download_model(language = 'classical_chinese-kyoto')
<- udpipe_load_model(file = 'classical_chinese-kyoto-ud-2.5-191206.udpipe') clch_kyoto
Готовим данные к анализу
Все 30 свитков “Нихон Сёки” аннотировать и анализировать очень долго и затратно, поэтому для нашего разведывательного анализа ограничимся половиной или 15 свитками (у меня, например, ноутбук не потянул объем в 30 свитков). Даже в таком случае у нас выйдет чуть меньше 100 тысяч токенов.
<- nihon_syoki %>%
ns_scroll1_15 filter(scroll == c('卷第一','卷第二','卷第三','卷第四','卷第五','卷第六','卷第七','卷第八','卷第九','卷第十','卷第十一','卷第十二','卷第十三', '卷第十四', '卷第十五'))
<- udpipe_annotate(clch_kyoto, ns_scroll1_15$text)
ns_annotate
<- as_tibble(ns_annotate) ns15_pos
После аннотирования необходимо отфильтровать наши даннные. Убираем всю пунктуацию. Исконный текст не подразумевает знаки пунктуации вообще: японцы не знали точек, запятых, кавычек, тире. Традиционно всё писалось сплошным текстом. Наличие пунктуации объясняются адаптивностью для современного читателя исходника. Также избавляемся от столбца paragraph_id. В наших исследованиях подобная информация не пригодится.
<- ns15_pos%>%
ns15_pos as_tibble() %>%
select(-paragraph_id) %>%
filter(upos != 'PUNCT')
Посмторим, как прошло аннотирование. Чтобы не перегружать работу рендера (а то он из-за этого вылетает) распечатаю лишь несколько предложений. В таблице представлены первые 3 автоматически выделенные предложения из каждого свитка.
Первое предложение первого свитка: “古天地未剖陰陽不分渾沌如雞子溟涬而含牙”. Даю перевод нашего замечательного японоведа Л.М. Ермаковой:“В древности, когда Небо-Земля были не разрезаны и Инь-Ян не разделены, мешанина [эта] была подобна куриному яйцу, темна и содержала почку”. Мы видим, что предложения при аннотировании поделены не правильно, причём если посмотреть в дальнейшем, то не увидим какого-либо единого принципа: где-то по точке, где-то по окончательной частице, где-то по запятой, где-то по глаголу (хотя в классическом китайском предложение почти всегда не заканчивается на глагол). Этот аспект вызывает вопросы.
Посмотрим, как определены части речи в первом предложении:
Токен | UPOS | Правильность определения |
---|---|---|
古 | NOUN | O |
天 | NOUN | O |
地 | NOUN | O |
未 | ADV | O |
剖 | VERB | O |
陰 | NOUN | O |
陽 | NOUN | O |
不 | ADV | O |
分 | VERB | O |
渾 | VERB | X |
沌 | VERB | X |
如 | VERB | O |
雞 | NOUN | O |
子 | NOUN | O |
溟 | VERB | X |
涬 | VERB | X |
而 | CCONJ | O |
含 | VERB | O |
牙 | VERB | X |
В таблице используется японская графическая система “мару-бацу”. “Мару” (О) означает “правильно”, “соответствует”. “Бацу” (Х) - “неправильно”.
Из 19 токенов неверно определно 5. Если экстраполировать данные, то степень верности определения части речи около 73-75% или каждая четвертая часть речи определена неправильна. Однако, учитывая сложность составления данных языковых моделей, это даже можно засчитать за успех.В древнекитайском языке почти нет морфологических признаков и, соответсвенно, суффиксов,окончаний и важно понимание контекста для определения части речи.
Необходимо внимательно и аккуратно подходить к выводам и результатам анализа!!!.
Анализ текста первой половины “Нихон Сёки”
Для начала рассмотрим, как распространены те или иные части речи. Считаем каждую часть речи и строим столбчатую диаграмму.
<- ns15_pos %>%
upos_counts group_by(upos) %>%
count() %>%
arrange(-n)
%>%
upos_counts ggplot(aes(x = reorder(upos, n), y = n, fill = upos)) +
geom_bar(stat = "identity", show.legend = F) +
coord_flip() +
labs(x = NULL, title = 'Частеречный анализ первой половины "Нихон сёки"') +
theme_bw()
Наибольшая встречаемость у глаголов. На это есть несколько причин:
- Перед нами летопись, один из видов эпического повествования
- И японский язык, и китайский язык “глагольные”, т.е. основные грамматические показатели как время, отрицание выражены через конечный глагол
Посмотрим наиболее распространенные глаголы. Составим облако слов.
<- RColorBrewer::brewer.pal(8, "Dark2")
pal
<- ns15_pos %>%
verbs filter(upos %in% c('VERB')) %>%
count(lemma) %>%
arrange(-n)
<- wordcloud(verbs$lemma, verbs$n, colors = pal, max.words = 200,
verbs_wc rot.per = 0)
皇 - никакой не глагол. Этот иероглиф имееет лишь одно значение - “августейшая особа” (или просто “император”). Если присмотреться к облаку, то можно увидеть и другие “мелкие огрехи”. Поэтому к списку причин встречаемости глаголов выше можно смело добавить:
- Ошибки при аннотировании текста
С другой стороны, самый частотный глагол 曰 (“говорить”) определён верно. Действительно в этом тексте часто встречаются формулы с этим иероглифом: “В одном писании сказано”, “Император изрёк”. Другие частотные глаголы 有 (“быть”, “находиться”), 尊 (“уважать”, “почитать”), 爲 (“делать”), 以 (“иметь причиной”), 云 (“говорить”), 大 (“увеличивать”). Поскольку перед нами летопись, то, в первую очередь, повествуется о событиях, что объясняет высокую встречаемость “быть”, “делать”,“иметь причиной”, “говорить” и т.п. Отдельно стоит “почитать”. Данный глагол применятется не только по отношению не столько как к императору, сколько к божествам японского пантеона. Император - сам божество (точнее, “человек, в котором пребывает божество”), ритуалы и церемонии, связанные с ним, с его небесными предками, с другими местными божествами описываются с использованием иероглифа 尊.
Минивывод:
В целом, показанная картина похожа на правду, но при смене оптики (например на лупу) вылезают серьёзные ошибки. Высокая частота одних глаголов связана со структурой памятника, вторая с его характером (повествование), остальная с персонажами событий (божество, император).
Посмотрим на существительные. Для этого также составим облако слов.
<- ns15_pos |>
nouns filter(upos %in% c("NOUN", "PROPN")) |>
count(lemma) |>
arrange(-n)
<- wordcloud(nouns$lemma, nouns$n, colors = pal, max.words = 200,
nouns_wc rot.per = 0)
С существительными модель справилась намного лучше. Самый частотный иероглиф - “небо” (天). Поскольку в тексте рассказывается о небесных божествах, их небесном потомке - японском императоре, нет ничего удивительного в его множественном упоминании. К тому же, японцы уже были знакомы с китайской традицией легитимации власти как “получение мандата неба”, и поэтому в летописи, написанной специально для Китая, правление японских императоров доказывалось через призму этой теории.
Первая половина Нихон Сёки больше мифическая, легендарная, поэтому, видимо, иероглиф “божество” (神) второй по распространенности.
Другие распространенные иероглифы: 國 (очень размытое понятие; может значить как “государство”, “местность”, “край”, “провинция”), 時 (“время”), 日 (“день”, “солнце”), 人 (“человек”), 子 (“ребенок”), 月 (“месяц”(и календарный, и небесный)), 命 (“жизнь”, “судьба”), 年 (“год”), 王 (“правитель”), 臣 (“министр”), 皇 (“император”), 中 (“середина”), 山 (“гора”).
Гора - сакральное место в японской культуре. Считается, что там пребывают божества-ками. К тому же, с древности существовали культы отдельных гор. Их частое упоминание не случайно. Это показатель увадения и благоговения.
TF-IDF. Какие слова характерны для каждого из свитков?
Из чистого любопытства проверим, какие слова характерны для каждого из свитков. Так, возможно, найдем индивидуальность на первый взгляд однообразных, в оригинале непроименованных частей.
Группируем данные по группам и определяем число уникальных токенов в каждой из них. Используем функцию bind_tf_idf() и определяем значение TF-IDF. Представлем результат в виде столбчатых диаграмм с 3 словами для каждого из 15 свитков “Нихон сёки”.
<- ns15_pos %>%
word_counts group_by(doc_id) %>%
count(token, sort = TRUE)
<- word_counts %>%
word_tfidf bind_tf_idf(token, doc_id, n)
%>%
word_tfidf arrange(-tf_idf) %>%
group_by(doc_id) %>%
top_n(3) %>%
ungroup() %>%
ggplot(aes(reorder_within(token, tf_idf, doc_id), tf_idf, fill = doc_id)) +
geom_col(show.legend = F) +
labs(x = NULL, y = "tf-idf") +
facet_wrap(~doc_id, scales = "free") +
scale_x_reordered() +
coord_flip()
Selecting by tf_idf
Каждый свиток показал свое лицо. Например, в первом свитке встречается иероглиф “урон” (戔). К тому же, у него самый высокий показатель TF-IDF (0.018531805). Этот иероглиф входит в список эпитетов бога ветра Сусаноо-но микото, правителя земли, брата Великой Солнечной богини Аматэрасу-Оомиками. Мифы о Сусаноо (так называемый цикл Идзумо) перечислены преимущественно в первом свитке. Во втором свитке в качестве третьего результата вылезло имя морской богини Тоётама (豊玉). Это один из немногих случаев, когда при аннотировании верно определили имя собственное японского происхождения.
Но на мой взгляд самый интересный - 5 свиток. Во-первых, это единственный свиток, у которого получилось 4 результата при требовании в коде 3 (у двух одинаковое значение индекса). Во-вторых, набор иероглифов. Первый - 夢 (“сон”, “грёза”). Второй - 迹 (“след”, “отпечаток”, “шрам”, “оспина”). Третье место разделили два иероглифа 疫 (“инфекция”, “эпидемия”) и 屎 (напишу, чтобы никто не догадался, на английском - “shit”). Сны в дневниках и хрониках часто бывают вещими, тем более император считался проводником между миром людей и миром божеств. С “迹” сложнее. Он означает не само слово, а эпитет. Такое прозвище носила тётя императора Суйдзина (148 г. до н.э. - 30 г. до н.э.), о котором как раз идёт речь в 5 свитке. 疫, 屎 указывают нам на хворь, поразившую государство.
Вместо заключения
“Нихон сёки” - один из главных источников по истории Японии, я бы даже сказал, что хрестоматийный. При помощи модели-трибанка KYOTO (несмотря на большую долю ошибок аннотирования) удалось взглянуть на документ с другой стороны, увидеть в нём новые стороны и подтвердить устоявшиеся суждения.