R Markdown
library(ndtv)
library(xml2)
library(data.table)
library(jsonlite)
library(magrittr)
inf <- fromJSON("https://dracor.org/api/corpora/ger/play/grabbe-napoleon")$cast
url <- "https://dracor.org/api/corpora/ger/play/grabbe-napoleon/segmentation"
xml <- read_xml(url, encoding = "UTF-8")
tit <- xml_find_all(xml, ".//sgm/@title") %>% xml_contents %>% as_list %>% unlist
wtt <- xml_find_all(xml, ".//sgm") %>% as_list
unl <- sapply(wtt, function(x) unlist(x))
seg <- data.frame(member = unlist(unl),scene = rep(tit,sapply(unl, length)), sceneid = rep(1:length(unl), sapply(unl, length)))
segdt <- as.data.table(seg)
segdt[, id:=member %>% as.factor %>% as.numeric]
segdt[,Nmem:= .N, by = scene]
segcomb <- segdt[Nmem>1, id %>% sort %>% combn(2) %>% t %>% as.data.table, by = .(scene, sceneid)]
segcomb[, onset := sceneid]
segcomb[, terminus := max(onset)+1]
setnames(segcomb, c("V1", "V2"), c("tail", "head"))
base.net <- network(segcomb[,c("tail", "head")], matrix.type = "edgelist", directed = F)
bibl <- unique(segdt[,.(id, member)])
bibl <- merge(bibl, inf, by.x = 'member', by.y = "id", all.x = T, all.y = F)
base.net %v% "vertex.id" <- bibl[id %in% (base.net %v% "vertex.names"), member] %>% as.character
base.net %v% "Name" <- bibl[id %in% (base.net %v% "vertex.names"), name] %>% as.character
base.net %v% "Sex" <- bibl[id %in% (base.net %v% "vertex.names"), sex]
#base.net %v% "IsGroup" <- bibl[id %in% (base.net %v% "vertex.names"), isGroup]
vs <- data.frame(onset=0, terminus=max(segcomb$onset)+1, vertex.id=sort(unique(c(segcomb$tail, segcomb$head))))
net.dyn <- networkDynamic(base.net=base.net, edge.spells=segcomb[,c(5:6, 3:4)], vertex.spells=vs)
## Edge activity in base.net was ignored
## Created net.obs.period to describe network
## Network observation period info:
## Number of observation spells: 1
## Maximal time range observed: 0 until 26
## Temporal mode: continuous
## Time unit: unknown
## Suggested time increment: NA
render.d3movie(net.dyn,
displaylabels = F,#displaylabels = T, label = net.dyn %v% "vertex.id", label.cex = 0.2,
vertex.tooltip = paste("<b>Name:</b>", (net.dyn %v% "vertex.id") , "<br>",
"<b>Sex:</b>", (net.dyn %v% "Sex")),
output.mode='htmlWidget')
## slice parameters:
## start:0
## end:26
## interval:1
## aggregate.dur:1
## rule:latest