Here is a quick solution that you could optimize further:
pairs <- Map(\(x,y) rbind(combn(gsub(" ", "", strsplit(x, ";")[[1]]), 2), y), df$authors, df$type)
The list pairs can be converted back to a data.frame:
library(dplyr)
as.data.frame(t(do.call(cbind, pairs))) |>
count(V1, V2, y)