Bạn có thể xem xét các từ khóa / thẻ của trang web Xác thực chéo.
Chi nhánh như một mạng
Một cách để làm điều này là vẽ nó như một mạng dựa trên mối quan hệ giữa các từ khóa (tần suất chúng trùng nhau trong cùng một bài).
Khi bạn sử dụng tập lệnh sql này để lấy dữ liệu của trang web từ (data.stackexchange.com/stats/query/edit/1122036)
select Tags from Posts where PostTypeId = 1 and Score >2
Sau đó, bạn có được một danh sách các từ khóa cho tất cả các câu hỏi với số điểm từ 2 trở lên.
Bạn có thể khám phá danh sách đó bằng cách vẽ một cái gì đó như sau:
Cập nhật: giống với màu sắc (dựa trên các hàm riêng của ma trận quan hệ) và không có thẻ tự nghiên cứu
Bạn có thể làm sạch biểu đồ này thêm một chút nữa (ví dụ: loại bỏ các thẻ không liên quan đến các khái niệm thống kê như thẻ phần mềm, trong biểu đồ trên, điều này đã được thực hiện cho thẻ 'r') và cải thiện biểu diễn trực quan, nhưng tôi đoán rằng hình ảnh trên đã cho thấy một điểm khởi đầu tốt đẹp.
Mã 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)
)
Các nhánh phân cấp
Tôi tin rằng các loại biểu đồ mạng ở trên có liên quan đến một số lời chỉ trích liên quan đến cấu trúc phân cấp hoàn toàn phân nhánh. Nếu bạn thích, tôi đoán rằng bạn có thể thực hiện phân cụm theo cấp bậc để buộc nó thành một cấu trúc phân cấp.
Dưới đây là một ví dụ về mô hình phân cấp như vậy. Người ta vẫn cần tìm tên nhóm thích hợp cho các cụm khác nhau (nhưng, tôi không nghĩ rằng cụm phân cấp này là hướng tốt, vì vậy tôi để nó mở).
Đo khoảng cách cho phân cụm đã được tìm thấy bằng thử nghiệm và lỗi (thực hiện điều chỉnh cho đến khi các cụm xuất hiện tốt đẹp.
#####
##### 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 ="")
Được viết bởi StackExchangeStrike