RAntiquity
library(ape)
tr1 <- ape::read.tree(text = "((1,2),(3,4));")
tr2 <- ape::read.tree(text = "((1,3),(2,4));")
tr3 <- ape::read.tree(text = "((1,4),(2,3));")
par(mfrow = c(1, 3), mar = c(5,0,5,0), cex = 1)
plot.phylo(tr1, tip.color = 2, type= "unrooted" )
plot.phylo(tr2, tip.color = 2, type= "unrooted" )
plot.phylo(tr3, tip.color = 2, type= "unrooted" )
Консенсусное дерево в таком случае никак не поможет: оно не допускает значений p < 0.5. Проверьте сами: код ниже вернет садовые вилы 🔱
par(mfrow = c(1,1))
cons.tr <- consensus(list(tr1, tr2, tr3), p = 0.5, rooted = F)
plot.phylo(cons)
В таких случаях на помощь приходит консенсусная сеть, строится с использованием пакета
phangorn. На входе отдаем объект класса multiPhylo, это по сути просто три дерева в одном букете.library(phangorn)
library(TreeTools)
mph <- as.multiPhylo(list(tr1, tr2, tr3))
cons.nw <- consensusNet(mph, prob = 0.3, rooted = F)
Объект
cons.nw относится к классу networx. Его можно изобразить как в двух, так и в трех измерениях. Вот так (рис. 2): plot(cons.nw, type = "2D")
Но вообще говоря самое веселое — это сеть в 3D. #филогенетика
library(rgl)
movie3d(spin3d(axis=c(0,1,0), rpm=3), duration=10, dir = ".", type = "gif", webshot = F)
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍1
Forwarded from Vox mediaevistae
В следующую среду в 16.30 по московскому времени (20.30 по Красноярску) состоится заседание семинара «Цифровая среда», на котором я расскажу про автоматическую транскрипцию рукописей. Это будет обзорное выступление, на котором я обрисую историю распознавания печатного и рукописного текста, опишу пайплайн распознавания рукописи (способы добычи изображения; его сегментация на зоны (на примере kraken и YOLO рассмотрим два подхода: семантическую сегментацию и обнаружение объектов); сегментация на строки (здесь тоже поговорим про несколько подходов: paths, baselines, bounding boxes); сама транскрипция) и скажу несколько слов про то, как «улучшить» полученную транскрипцию (в частности, про свежие эксперименты с трансформерами).
Дискутантом выступит Глеб Шмидт, который великолепно разбирается и в тематическом моделировании, и в факторном анализе, и в стилометрии, и в HTR.
Чтобы послушать и присоединиться к дискуссии, нужно зарегистрироваться здесь.
Дискутантом выступит Глеб Шмидт, который великолепно разбирается и в тематическом моделировании, и в факторном анализе, и в стилометрии, и в HTR.
Чтобы послушать и присоединиться к дискуссии, нужно зарегистрироваться здесь.
dhri.timepad.ru
«Автоматическая транскрипция рукописей: подходы, инструменты, проблемы». Доклад С.А.Яцык на семинаре „Цифровая среда“ DHRI@SFU…
27 марта 2024 года в 16:30 (msk) / 20:30 (krsk) состоится очередное заседание научно-методического семинара «Цифровая среда» Института цифровых гуманитарных исследований (DHRI) Сибирского федерального университета. На семинаре выступит Светлана Александровна…
🔥11👍4❤1
Дело в том, что результат кластеризации зависит от нескольких параметров:
Иногда добавление или удаление буквально одного слова меняет структуру дерева. Поэтому бывает необходимо сравнить разные деревья. Выше мы уже видели один способ это сделать — консенсусное дерево. Но оно дает уже результат обобщения, а иногда интересно посмотреть на исходные деревья, сопоставить их попарно.
Для этого удобно построить tanglegram, в R это проще всего сделать при помощи пакета
dendextend.
library(stylo)
library(dendextend)
data("galbraith")
data <- as.data.frame.matrix(galbraith)[c(1,2, 9, 10, 16, 17),c(1:30)]
distmx <- dist(scale(data))
d1 <- as.dendrogram(hclust(distmx, method ="average")) %>% set("labels_col", value = c("skyblue", "orange", "grey40"), k=3) %>% set("branches_k_color", value = c("skyblue", "orange", "grey40"), k = 3)
d2 <- as.dendrogram(hclust(distmx, method ="ward.D2")) %>% set("labels_col", value = c("skyblue", "orange", "grey40"), k=3) %>% set("branches_k_color", value = c("skyblue", "orange", "grey40"), k = 3)
dlist <- dendlist(d1, d2)
par(family = "Arial Bold")
tanglegram(dlist, common_subtrees_color_lines = FALSE, highlight_distinct_edges = TRUE, highlight_branches_lwd=FALSE, margin_inner=10, lwd=2, axes=FALSE, main_left = "Cредняя", main_right = "Уорд", lab.cex = 1.3)
На картинке видно, что одно из сочинений Дж. Роулинг попадает в разные кластеры в зависимости от метода связи, хотя для кластеризации использовалась одна и та же матрица расстояний.
Please open Telegram to view this post
VIEW IN TELEGRAM
😱6👍4
Нажимать на кнопки легко и приятно, но есть нюансы. Во-первых, не получится кастомизировать внешний вид дерева, а, во-вторых, в Stylo реализована достаточно специфическая процедура бутстрепа (повторных выборок).
Вот что пишут разработчики:
Under the FEATURES tab, users can define the minutes of the MFW division and sampling procedure, using the increment, the minimum and maximum parameters. For minimum = 100, maximum = 3000, and increment = 50, stylo will run subsequent analyses for the following frequency bands: 100 MFW, 50–150 MFW, 100–200 MFW, ..., 2900–2950 MFW, 2950–3000 MFW.
Для консенсуса нужно много деревьев, и Stylo будет строить эти деревья в заданном интервале. Это значит, что последние деревья будут построены уже не на основе самой частотной лексики, т.е. скорее всего на них отразится тематика текстов, входящих в корпус.
В некоторых случаях это работает неплохо. Например, для моего тренировочного греческого корпуса хватило 100-500 mfw, и почти все авторы (кроме Аристида) благополучно разошлись по своим домикам на дереве 🏡 (см. рисунок).
Но, возможно, вам понадобятся другие идеи для консенсуса. Разные расстояния. Разные методы кластеризации. Случайные выборки из первых двух сотен слов или еще что-то. Тогда придется самим строить сразу множество деревьев. Как это сделать грамотно, расскажем в следующих выпусках нашего
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍1
В этом году темы проектов посвящены исследованию деколонизации музеев, индвидиуального стиля Платона, особенностям советского кинопроката, библиографии детской литературы, наскальной живописи, многобразию лингвистики как науки и сохранению цифровой памяти.
Регистрация по ссылке.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8❤1
Если изучить изнанку функции 🦍
Что делает машинка, когда вы заказываете у нее консенсусное дерево? Принимает на входе матрицу с 1 … N столбцами, в которых хранится частотность для слов. Потом отбирает первые сколько-то слов (скажем, сотню или сколько скажете), считает расстояние, строит на основе матрицы расстояний дерево, складывает его в корзинку. Потом берет следующую сотню слов, считает расстояние, строит дерево, складывает в корзинку… Ну вы поняли. Получается букет деревьев.
Звучит как итерация, а такие задачи в R решаются при помощи цикла
Запускаем ее 4 раза при помощи map, получаем список из 4-х деревьев. Тем же🪄
Так можно построить и 100, и 1000 деревьев, попробуйте. О том, что с ними делать дальше — чуть позже. #филогенетика
stylo(), которая вызывает GUI в одноименном пакете, то можно заметить, что за консенсусное дерево там отвечает пакет для работы с филогенетическими данными под названием Ape Что делает машинка, когда вы заказываете у нее консенсусное дерево? Принимает на входе матрицу с 1 … N столбцами, в которых хранится частотность для слов. Потом отбирает первые сколько-то слов (скажем, сотню или сколько скажете), считает расстояние, строит на основе матрицы расстояний дерево, складывает его в корзинку. Потом берет следующую сотню слов, считает расстояние, строит дерево, складывает в корзинку… Ну вы поняли. Получается букет деревьев.
Звучит как итерация, а такие задачи в R решаются при помощи цикла
for или пакета purrr. Функции map() из пакета purrr надо вручить другую функцию, у меня это пользовательская get_tree(). Она берет случайные 100 столбцов в таблице с частотностями galbraith из пакета Stylо, считает евклидово расстояние между документами и строит дерево. library(stylo)
library(ape)
library(purrr)
data("galbraith")
df <- as.data.frame.matrix(galbraith)[c(1,2, 9, 10, 16, 17),]
get_tree <- function(df) {
X <- df[ , sample(3000, replace = T, size = 100)]
distmx <- dist(scale(X))
tr <- as.phylo(hclust(distmx))
tr
}
Запускаем ее 4 раза при помощи map, получаем список из 4-х деревьев. Тем же
map() печатаем сразу четыре дерева одной строчкой кода 🧙set.seed(123)
result <- map(1:4, ~get_tree(df))
# отдельные деревья
par(mfrow = c(2, 2), mar = c(1,1,1,1))
map(1:4, ~print(plot(result[[.]])))
Так можно построить и 100, и 1000 деревьев, попробуйте. О том, что с ними делать дальше — чуть позже. #филогенетика
Please open Telegram to view this post
VIEW IN TELEGRAM
rdrr.io
stylo source: R/stylo.R
R/stylo.R defines the following functions: stylo
❤6
На результат стилометрического исследования древнегреческих текстов может влиять не только жанр и тема (как у нормальных людей), но и особенности кодировки, диалекта и даже неприятная издательская практика писать по-разному несобственные дифтонги (т.е. дифтонги с первым долгим гласным).
Как объяснить машине, что iota adscriptum и iota subscriptum — это одно и то же? И к автору не имеет никакого отношения. Для гласных, которые всегда долгие, можно настроить автозамену. Вот мое решение:
А вот с альфой так поступить не получится, потому что αι не всегда можно заменить на ᾳ. В раздумьях.
#regex
Как объяснить машине, что iota adscriptum и iota subscriptum — это одно и то же? И к автору не имеет никакого отношения. Для гласных, которые всегда долгие, можно настроить автозамену. Вот мое решение:
library(stringr)
ortho_fix <- function(string) { string %>% str_replace_all( c("ῶι"="ῷ", "ωι"="ῳ", "ὧι"="ᾧ", "ὦι"="ᾦ", "ηι"="ῃ", "ῆι"="ῇ", "ἦι"="ᾖ", "ἧι"="ᾗ")) }
test_string <- c("ἑκάστωι ἔργωι καὶ πράγματι", "σὺν πολλῶι χρόνωι", "καὶ τῆι ἐξ ὀλίγου χρόνου εὐδοξίαι")
test_string %>% ortho_fix()
А вот с альфой так поступить не получится, потому что αι не всегда можно заменить на ᾳ. В раздумьях.
#regex
🤝6❤3👍1
RAntiquity
На результат стилометрического исследования древнегреческих текстов может влиять не только жанр и тема (как у нормальных людей), но и особенности кодировки, диалекта и даже неприятная издательская практика писать по-разному несобственные дифтонги (т.е. дифтонги…
За модой следить некогда. Следим за типографскими конвенциями. Этих значит тоже надо добавить в
ortho_fix()🙈5😱2
Forwarded from DH CLOUD
Вестник Digital Humanities: что делают цифровые гуманитарии с большими языковыми моделями и где смотреть (и оценивать!) достижения DH-хозяйства
Несмотря на непрекращающиеся драматические события в разных точках планеты, научная DH-жизнь продолжается. А значит, и мы продолжаем рассказывать о ней в новых выпусках «Вестника Digital Humanities». В мартовском выпуске — отчет о недавней немецкой DH-конференции и LLM-воркшопе на ней, статья о конкуренции гуманитариев с большими языковыми моделями, анонс семинара по цифровому распознаванию рукописей и приглашение проголосовать за DH-awards этого года.
https://mailchi.mp/d654715e70ab/digital-humanities-16506350?e=ed4cb54ab6
Несмотря на непрекращающиеся драматические события в разных точках планеты, научная DH-жизнь продолжается. А значит, и мы продолжаем рассказывать о ней в новых выпусках «Вестника Digital Humanities». В мартовском выпуске — отчет о недавней немецкой DH-конференции и LLM-воркшопе на ней, статья о конкуренции гуманитариев с большими языковыми моделями, анонс семинара по цифровому распознаванию рукописей и приглашение проголосовать за DH-awards этого года.
https://mailchi.mp/d654715e70ab/digital-humanities-16506350?e=ed4cb54ab6
❤5🔥2
Наука (в широком смысле techne) отличается от ненауки рефлексией по поводу инструментов и методов. Землемер вполне способен на практике применять теорему Пифагора, но он никогда не задумается о проблеме соизмеримости, связанной с этой теоремой. Дачник, соорудивший стол из старой дверной створки, — еще не плотник. Обращение к цифровым методам, когда оно диктуется не внутренней потребностью исследователя, а внешними обстроятельствами, неизбежно принимает вид «бриколажа».
К. Леви-Стросс. Неприрученная мысль (1962).
Форсированная цифровизация — это массовое производство бриколеров. А науке, как учил великий Гумбольдт, нужны свобода и досуг.
В наши дни бриколер — это тот, кто творит сам, самостоятельно, используя подручные средства в отличие от средств, используемых специалистом. …Бриколер способен выполнить огромное число разнообразных задач. Но в отличие от инженера ни одну из них он не ставит в зависимость от добывания сырья и инструментов, задуманных и обеспечиваемых в соответствии с проектом: мир его инструментов замкнут, и правило игры всегда состоит в том, чтобы устраиваться с помощью «подручных средств», то есть на каждый момент с ограниченной совокупностью причудливо подобранных инструментов и материалов… Совокупность бриколерских средств определяется не каким-либо проектом (что бы предполагало, как у инженера, существование и наборов инструментов, и проектов разного рода, по меньшей мере в теории); она определяется лишь своим инструментальным использованием, иначе говоря, если употребить язык бриколера, элементы собираются и сохраняются по принципу «это может всегда сгодиться».
К. Леви-Стросс. Неприрученная мысль (1962).
Форсированная цифровизация — это массовое производство бриколеров. А науке, как учил великий Гумбольдт, нужны свобода и досуг.
🔥10❤5
⚡ 6 апреля 2024 г. для студентов гуманитарного факультета НИУ ВШЭ стартует новый факультатив под названием «Количественные методы в гуманитарных науках: критическое введение».
✨ Среди авторов этого курса — руководитель образовательной программы «Цифровые методы в гуманитарных науках» Борис Орехов и преподаватель этой программы Ольга Алиева.
🤔 Уровень теоретического осмысления “цифрового поворота” далеко не всегда успевает за технологическим прогрессом. Из-за этого даже в серьезной литературе можно встретить довольно наивное представление о том, что главная заслуга количественных методов — это повышение “объективности” и “точности”.
💡 Существующие учебники и онлайн-курсы, заявленные как обзор цифровых методов для гуманитариев, обычно представляют собой практические пособия по программированию и избегают теоретических вопросов. Наш курс поможет критически взглянуть на инструментарий DH в современных гуманитарных науках.
‼️ Курс будет полезен не только студентам бакалавриата, на которых он рассчитан, но и более широкой аудитории студентов и исследователей, которые пытаются разобраться в новейшем цифровом инструментарии. В частности, факультатив станет хорошим введением в проблематику для тех, кто рассматривает для себя возможность поступления на магистерскую программу «Цифровые методы в гуманитарных науках».
🔗 Всю информацию о курсе, видео лекций и полезные ссылки мы будем собирать на сайте https://criticaldh.ru/
Первая лекция курса состоится уже 6 апреля🔽 #criticaldh
🤔 Уровень теоретического осмысления “цифрового поворота” далеко не всегда успевает за технологическим прогрессом. Из-за этого даже в серьезной литературе можно встретить довольно наивное представление о том, что главная заслуга количественных методов — это повышение “объективности” и “точности”.
Первая лекция курса состоится уже 6 апреля
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥8🔥4✍3
RAntiquity
⚡ 6 апреля 2024 г. для студентов гуманитарного факультета НИУ ВШЭ стартует новый факультатив под названием «Количественные методы в гуманитарных науках: критическое введение». ✨ Среди авторов этого курса — руководитель образовательной программы «Цифровые…
⚡ Неужели Вселенная состоит из потоков данных и действительно ценность каждого определяется вкладом в обработку данных? Зачем цифровые гуманитарии собирают данные о прошлом, настоящем и будущем? И как эти данные смогут помочь понять мир вокруг нас?
⭐ Обо всем этом в первой лекции курса “Количественные методы в гуманитарных науках” расскажет Андрей Володин — кандидат исторических наук, доцент кафедры исторической информатики исторического факультета МГУ, руководитель Института цифровых гуманитарных исследований СФУ.
🗓 Лекция состоится 6 апреля 2024 г. онлайн на платформе Zoom в 13:00 по Москве (ссылка). #criticaldh
⭐ Обо всем этом в первой лекции курса “Количественные методы в гуманитарных науках” расскажет Андрей Володин — кандидат исторических наук, доцент кафедры исторической информатики исторического факультета МГУ, руководитель Института цифровых гуманитарных исследований СФУ.
🗓 Лекция состоится 6 апреля 2024 г. онлайн на платформе Zoom в 13:00 по Москве (ссылка). #criticaldh
🔥10❤3👍3
Продолжаю разбираться с филогенетическими методами.
Представьте, что у вас есть такая нехитрая сеть, как на рис. 1. Расстояние между двумя узлами определяется как длина кратчайшего пути между ними. Поэтому несложно посчитать матрицу расстояний на основе сети. Я это сделала на листочке, а результат сохранила в R, он на второй картинке. Можете перепроверить 😊
Но верно и обратное! От матрицы расстояний можно перейти к длине ребер. Для нашей простой матрицы длина горизонтальных ребер, например, считается по формуле:
Аналогичным образом считается длина вертикальных ребер. Формула сработает максимум для четырех таксонов, для более сложных структур понадобится метод наименьших квадратов, но пока смотрим простой пример.
Чтобы не мучиться с ручными подсчетами, берем функцию neighborNet из пакета phangorn (за наводку спасибо agricolamz).
Если аргументу edge.label оставить значение по умолчанию, то на картинке увидите номер сплита (на рис. 3 красным). У каждого сплита есть свой вес (рассчитанный методом наименьших квадратов). Его можно достать из объекта nnet:
Это можно понять так: чтобы попасть из пунка b в пункт d, нужно сложить веса для сплитов 4, 5 и 1:
Это вернет нам 0.09. Сверяемся с матрицей расстояний — все верно! #филогенетика
Представьте, что у вас есть такая нехитрая сеть, как на рис. 1. Расстояние между двумя узлами определяется как длина кратчайшего пути между ними. Поэтому несложно посчитать матрицу расстояний на основе сети. Я это сделала на листочке, а результат сохранила в R, он на второй картинке. Можете перепроверить 😊
mx <- matrix(data = c(0, 0.07, 0.12, 0.12, 0.07, 0, 0.13, 0.09, 0.12, 0.13, 0, 0.06, 0.12, 0.09, 0.06, 0), nrow = 4)
colnames(mx) <- c("a", "b", "c", "d")
rownames(mx) <- colnames(mx)
dm <- as.dist(mx)
Но верно и обратное! От матрицы расстояний можно перейти к длине ребер. Для нашей простой матрицы длина горизонтальных ребер, например, считается по формуле:
1/2 (max(D[a,d]+D[b,c], D[a,c]+D[b,d])-D[a,b] – D[d,c])
1/2 (max(0.12+0.13, 0.12+0.09) – 0.07 – 0.06) = 0.06
Аналогичным образом считается длина вертикальных ребер. Формула сработает максимум для четырех таксонов, для более сложных структур понадобится метод наименьших квадратов, но пока смотрим простой пример.
Чтобы не мучиться с ручными подсчетами, берем функцию neighborNet из пакета phangorn (за наводку спасибо agricolamz).
library(phangorn)
nnet <- neighborNet(dm)
plot(nnet, show.edge.label = T, edge.label = nnet$edge.length, edge.color = "grey", col.edge.label = "navy")
Если аргументу edge.label оставить значение по умолчанию, то на картинке увидите номер сплита (на рис. 3 красным). У каждого сплита есть свой вес (рассчитанный методом наименьших квадратов). Его можно достать из объекта nnet:
w = attr(nnet$splits, "weights")
Это можно понять так: чтобы попасть из пунка b в пункт d, нужно сложить веса для сплитов 4, 5 и 1:
w[4] + w[5] + w[1]
Это вернет нам 0.09. Сверяемся с матрицей расстояний — все верно! #филогенетика
👍5❤1🤯1
RAntiquity
Продолжаю разбираться с филогенетическими методами. Представьте, что у вас есть такая нехитрая сеть, как на рис. 1. Расстояние между двумя узлами определяется как длина кратчайшего пути между ними. Поэтому несложно посчитать матрицу расстояний на основе…
Не думаю, что этот пост сделает меня популярнее в кругу творческой молодежи, но, потратив несколько дней на чтение технической документации, должна сказать. Снова об алгоритме NeighborNet.
В целом, это нечто среднее между идеальной иерархией дерева (в жизни такое редко встречается) и безнадежным лабиринтом сети. Если вам непонятно, что такое безнадежный лабиринт (вдруг вам не приходилось вести долгую безрезультатную переписку по корпоративной почте?), то попробуйте запустить такой код:
Вы увидитепаутинку круговую сеть для 12 таксонов. Выглядит мило, в но жизни с этим лучше не сталкиваться. В такой сети представлены все возможные разбиения, и у всех разбиений равный вес.
NeighborNet работает в два шага:
- Сначала строит круговую раскладку для таксонов таким образом, чтобы минимизировать расстояния между парами кластеров, каждый из которых включает в себя 1 или 2 таксона.
- Потом считает веса для сплитов. На этом этапе некоторые ребра удаляются, а другие вытягиваются сообразно весам. Чем длиннее ребро, тем больше вес сплита.
Сплит — это разбиение совокупности таксонов на два непустых множества. Если вернуться к объекту nnet из вчерашнего кода, можно посмотреть, какие сплиты возможны для 4 таксонов из вчерашнего примера:
Первые четыре сплита довольно заурядны: мы просто откусываем по одному углу от нашего прямоугольника. Пятый сплит делит прямоугольник поперек, а шестой — вдоль.
Дальше алгоритм для каждого сплита считает, какие пары таксонов оказались с разных сторон сплита. Получается матрица вроде той, что представлена на картинке. В ней ряды соответствуют парам таксонов, ab, bc и т.д., а столбцы — сплитам. Единица означает, что пара оказалась «разбита» в этом сплите. Чем больше единиц в сплите, тем больше его совокупный вес. #филогенетика
В целом, это нечто среднее между идеальной иерархией дерева (в жизни такое редко встречается) и безнадежным лабиринтом сети. Если вам непонятно, что такое безнадежный лабиринт (вдруг вам не приходилось вести долгую безрезультатную переписку по корпоративной почте?), то попробуйте запустить такой код:
library(phangorn)
plot(as.networx(allCircularSplits(12)))
Вы увидите
NeighborNet работает в два шага:
- Сначала строит круговую раскладку для таксонов таким образом, чтобы минимизировать расстояния между парами кластеров, каждый из которых включает в себя 1 или 2 таксона.
- Потом считает веса для сплитов. На этом этапе некоторые ребра удаляются, а другие вытягиваются сообразно весам. Чем длиннее ребро, тем больше вес сплита.
Сплит — это разбиение совокупности таксонов на два непустых множества. Если вернуться к объекту nnet из вчерашнего кода, можно посмотреть, какие сплиты возможны для 4 таксонов из вчерашнего примера:
as.matrix(nnet$splits)
Первые четыре сплита довольно заурядны: мы просто откусываем по одному углу от нашего прямоугольника. Пятый сплит делит прямоугольник поперек, а шестой — вдоль.
Дальше алгоритм для каждого сплита считает, какие пары таксонов оказались с разных сторон сплита. Получается матрица вроде той, что представлена на картинке. В ней ряды соответствуют парам таксонов, ab, bc и т.д., а столбцы — сплитам. Единица означает, что пара оказалась «разбита» в этом сплите. Чем больше единиц в сплите, тем больше его совокупный вес. #филогенетика
🔥6🤯3👍2
RAntiquity
Не думаю, что этот пост сделает меня популярнее в кругу творческой молодежи, но, потратив несколько дней на чтение технической документации, должна сказать. Снова об алгоритме NeighborNet. В целом, это нечто среднее между идеальной иерархией дерева (в жизни…
Дальше самое интересное. Даны матрица сплитов А как на картинке выше и исходная матрица расстояний D, ее мы тоже в прошлый раз видели.
Необходимо рассчитать длину ребра таким образом, чтобы кратчайшие пути между таксонами были максимально приближены к исходной матрице расстояний.
То есть нам надо найти такой вектор b, при умножении на который матрица A даст вектор филетических расстояний (phyletic distances) p, максимально похожий на исходную матрицу расстояний D. Иными словами, нам надо решить уравнение p = Ab таким образом, чтобы sum (D-p)^2 было минимальным.
Это делается по формуле на картинке. Немного упрощая, под капотом функция считает так (dm из вчерашнего кода):
Если распечатать beta, то мы увидим знакомые по вчерашней картинке значения длины ребер: 0.03, 0.02, 0.03, 0.01, 0.06, 0.02.
Теперь перепроверим: произведение A и b должно дать нам (примерно) исходную матрицу расстояний D.
Ура! Все получилось. Наибольшее значение beta (0.6) соответствует пятому сплиту, который делил наш прямоугольник поперек.
Как уже говорилось, для 4-х таксонов соответствие может быть полным. Это легко проверить, достав атрибут RSS (Residual Sum of Squares, остаточная сумма квадратов) из объекта nnet, который мы создали.
#филогенетика
Необходимо рассчитать длину ребра таким образом, чтобы кратчайшие пути между таксонами были максимально приближены к исходной матрице расстояний.
То есть нам надо найти такой вектор b, при умножении на который матрица A даст вектор филетических расстояний (phyletic distances) p, максимально похожий на исходную матрицу расстояний D. Иными словами, нам надо решить уравнение p = Ab таким образом, чтобы sum (D-p)^2 было минимальным.
Это делается по формуле на картинке. Немного упрощая, под капотом функция считает так (dm из вчерашнего кода):
y <- dm[lower.tri(dm)] #нижний треугольник матрицы расстояний D
# матрица сплитов А как на картинке
A = matrix(data = c(1,1,1,0,0,0, 1,0,0,1,1,0, 0,1,0,1,0,1, 0,0,1,0,1,1, 0,1,1,1,1,0, 1,0,1,1,0,1), nrow = 6)
# метод наименьших квадратов
# A умножаем на A транспонированную
Dmat <- crossprod(A) # Dmat == t(A) %*% A
# A умножаем на у
dvec <- crossprod(A, y)
# решаем систему уравнений
beta <- solve(Dmat, dvec, tol = -1)
Если распечатать beta, то мы увидим знакомые по вчерашней картинке значения длины ребер: 0.03, 0.02, 0.03, 0.01, 0.06, 0.02.
Теперь перепроверим: произведение A и b должно дать нам (примерно) исходную матрицу расстояний D.
dplyr::near(as.vector(A %*% beta), y)
Ура! Все получилось. Наибольшее значение beta (0.6) соответствует пятому сплиту, который делил наш прямоугольник поперек.
Как уже говорилось, для 4-х таксонов соответствие может быть полным. Это легко проверить, достав атрибут RSS (Residual Sum of Squares, остаточная сумма квадратов) из объекта nnet, который мы создали.
round(attr(nnet$splits, "RSS"), 3)
#филогенетика
🔥7👍2
Forwarded from Цифровой филолог (Даня Скоринкин)
Modeling Narrative Revelation (Andrew Piper, Hao Xu, Eric D. Kolaczyk, 2023)
Любопытная работа из области компьютерной нарратологии с попыткой подсчитать скорость “раскрытия информации” (revelation) в художественных и нехудожественных текстах.
🕰 Авторы статьи начинают с очевидного наблюдения: время в книжном нарративе может сжиматься и удлинняться по воле автора. Вот в одной строчке прошел век, а вот на следующих десяти страницах — минута. Писатель может ускорять и замедлять развитие событий, а еще их детализацию и скорость понимания читателем всех обстоятельств происходящего. Скажем, в детективе гораздо больше всего становится понятно читателю в самом конце, а время в этом самом конце обычно быстро-быстро прокручивается вспять, хотя до этого еле-еле текло по ходу расследования…
📈Все это делает нелинейной и скорость narrative revelation — раскрытия информации читателю. Авторы статьи сделали попытку смоделировать этот самый revelation. Для измерения того, насколько каждый следующий фрагмент текста “нов” (и соответственно сколько новой “информации” он раскрывает читателю) они использовали расстояние Кульбака — Лейблера. Это такая мера близости двух вероятностных распределений, восходящая к старой доброй шенноновской энтропии. Два распределения берутся из двух последовательных фрагментов текста (текущий и предыдущий) длиной в 1000 слов каждый, вероятности — частотности слов. И так попарно перебираем весь текст с шагом в 1000 слов, смотрим, где происходят резкие изменения… Как видите, не rocket science, но авторы статьи считают, что это позволяет ответить на вопрос (цитата):
📚 Исследование проводили на корпусе из 2700 современных (2001–2021) английских книг 12 разныж жанров (датасет CONLIT). Впрочем, “жанры” эти как обычно напоминают Борхесову классификацию:
- Biography
- Bestseller
- History
- Memoir
- Middle school
- Assorted non-fiction
- Mystery
- New York Times reviewed
- Prizelists
- Romance
- Science-Fiction
- Young Adult
мда ¯\_(ツ)_/¯…но по крайней мере всё это удобно делится на Fiction и Non-fiction🙂
🍰Что в итоге удалось найти?
Во-первых, что среднее “раскрытие информации” (revelation) гораздо выше в non-fiction, чем в fiction. С одной стороны, это “тривиальный” результат: от non-fiction никто не ждет интриг, саспенса и загадок, а наоборот ждут максимальной информативноcти с первых страниц. С другой — какой-никакой sanity check, что метод м.б. работает.
Во-вторых, что в fiction гораздо больше новой информации раскрывают книги “престижные” (получатели премий), а бестселлеры — меньше. Авторы интерпретируют это таким образом, что “престижные” книги более сложны и готовы вываливать на читателя больше информации. Но можно и предположить, что у них меньше потребности скрывать и держать интригу, удерживая читателя дешевыми трюками и саспенсом.
В-третьих, книги для детей и молодежи отличаются не только низким средним раскрытием информации, но и самой линейной динамикой “раскрытия информации” по ходу действия: в отличие от других жанров, в них не происходит резкого роста “раскрытия” ближе к концу.
🤔 Конечно, способ моделирования/операционализации “revelation”-а в статье довольно механистический и вызывает много вопросов. Но сам заход на Modeling Narrative Revelation кажется достойным внимания. Думаю, на эту тему будут новые заходы с новым инструментарием 🔬👩🔬🧑🔬
Ссылка на статью
Любопытная работа из области компьютерной нарратологии с попыткой подсчитать скорость “раскрытия информации” (revelation) в художественных и нехудожественных текстах.
🕰 Авторы статьи начинают с очевидного наблюдения: время в книжном нарративе может сжиматься и удлинняться по воле автора. Вот в одной строчке прошел век, а вот на следующих десяти страницах — минута. Писатель может ускорять и замедлять развитие событий, а еще их детализацию и скорость понимания читателем всех обстоятельств происходящего. Скажем, в детективе гораздо больше всего становится понятно читателю в самом конце, а время в этом самом конце обычно быстро-быстро прокручивается вспять, хотя до этого еле-еле текло по ходу расследования…
📈Все это делает нелинейной и скорость narrative revelation — раскрытия информации читателю. Авторы статьи сделали попытку смоделировать этот самый revelation. Для измерения того, насколько каждый следующий фрагмент текста “нов” (и соответственно сколько новой “информации” он раскрывает читателю) они использовали расстояние Кульбака — Лейблера. Это такая мера близости двух вероятностных распределений, восходящая к старой доброй шенноновской энтропии. Два распределения берутся из двух последовательных фрагментов текста (текущий и предыдущий) длиной в 1000 слов каждый, вероятности — частотности слов. И так попарно перебираем весь текст с шагом в 1000 слов, смотрим, где происходят резкие изменения… Как видите, не rocket science, но авторы статьи считают, что это позволяет ответить на вопрос (цитата):
Given what has come immediately before, how surprising is any new passage?
📚 Исследование проводили на корпусе из 2700 современных (2001–2021) английских книг 12 разныж жанров (датасет CONLIT). Впрочем, “жанры” эти как обычно напоминают Борхесову классификацию:
- Biography
- Bestseller
- History
- Memoir
- Middle school
- Assorted non-fiction
- Mystery
- New York Times reviewed
- Prizelists
- Romance
- Science-Fiction
- Young Adult
мда ¯\_(ツ)_/¯…но по крайней мере всё это удобно делится на Fiction и Non-fiction🙂
🍰Что в итоге удалось найти?
Во-первых, что среднее “раскрытие информации” (revelation) гораздо выше в non-fiction, чем в fiction. С одной стороны, это “тривиальный” результат: от non-fiction никто не ждет интриг, саспенса и загадок, а наоборот ждут максимальной информативноcти с первых страниц. С другой — какой-никакой sanity check, что метод м.б. работает.
Во-вторых, что в fiction гораздо больше новой информации раскрывают книги “престижные” (получатели премий), а бестселлеры — меньше. Авторы интерпретируют это таким образом, что “престижные” книги более сложны и готовы вываливать на читателя больше информации. Но можно и предположить, что у них меньше потребности скрывать и держать интригу, удерживая читателя дешевыми трюками и саспенсом.
В-третьих, книги для детей и молодежи отличаются не только низким средним раскрытием информации, но и самой линейной динамикой “раскрытия информации” по ходу действия: в отличие от других жанров, в них не происходит резкого роста “раскрытия” ближе к концу.
🤔 Конечно, способ моделирования/операционализации “revelation”-а в статье довольно механистический и вызывает много вопросов. Но сам заход на Modeling Narrative Revelation кажется достойным внимания. Думаю, на эту тему будут новые заходы с новым инструментарием 🔬👩🔬🧑🔬
Ссылка на статью
👍6