一般的聊天记录分析教程主要分析下聊天频率以及聊天话题,具体可见上一篇教程。R || 聊天记录分析(一) 但是在一个有组织的社群中,群成员可能会通过互相的对话产生一些联系。我在思考如何展示聊天中产生的联系时想到了社交网络分析。所以下面决定展示一下如何对聊天记录信息绘制社交网络图。


一、思路

(1)在一个活跃有组织的群里,常常一个话题仅有少数几个人参与,就比如下面这张图中的对话。在这段对话中,三人互相回复次数多,时间比较紧密。长期群聊天中,或许会形成一个聚集的现象,就比如群内某几个人对话居多。

(2)按照前面的思路,我们可以看一看群中谁与谁关系更紧密。每个人发言后5分钟内(可自行定义时间差)接话的所有成员定义为Ta当时的紧密关联人(一个成员连续出现多次仅算一次),统计每个成员的聊天后面谁出现次数较多。好像一句话就可以解、释全部,但实现起来还是要转下弯,所以直接看图吧。

5分钟内的对话中可能会出现自己接话的情况,并且相近的对话下面重复出现同样的接话人。所以,需要排除接话人为自己的情况,得到不重复计算的接话人。最后就可以得到每个人不同时间点5分钟对话后对应接话的人,进而可以 统计每个成员的聊天后面谁出现次数较多。

关键点:准确得到每个成员某个时间点中后面所接的人,且不能重复。绘制社会网络关联图需要两个对象,一个是出现的发言人的名单,另一个是关系表。


nodes : 包含links中s出现的所有且唯一的点,以及点的属性
links : 点与点间的联系,以及边的属性

二、实现

(1)首选确定阈值,几分钟内接话算紧密联系人。这个值可以自行定义,这里设置为5分钟。

#谁与谁关系更紧密
min = 5
datetime = as.POSIXct(paste(data$date,data$time))
connect <-  data.frame(name<-c(),link <-c())
for(i in 1:(length(data[,1])-1)){if(data$Name[i] != data$Name[i+1]){datetime2 = as.POSIXct(paste(data$date[i],data$time[i]))+min*60k1 <- max(which(datetime <= datetime2))if( data$Name[i] %in% data$Name[(i+1):k1] ){k2 <- min(which(data$Name[(i+1):k1] %in% data$Name[i]))+i}else{k2 <- k1}k <- min(k1,k2)dataName <- unique(data$Name[i:k])link <- paste(dataName,collapse = ";")name <- data$Name[i]connect <- rbind(connect,data.frame(name,link))}
}connect$name <- as.character(connect$name)
connect$link <- as.character(connect$link)
connect$name <- enc2native(connect$name)
connect$link <- enc2native(connect$link)
connect$name <- gsub("<.*>","_",connect$name) #-- 利用正则表达式将奇怪字符用"_"替换
connect$link <- gsub("<.*>","_",connect$link)
strsplit_link <- strsplit(as.character(connect$link),";")    #-- 按";"分列并以list方式存储
d <- mapply(cbind,connect$name,strsplit_link) #-- 将connect$name的数据分别和strsplit_link的每个元素做合并,此时d为列表#将列表合并成数据框
link <- data.frame()
for(i in 1:length(d)){d1 <- data.frame(d[i])names(d1) <- c("name","link")link <- rbind(link,d1) #-- 将列表合并成数据框
}connection <- table(link$name,link$link) #-- 列联表 行列 for(i in 1:length(rownames(connection))){for(j in 1:length(colnames(connection))){if(rownames(connection)[i] == colnames(connection)[j]){connection[rownames(connection)[i],colnames(connection)[j]]<-0}}
}connection <- t(connection)
connection <- as.data.frame(connection)
names(connection) <- c("link","name","Freq")
#选出紧密程度大于10的所有紧密关联人
links <- connection[connection$Freq >= 10,]
links <- links[order(links$name,links$Freq,decreasing = TRUE),]#也可以选出前12位话痨,紧密程度大于10的紧密关联人
#links = links[
#  which(is.element(links$name,newtop12$name) == TRUE),]links$name <- as.character(linf$name)
links$link <- as.character(links$link)
nodes <- da.frame(name = unique(c(links$name,links$link)))

三、可视化

(1)用igraph包

library(igraph)
net <- graph_from_data_frame(d=links, vertices=nodes, directed=F)
dev.new()
plot(net) # not a pretty picture!
net <- simplify(net, remove.multiple = F, remove.loops = T)
#V(net)$label <- V(net)$name
plot(net, edge.arrow.size=0.1, edge.color="grey", edge.curved=0,edge.width=2,vertex.color="orange",vertex.size = 11.5, vertex.frame.color="orange",vertex.label=V(net)$name, vertex.label.color="black",vertex.label.cex=0.68)# -- 如果不想显示那么多名字,可以在nodes中新增一列需要显示的名字 # -- 例如仅显示话痨们的名字
newname <- rep(NA,length(nodes$name))
nodes$name <- as.character(nodes$name)
newtop12$name <- as.character(newtop12$name)
for(i in 1:length(nodes$name)){if (nodes$name[i] %in% newtop12$name){newname[i] <- nodes$name[i]}
}
nodes$newname <- newname
net <- graph_from_data_frame(d=links, vertices=nodes, directed=F)
plot(net, edge.arrow.size=0.1, edge.color="grey", edge.curved=0,edge.width=2,vertex.color="orange",vertex.size = 11.5, vertex.frame.color="orange",vertex.label=V(net)$newname, vertex.label.color="black",vertex.label.cex=0.7)

