专栏首页拓端tecdatR语言社区主题检测算法应用案例

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

原文链接:http://tecdat.cn/?p=5658

使用R检测相关主题的社区

创建主题网络

对于Project Mosaic,我正在通过分析抽象文本和共同作者社交网络来研究UNCC在社会科学和计算机和信息学方面的出版物。

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

数据准备

我们的第一步是加载作为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("Strength Between Topics Based On Word Probabilities", cex.main=.8)

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

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

clp <- cluster_label_prop(graph)class(clp)title("Community Detection in Topic Network", cex.main=.8)

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

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

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

动态可视化

在本节中,我们将使用visNetwork允许R中的交互式网络图的包。

首先,让我们调用库并运行visIgraph一个交互式网络,但是使用igraph图形设置在igraph结构(图形)上运行。

library(visNetwork)

这是一个良好的开端,但我们需要有关网络的更多详细信息。

让我们通过创建visNetwork数据结构走另一条路。为此,我们将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 # Node sizenodes$color.highlight.background <- "orange"

最后,让我们用交互式情节创建我们的网络。您可以使用鼠标滚轮进行缩放。

visNetwork(nodes, edges) %>%visOptions(highlightNearest = TRUE, selectedBy = "community", nodesIdSelection = TRUE)

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

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

最大的三个似乎是:

  • 计算(灰色,簇4)
  • 社交(绿蓝,簇1)
  • 健康(黄色,簇2)

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

本文分享自微信公众号 - 拓端数据部落(tecdat),作者:TRL 拓端研究室

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 重庆住房租赁市场现状分析:解读出租房市场的数据密码

    租赁市场正在发生变化。随着越来越多的行业巨头涌入,金融的、互联网的、房地产的,租赁地产成为炙手可热的风口。

    拓端
  • R语言中对文本数据进行主题模型topic modeling分析

    在文本挖掘中,我们经常收集一些文档集合,例如博客文章或新闻文章,我们希望将其分成自然组,以便我们可以分别理解它们。主题建模是对这些文档进行无监督分类的一种方法,...

    拓端
  • 采用SPSS Modeler的Web复杂网络对所有腧穴进行分析

    本次腧穴配伍关联规则分析,以针灸治疗FC的113例处方中使用频次在5次及以上的25种腧穴为关联对象。将前项最小支持度设为12%,规则的最小置信度设为85%,得出...

    拓端
  • MEF:SDN/NFV支撑下的第三类网络愿景

    编者按:如果说MEF(城域以太网论坛)的第三类网络愿景在前几年的时候还是个美好的愿望,那么在今年SDN/NFV技术的发展,成为了第三类网络实现的基础,在MEF主...

    SDNLAB
  • 【LeetCode第178场周赛】5345. 通过投票对团队排名

    如果在二叉树中,存在一条一直向下的路径,且每个点的数值恰好一一对应以 head 为首的链表中每个节点的值,那么请你返回 True ,否则返回 False 。

    韩旭051
  • Python3之命名关键字参数

    在*后面的参数都是命名关键字参数,传值的时候必须按照关键字参数进行传值,*args后面的参数也是命名关键字参数,例如此种形式:

    py3study
  • 【自然语言处理(一)】相关基础技能

    2.正则表达式(网上很多教程,关键还是理解每一个代表什么意思,还要多写,其实没什么大不了,这里就不写了)就只写写python中是怎么用的

    绝命生
  • python random模块

    随机输出一个0~4的数字和range()输出的数字,去比较。猜对了,就是字母,否则是数字

    py3study
  • python爬虫常见面试题(一)

      之所以在这里写下python爬虫常见面试题及解答,一是用作笔记,方便日后回忆;二是给自己一个和大家交流的机会,互相学习、进步,希望不正之处大家能给予指正;三...

    py3study
  • python3学习之列表

    备注:append将obj作为一个整体追加,无论obj是字符串、数字、字典、列表等,当是字典时全部插入,跟L.extend(iterable) 不同

    py3study

扫码关注云+社区

领取腾讯云代金券