È possibile esaminare le parole chiave / i tag del sito Web con convalida incrociata.
Filiali come rete
Un modo per farlo è quello di tracciarlo come una rete basata sulle relazioni tra le parole chiave (con quale frequenza coincidono nello stesso post).
Quando si utilizza questo sql-script per ottenere i dati del sito da (data.stackexchange.com/stats/query/edit/1122036)
select Tags from Posts where PostTypeId = 1 and Score >2
Quindi si ottiene un elenco di parole chiave per tutte le domande con un punteggio di 2 o superiore.
È possibile esplorare l'elenco elencando qualcosa di simile al seguente:
Aggiornamento: lo stesso con il colore (basato sugli autovettori della matrice di relazione) e senza il tag di autoapprendimento
Potresti ripulire ulteriormente questo grafico (ad esempio, estrarre i tag che non si riferiscono a concetti statistici come i tag software, nel grafico sopra questo è già stato fatto per il tag 'r') e migliorare la rappresentazione visiva, ma immagino che questa immagine sopra mostra già un buon punto di partenza.
R-code:
#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)
)
Rami gerarchici
Credo che questo tipo di grafici di rete di cui sopra si riferiscano ad alcune critiche riguardanti una struttura gerarchica puramente ramificata. Se vuoi, immagino che potresti eseguire un cluster gerarchico per forzarlo in una struttura gerarchica.
Di seguito è riportato un esempio di tale modello gerarchico. Uno dovrebbe ancora trovare i nomi dei gruppi appropriati per i vari cluster (ma, non credo che questo cluster gerarchico sia la buona direzione, quindi lo lascio aperto).
La misura della distanza per il clustering è stata trovata per tentativi ed errori (apportando regolazioni fino a quando i cluster appaiono belli.
#####
##### 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 ="")
Scritto da StackExchangeStrike