原文链接:http://tecdat.cn/?p=5658
应用R检测相干主题的社区
创立主题网络
我通过剖析形象文本和独特作者社交网络来钻研社会科学、计算机和信息学方面的出版物。
我遇到的一个问题是:如何掂量主题之间的关系(相关性)?我想创立一个连贯相似主题的网络可视化,并帮忙用户更轻松地浏览大量主题。
数据筹备
咱们的第一步是加载LDA输入的主题矩阵。LDA有两个输入:词主题矩阵和文档主题矩阵。
作为加载文件的代替办法,您能够应用topicmodels包lda函数的输入来创立单词主题和文档主题矩阵。
# 加载到作者主题矩阵中,第一列是单词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,其中所有作者的摘要被合并并被视为每个作者的一个文档。这是因为我的最终目标是应用主题建模作为信息检索过程来确定钻研人员的专业知识。
创立动态网络
在下一步中,我应用每个主题的单词概率之间的相关性创立一个网络。
首先,我决定只保留具备显着相关性(20%+相关性)的关系(边)。我应用20%,因为它对100个察看维基百科的样本具备0.05的统计显着性程度。
cor_threshold <- .2接下来,咱们应用相关矩阵来创立igraph数据结构,删除所有具备小于20%最小阈值相关性的边。library(igraph)让咱们绘制一个简略的igraph网络。par(mar=c(0, 0, 3, 0))y30")title( cex.main=.8)
每个数字代表一个主题,每个主题都有编号以辨认它。
应用社区检测,特地是igraph中的标签流传算法来确定网络中的群集。
clp <- cluster\_label\_prop(graph)class(clp)
社区检测发现了13个社区,以及每个孤立主题的多个社区(即没有任何分割的主题)。
与我最后的察看后果相似,该算法找到了咱们在第一个图中辨认的三个次要聚类,但也增加了其余较小的聚类,这些聚类仿佛不适宜三个次要聚类中的任何一个。
V(graph)$community <- clp$membershipV(graph)$degree <- degree(graph, v = V(graph))
动静可视化
在本节中,咱们将应用visNetwork容许R中的交互式网络图的包。
首先,让咱们调用库并运行visIgraph一个交互式网络,然而应用igraph图形设置在igraph构造(图形)上运行。
咱们须要无关网络的更多详细信息。
咱们通过创立visNetwork数据结构,而后将列表分成两个数据帧:节点和边。
data <- toVisNetworkData(graph)nodes <- data\[\[1\]\]
删除没有连贯的节点(主题)(度= 0)。
nodes <- nodes\[nodes$degree != 0,\]
让咱们增加色彩和其余网络参数来改善咱们的网络。
library(RColorBrewer)col <- brewer.pal(12, "Set3")\[as.factor(nodes$community)\]nodes$shape <- "dot"s$betweenness))+.2)*20 # 节点大小nodes$color.highlight.background <- "orange"
最初,让咱们用交互式图表创立咱们的网络。您能够应用鼠标滚轮进行缩放。
visNetwork(nodes, edges) %>%visOptions(highlightNearest = TRUE, selectedBy = "community", nodesIdSelection = TRUE)
首先,有两个下拉菜单。第一个下拉列表容许您按名称查找任何主题(按单词概率排名前五个单词)。
第二个下拉列表突出显示了咱们算法中检测到的社区。
最大的三个仿佛是:
- 计算(灰色,簇4)
- 社交(绿蓝,簇1)
- 衰弱(黄色,簇2)
检测到的较小社区有什么独特之处?你能解释一下吗?