คุณสามารถดูคำหลัก / แท็กของเว็บไซต์ที่ตรวจสอบข้ามได้
สาขาเป็นเครือข่าย
วิธีการหนึ่งในการทำเช่นนี้คือการพล็อตมันเป็นเครือข่ายโดยยึดตามความสัมพันธ์ระหว่างคำหลัก
เมื่อคุณใช้ sql-script นี้เพื่อรับข้อมูลของไซต์จาก (data.stackexchange.com/stats/query/edit/1122036)
select Tags from Posts where PostTypeId = 1 and Score >2
จากนั้นคุณจะได้รับรายการคำหลักสำหรับคำถามทั้งหมดที่มีคะแนนตั้งแต่ 2 คะแนนขึ้นไป
คุณสามารถสำรวจรายการนั้นโดยการพล็อตเรื่องดังนี้:
อัปเดต: เหมือนกันกับสี (ขึ้นอยู่กับ eigenvectors ของเมทริกซ์ความสัมพันธ์) และไม่มีแท็กศึกษาด้วยตนเอง
คุณสามารถทำความสะอาดกราฟนี้ได้อีกเล็กน้อย (เช่นลบแท็กที่ไม่เกี่ยวข้องกับแนวคิดเชิงสถิติเช่นแท็กซอฟต์แวร์ในกราฟด้านบนสิ่งนี้ทำไว้แล้วสำหรับแท็ก '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