Ви можете переглянути ключові слова / теги веб-перехресного веб-сайту.
Гілки як мережа
Один із способів зробити це - побудувати його як мережу на основі зв’язків між ключовими словами (як часто вони збігаються в одній публікації).
Коли ви використовуєте цей sql-скрипт для отримання даних про сайт (data.stackexchange.com/stats/query/edit/1122036)
select Tags from Posts where PostTypeId = 1 and Score >2
Потім ви отримуєте список ключових слів для всіх питань із оцінкою 2 або вище.
Ви можете вивчити цей список, побудувавши щось на зразок наступного:
Оновлення: те ж саме з кольором (на основі власних векторів матриці відношень) і без тега самодослідження
Ви можете трохи далі очистити цей графік (наприклад, вийняти теги, які не відносяться до статистичних понять, як теги програмного забезпечення; у наведеному вище графіку це вже зроблено для тегу 'r') та покращити візуальне представлення, але я думаю що це зображення вище вже показує гарну вихідну точку.
R-код:
#the sql-script saved like an sql file
network <- read.csv("~/../Desktop/network.csv", stringsAsFactors = 0)
#it looks like this:
> network[1][1:5,]
[1] "<r><biostatistics><bioinformatics>"
[2] "<hypothesis-testing><nonlinear-regression><regression-coefficients>"
[3] "<aic>"
[4] "<regression><nonparametric><kernel-smoothing>"
[5] "<r><regression><experiment-design><simulation><random-generation>"
l <- length(network[,1])
nk <- 1
keywords <- c("<r>")
M <- matrix(0,1)
for (j in 1:l) { # loop all lines in the text file
s <- stringr::str_match_all(network[j,],"<.*?>") # extract keywords
m <- c(0)
for (is in s[[1]]) {
if (sum(keywords == is) == 0) { # check if there is a new keyword
keywords <- c(keywords,is) # add to the keywords table
nk<-nk+1
M <- cbind(M,rep(0,nk-1)) # expand the relation matrix with zero's
M <- rbind(M,rep(0,nk))
}
m <- c(m, which(keywords == is))
lm <- length(m)
if (lm>2) { # for keywords >2 add +1 to the relations
for (mi in m[-c(1,lm)]) {
M[mi,m[lm]] <- M[mi,m[lm]]+1
M[m[lm],mi] <- M[m[lm],mi]+1
}
}
}
}
#getting rid of < >
skeywords <- sub(c("<"),"",keywords)
skeywords <- sub(c(">"),"",skeywords)
# plotting connections
library(igraph)
library("visNetwork")
# reduces nodes and edges
Ms<-M[-1,-1] # -1,-1 elliminates the 'r' tag which offsets the graph
Ms[which(Ms<50)] <- 0
ww <- colSums(Ms)
el <- which(ww==0)
# convert to data object for VisNetwork function
g <- graph.adjacency(Ms[-el,-el], weighted=TRUE, mode = "undirected")
data <- toVisNetworkData(g)
# adjust some plotting parameters some
data$nodes['label'] <- skeywords[-1][-el]
data$nodes['title'] <- skeywords[-1][-el]
data$nodes['value'] <- colSums(Ms)[-el]
data$edges['width'] <- sqrt(data$edges['weight'])*1
data$nodes['font.size'] <- 20+log(ww[-el])*6
data$edges['color'] <- "#eeeeff"
#plot
visNetwork(nodes = data$nodes, edges = data$edges) %>%
visPhysics(solver = "forceAtlas2Based", stabilization = TRUE,
forceAtlas2Based = list(nodeDistance=70, springConstant = 0.04,
springLength = 50,
avoidOverlap =1)
)
Ієрархічні гілки
Я вважаю, що подібні типи мережевих графіків пов'язані з деякою критикою щодо чисто розгалуженої ієрархічної структури. Якщо вам подобається, я думаю, що ви могли б виконати ієрархічну кластеризацію, щоб змусити її в ієрархічну структуру.
Нижче наводиться приклад такої ієрархічної моделі. Ще потрібно знайти належні назви груп для різних кластерів (але я не думаю, що ця ієрархічна кластеризація є гарним напрямком, тому я залишаю її відкритою).
Вимірювання відстані для кластеризації було встановлено методом проб та помилок (внесення змін, поки кластери не здадуться гарними).
#####
##### cluster
library(cluster)
Ms<-M[-1,-1]
Ms[which(Ms<50)] <- 0
ww <- colSums(Ms)
el <- which(ww==0)
Ms<-M[-1,-1]
R <- (keycount[-1]^-1) %*% t(keycount[-1]^-1)
Ms <- log(Ms*R+0.00000001)
Mc <- Ms[-el,-el]
colnames(Mc) <- skeywords[-1][-el]
cmod <- agnes(-Mc, diss = TRUE)
plot(as.hclust(cmod), cex = 0.65, hang=-1, xlab = "", ylab ="")
Автор StackExchangeStrike