通过分析文本和共同作者社交网络来研究社会科学、计算机和信息学方面的出版物。
我遇到的一个问题是:如何衡量主题之间的关系(相关性)?我想创建一个连接类似主题的网络可视化,并帮助用户更轻松地浏览大量主题。
可下载资源
数据准备
我们的第一步是加载LDA输出的主题矩阵。LDA有两个输出:词主题矩阵和文档主题矩阵。
社团检测通常是指将网络中联系紧密的部分找出来,这些部分就称之为社团,那么也可以认为社团内部联系稠密,而社团之间联系稀疏 。显而易见,其中有一个非常重要的点,稠密是如何定义的。不管现在想到的定义是什么,但都包含顶点,边,度,或许还有路径这些字眼,它们有一个共同的特征–网络的结构。所以,社团检测侧重于找到网络中联系紧密的部分,而经常忽略节点的属性(attributes)。
聚类,顾名思义是将属于同一类的目标聚在一起,通常在聚类之前我们是不知道目标有哪些类型,这也是一种典型的无监督学习方法。那么现在来想想我们熟知的聚类方法:kmeans,层次聚类等。其中,最核心的一个部分是计算两个目标之间的距离(或者称为相似度),距离近则它俩是一类,距离远,那就自成一派,或者去找其它距离近的。当然,距离近只是其中一种方法,还有距离远或者怎么样,就看自己的判断。判断标准不是讨论的重点,重点是如何计算距离。欧式距离,曼哈顿距离,余弦相似度等,都是直接用目标特征构成的向量来计算的,没有考虑目标的边,度。所以,聚类侧重于找到一堆属性相似的目标,从而忽略了目标与目标之间的联系。
两者之间的关系已经很清楚啦,社团检测和聚类存在区别,但是呢,两者又是可以结合起来的。比如,我们现在有一个网络,只知道顶点和边的情况,顶点的属性是未知的。那么在做社团检测的时候,可以将顶点与顶点之间的关系构成一个邻接矩阵,通过一系列变化或者就这个邻接矩阵而言,将每个行看作一个属性,每个列看作目标,就可以很轻松的转为聚类,用聚类的方法求解。当邻接矩阵高维时,还可以先做降维处理。所以,两者并没有完全独立,只是考虑的角度不同,可以结合使用。现在社交网络方向有一个很热门的就是用 attributes来辅助进行社团检测,是对传统的社团检测和聚类方法的一种改进,两者优势互补。
作为加载文件的替代方法,您可以使用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)
每个数字代表一个主题,每个主题都有编号识别它。
使用社区检测,特别是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(nodes, edges) %>%visOptions(highlightNearest = TRUE, selectedBy = "community", nodesIdSelection = TRUE)
首先,有两个下拉菜单。第一个下拉列表允许您按名称查找任何主题(按单词概率排名前五个单词)。
第二个下拉列表突出显示了我们算法中检测到的社区。
最大的三个似乎是:
- 计算(灰色,簇4)
- 社交(绿蓝,簇1)
- 健康(黄色,簇2)
随时关注您喜欢的主题
检测到的较小社区有什么独特之处?你能解释一下吗?
可下载资源
关于作者
Kaizong Ye是拓端研究室(TRL)的研究员。在此对他对本文所作的贡献表示诚挚感谢,他在上海财经大学完成了统计学专业的硕士学位,专注人工智能领域。擅长Python.Matlab仿真、视觉处理、神经网络、数据分析。
本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。
非常感谢您阅读本文,如需帮助请联系我们!