偶然有了个歪主意,想看看群里哪些人交流较为频繁,哪些人更倾向于潜水,同时观察哪些人喜欢用哪些词聊天,于是找了个死党群,导出了一份QQ群聊天记录,开始了秘密窥探...为了留一点点的隐私,群成员的昵称进行了一些别称处理(⊙o⊙)…
根据狄大人的套路,先将结果说出来,再来还原作案过程,元芳看这样可行!
真相只有一个将分析结果化为关系图,把一个个的小圆圈当做群里的人,聊天较多的就连一条线,如图:
从图中可以发现,本群中没有潜水的人,总体情况还是比较活跃的,也发现了谢三哥简直就是话题的中心,和谁都能聊上!
要破案总得有些理论依据,下面一起来看看!
破案原理根据聊天记录在QQ群的分布,聊天信息基本上是在一个板块的,如A一句B一句,那么只需要统计与某人A距离最近的某些人BCD的聊天记录数,取频率较高的就可算出某人A的频繁聊天对象,同时统计出某人A的聊天用词数,取频率较高的就可算出某个人身边的频繁字词,而这刚好就是word2vec(没见过该词可直接跳过,不影响阅读)原理的应用,使用word2vec的skip-gram模型,就可以实现使用某个词来预测周围的词,如冉某人今天准备做什么这句话,循环遍历该句话的词组,以每一个词为中心词,并在中心词两边以窗口2进行切分,就可以得到每一个词相关联的词:
[冉某人 今天 准备] 做 什么->冉某人 的关联词组:【(冉某人,今天),(冉某人,准备)】
[冉某人 今天 准备 做] 什么->今天 的关联词组:【(今天,冉某人),(今天,准备),(今天,做)】
[冉某人 今天 准备 做 什么]->准备 的关联词组:【(准备,冉某人),(准备,今天),(准备,做),(准备,什么)】
...以此类推
根据切分的词组对进行统计学习,就可以计算出每一个词周围最有可能出现的词(包括聊天对象)
案件还原(实践过程)讲完了原理,是时候来看看案件的经过了!
流程说明
实践过程主要包括以下几个部分
- 群聊对象列表提取
- 数据预处理:语料库中分词,停用词去除等
- skip-gram模型训练
- 根据模型提取结果
根据实践过程,设计代码结构如下:
代码主体结构
代码实现
各函数定义:
函数结构定义
实现定义好的函数的具体逻辑:
结果预览: