R語言社區(qū)主題檢測算法應(yīng)用案例
原文鏈接:http://tecdat.cn/?p=5658
?
使用R檢測相關(guān)主題的社區(qū)

?
創(chuàng)建主題網(wǎng)絡(luò)
對于Project Mosaic,我正在通過分析抽象文本和共同作者社交網(wǎng)絡(luò)來研究UNCC在社會科學(xué)和計算機和信息學(xué)方面的出版物。
我遇到的一個問題是:如何衡量主題之間的關(guān)系(相關(guān)性)?特別是,我想創(chuàng)建一個連接類似主題的網(wǎng)絡(luò)可視化,并幫助用戶更輕松地瀏覽大量主題(在本例中為100個主題)。
?
數(shù)據(jù)準備
我們的第一步是加載作為LDA輸出的主題矩陣。LDA有兩個輸出:字主題矩陣和文檔主題矩陣。
作為加載平面文件的替代方法,您可以使用topicmodels包lda函數(shù)的輸出來創(chuàng)建任何單詞主題和文檔主題矩陣。
author.topic <- read.csv("./author_topics.csv", stringsAsFactors = F)
top.words <- word.topics[order(-word.topic[,i])]
name$topic_name[i] <- paste(top.words[1:5], collapse = " + ")
}
colnames(author.topic) <- c("author_name",name$topic_name)
與摘要是文檔的標準LDA不同,我運行了一個“以作者為中心”的LDA,其中所有作者的摘要被合并并被視為每個作者的一個文檔。我跑這是因為我的最終目標是使用主題建模作為信息檢索過程來確定研究人員的專業(yè)知識。
創(chuàng)建靜態(tài)網(wǎng)絡(luò)
在下一步中,我使用每個主題的單詞概率之間的相關(guān)性創(chuàng)建一個網(wǎng)絡(luò)。
首先,我決定只保留具有顯著相關(guān)性(20%+相關(guān)性)的關(guān)系(邊緣)。我使用20%,因為它對于100個觀察維基百科的樣本具有0.05的統(tǒng)計顯著性水平。
cor_threshold <- .2
接下來,我們使用相關(guān)矩陣來創(chuàng)建igraph數(shù)據(jù)結(jié)構(gòu),刪除所有具有小于20%最小閾值相關(guān)性的邊。
library(igraph)
讓我們繪制一個簡單的igraph網(wǎng)絡(luò)。
par(mar=c(0, 0, 3, 0))y30")title("Strength Between Topics Based On Word Probabilities", cex.main=.8)
?

每個數(shù)字代表一個主題,每個主題都有編號以識別它。
使用社區(qū)檢測,特別是igraph中的標簽傳播算法來確定網(wǎng)絡(luò)中的群集。
clp <- cluster_label_prop(graph)class(clp)title("Community Detection in Topic Network", cex.main=.8)
?
社區(qū)檢測發(fā)現(xiàn)了13個社區(qū),以及每個孤立主題的多個額外社區(qū)(即沒有任何聯(lián)系的主題)。
與我最初的觀察結(jié)果類似,該算法找到了我們在第一個圖中識別的三個主要聚類,但也添加了其他較小的聚類,這些聚類似乎不適合三個主要聚類中的任何一個。
?
V(graph)$community <- clp$membershipV(graph)$degree <- degree(graph, v = V(graph))
動態(tài)可視化
在本節(jié)中,我們將使用visNetwork允許R中的交互式網(wǎng)絡(luò)圖的包。
首先,讓我們調(diào)用庫并運行visIgraph一個交互式網(wǎng)絡(luò),但是使用igraph圖形設(shè)置在igraph結(jié)構(gòu)(圖形)上運行。
library(visNetwork)
?
這是一個良好的開端,但我們需要有關(guān)網(wǎng)絡(luò)的更多詳細信息。
讓我們通過創(chuàng)建visNetwork數(shù)據(jù)結(jié)構(gòu)走另一條路。為此,我們將igraph結(jié)構(gòu)轉(zhuǎn)換為visNetwork數(shù)據(jù)結(jié)構(gòu),然后將列表分成兩個數(shù)據(jù)幀:節(jié)點和邊緣。
data <- toVisNetworkData(graph)nodes <- data[[1]]
?
刪除沒有連接的節(jié)點(主題)(度= 0)。
nodes <- nodes[nodes$degree != 0,]
?
讓我們添加顏色和其他網(wǎng)絡(luò)參數(shù)來改善我們的網(wǎng)絡(luò)。
library(RColorBrewer)col <- brewer.pal(12, "Set3")[as.factor(nodes$community)]nodes$shape <- "dot"s$betweenness))+.2)*20 # Node sizenodes$color.highlight.background <- "orange"
?
最后,讓我們用交互式情節(jié)創(chuàng)建我們的網(wǎng)絡(luò)。您可以使用鼠標滾輪進行縮放。
visNetwork(nodes, edges) %>%visOptions(highlightNearest = TRUE, selectedBy = "community", nodesIdSelection = TRUE)
?
首先,有兩個下拉菜單。第一個下拉列表允許您按名稱查找任何主題(按單詞概率排名前五個單詞)。
第二個下拉列表突出顯示了我們算法中檢測到的社區(qū)。
最大的三個似乎是:
計算(灰色,簇4)
社交(綠藍,簇1)
健康(黃色,簇2)
檢測到的較小社區(qū)有什么獨特之處?你能解釋一下嗎?
?
