Вы можете посмотреть ключевые слова / теги на веб-сайте Cross Validated.
Филиалы как сеть
Один из способов сделать это - построить его как сеть, основанную на отношениях между ключевыми словами (как часто они совпадают в одном и том же сообщении).
Когда вы используете этот 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