分享

R语言社区主题检测算法应用案例

 拓端数据 2024-05-14 发布于浙江

原文链接:http:///?p=5658

通过分析文本和共同作者社交网络来研究社会科学、计算机和信息学方面的出版物点击文末“阅读原文”获取完整代码数据

相关视频

创建主题网络

我遇到的一个问题是:如何衡量主题之间的关系(相关性)?我想创建一个连接类似主题的网络可视化,并帮助用户更轻松地浏览大量主题。

数据准备

我们的第一步是加载LDA输出的主题矩阵。LDA有两个输出:词主题矩阵和文档主题矩阵。

作为加载文件的替代方法,您可以使用topicmodels包lda函数的输出来创建单词主题和文档主题矩阵。

# 加载到作者主题矩阵中,第一列是单词
author.topic <- read.csv("topics.csv", stringsAsFactors = F)
# 加载到单词-主题矩阵中,第一列是单词


# 重命名主题
colnames(author.topic) <- c("author\_name",name$topic\_name)

与标准LDA不同,我运行了“以作者为中心”的LDA,其中所有作者的摘要被合并并被视为每个作者的一个文档。这是因为我的最终目标是使用主题建模作为信息检索过程来确定研究人员的专业知识。

创建静态网络

在下一步中,我使用每个主题的单词概率之间的相关性创建一个网络。

首先,我决定只保留具有显着相关性(0.2+相关性)的关系(边)。我使用0.2,因为它对100个观察样本具有0.05的统计显着性水平。

cor_threshold <- .2
接下来,我们使用相关矩阵来创建igraph数据结构,删除所有具有小于0.2最小阈值相关性的边。

library(igraph)
让我们绘制一个简单的igraph网络。

title( cex.main=.8)

每个数字代表一个主题,每个主题都有编号识别它。


点击标题查阅往期内容

复杂网络社区发现算法聚类分析全国电梯故障数据和可视化:诊断电梯“安全之殇”

左右滑动查看更多

01

02

03

04

使用社区检测,特别是igraph中的标签传播算法来确定网络中的群集。

clp <- cluster\_label\_prop(graph)
class(clp)

社区检测发现了13个社区,以及多个孤立主题的社区(即没有任何联系的主题)。

与我最初的观察结果类似,该算法找到了我们在第一个图中识别的三个主要聚类,但也添加了其他较小的聚类,这些聚类似乎不适合三个主要聚类中的任何一个。

V(graph)$community <- clp$membership
V(graph)$degree <- degree(graph, v = V(graph))

动态可视化

在本节中,我们将使用visNetwork交互式网络图。

首先,让我们调用库并运行visIgraph交互式网络,设置在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(nodesedges) %>%visOptions(highlightNearest = TRUE, selectedBy = "community"nodesIdSelection = TRUE)

首先,有两个下拉菜单。第一个下拉列表允许您按名称查找任何主题(按单词概率排名前五个单词)。

第二个下拉列表突出显示了我们算法中检测到的社区。

最大的三个似乎是:

  • 计算(灰色,簇4)

  • 社交(绿蓝,簇1)

  • 健康(黄色,簇2)

检测到的较小社区有什么独特之处?你能解释一下吗?


    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多