आप क्रॉस मान्य वेबसाइट के कीवर्ड / टैग देख सकते हैं ।
एक नेटवर्क के रूप में शाखाएँ
ऐसा करने का एक तरीका यह है कि इसे कीवर्ड के बीच संबंधों के आधार पर एक नेटवर्क के रूप में प्लॉट किया जाए (वे एक ही पोस्ट में कितनी बार मेल खाते हैं)।
जब आप साइट का डेटा (data.stackexchange.com/stats/query/edit/1122036) प्राप्त करने के लिए इस sql-script का उपयोग करते हैं
select Tags from Posts where PostTypeId = 1 and Score >2
फिर आप 2 या अधिक अंक वाले सभी प्रश्नों के लिए कीवर्ड की एक सूची प्राप्त करते हैं।
आप कुछ इस तरह की साजिश रचकर उस सूची का पता लगा सकते हैं:
अपडेट: रंग के साथ समान (संबंध मैट्रिक्स के eigenvectors के आधार पर) और स्व-अध्ययन टैग के बिना
आप इस ग्राफ को थोड़ा और साफ़ कर सकते हैं (उदाहरण के लिए वे टैग निकाल लें जो सॉफ्टवेयर टैग जैसी सांख्यिकीय अवधारणाओं से संबंधित नहीं हैं। ऊपर दिए गए ग्राफ़ में यह पहले से ही '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 द्वारा लिखित