图如下:

(2)networkD3

library(networkD3)
windowsFonts(fc = windowsFont("微软雅黑")
)#可以更改字体
simpleNetwork(links,height = 100, width = 50,linkDistance = 200,fontFamily="fc",fontSize=18,linkColour = "grey", nodeColour = "orange", opacity = 0.8)

图如下:

R || 聊天记录分析(二)相关推荐

  1. R语言分析(二)——薛毅R语言第二章后面习题解析

    包括2.2-2.6中间的习题,2.2的习题中第三问和第四问,应该有其他的解答方法,但我看他的题目,似乎是在A和B的基础上进行,所以就选择了使用for循环的方法 做着习题,又不断查着书,这样,书籍也熟悉 ...

  2. 【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享

    最近我们被客户要求撰写关于主成分分析PCA的研究报告,包括一些图形和统计输出.降维技术之一是主成分分析 (PCA) 算法,该算法将可能相关变量的一组观察值转换为一组线性不相关变量.在本文中,我们将讨论 ...

  3. 用Numpy和Pandas分析二维数据笔记

    用Numpy和Pandas分析二维数据 上节课,我们利用numpy和pandas分析了一维数据.在这节课中,你将学到这两种库的更多特性.并用它们来分析 二维数据,这节课后,你将能够使用pandas重新 ...

  4. 数据包络分析-二阶段网络带feedback(第二篇)

    数据包络分析-二阶段网络带feedback(第二篇) 模型示意图 第一点:投入分配 第二点:只需要用一个 C h a r n e s C o o p e r Charnes\;Cooper Charn ...

  5. R语言绘制二维密度图

    R语言绘制二维密度图 二维密度图显示了两个数值变量之间的关系,一个在x轴上表示,另一个在Y轴上表示,与散点图类似,然后计算二维空间中特定区域内的观测数,并用颜色梯度表示.二维密度图有几种类型,以下主要 ...

  6. R语言ggplot2可视化绘制二维的密度图:在R中建立二维散点数据的连续密度热图、2D密度估计、MASS包中的kde2d函数实现2D密度估计、geom_density2d函数可视化二维密度图

    R语言ggplot2可视化绘制二维的密度图:在R中建立二维散点数据的连续密度热图.2D密度估计.MASS包中的kde2d函数实现2D密度估计.geom_density2d函数可视化二维密度图 目录

  7. 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 二 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  8. Android4.0图库Gallery2代码分析(二) 数据管理和数据加载

    Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 2012-09-07 11:19 8152人阅读 评论(12) 收藏 举报 代码分析android相册优化工作 Androi ...

  9. 一些有用的javascript实例分析(二)

    一些有用的javascript实例分析(二) 原文:一些有用的javascript实例分析(二) 1 5 求出数组中所有数字的和 2 window.onload = function () 3 { 4 ...

最新文章

  1. 用户列表-投资记录sql
  2. 百度编辑器(ueditor)上传图片
  3. wxWidgets:wxGrid概览
  4. 计算机应用能力大纲,计算机应用能力水平考试大纲.doc
  5. 开发人员学Linux(2):VirtualBox中安装CentOS7系统设置
  6. cent os重置mysql,linux mysql 能登陆不能修改用户(cent os 6.2)解决思路
  7. 少说话多写代码之Python学习009——字典的创建
  8. linux shell 生产脚本汇总,【汇总】Linux常用脚本shell
  9. pg 日期和时间的运算操作
  10. python没有错误但是不显示结果_解决Pycharm无法显示matplotlib绘图问题
  11. ajax 弹框 示例,AJAX实现鼠标经过弹出详细介绍示例
  12. Netscreen204防火墙配置网络设备的SNMP及Syslog配置
  13. input眼睛显示 vue_2019前端面试题汇总(主要为Vue)
  14. php+mysql案例含源码_[源码和文档分享]基于PHP和MYSQL数据库实现的失物招领系统...
  15. lintcode:Plus One 加一
  16. 利用VCF文件构建系统发育树
  17. 红贝应用架构配置式应用开发示例
  18. 求和:1/3+3/5+5/7+7/9+………..+97/99
  19. 逻辑地址 与物理地址的转换
  20. nodejs负载均衡(一):服务负载均衡

热门文章

  1. JAVA调用数据泵,数据泵导出和导入 - lsj_syy的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. [BEGIN,分隔符,字符串,字段,制表符]Linux:“awk”命令的妙用
  3. Jupyter Notebook数据格式解析
  4. 太极拳动作要领13招 练太极拳秘诀
  5. Python 大漠免注册
  6. 四月扬州 镇江自游行攻略
  7. AutoCAD .Net 使用 Database.ReadDwgFile 读取dwg文件而不显示文档窗口
  8. Dridex样本分析
  9. 副本技能-eBay店铺指标调用评论限制
  10. 高内聚低耦合通俗解释