一、引言
偶然有了个歪主意,想看看群里哪些人交流较为频繁,哪些人更倾向于潜水,同时观察哪些人喜欢用哪些词聊天,于是找了个死党群,导出了一份QQ群聊天记录,开始了秘密窥探...为了留一点点的隐私,群成员的昵称进行了一些别称处理(⊙o⊙)…
先来一睹结果
从图中可以发现,本群中没有潜水的人,总体情况还是比较活跃的,也发现了谢三哥简直就是话题的中心,和谁都能聊上!
二、原理
根据聊天记录的分布,经常聊天的人群,聊天信息基本上是在一个板块的,如A一句B一句,那么只需要计算与某人最近的某些人的聊天记录就可算出某个人的频繁聊天对象,同时根据与某人最近的聊天用词就可算出某个人身边的频繁字词,而这刚好就是word2vec原理的应用,使用word2vec的skip-gram模型,就可以实现使用某个词来预测周围的词,如冉某人今天准备做什么
这句话,循环遍历该句话的词组,以每一个词为中心词,并在中心词两边以窗口2进行切分,就可以得到每一个词相关联的词:
[
冉某人
今天 准备] 做 什么
->冉某人关联词组:【(冉某人,今天),(冉某人,准备)】
[冉某人
今天
准备 做] 什么
->冉今天关联词组:【(今天,冉某人),(今天,准备),(今天,做)】
[冉某人 今天
准备
做 什么]
->冉准备关联词组:【(准备,冉某人),(准备,今天),(准备,做),(准备,什么)】
...以此类推
根据切分的词组对进行统计学习,就可以计算出每一个词周围最有可能出现的词(包括聊天对象)
三、实践
1、概览
实践过程主要包括以下几个部分
群聊对象列表提取
数据预处理:语料库中分词,停用词去除等
skip-gram模型训练
根据模型提取结果
代结构如下
类定义
2、方法实现
def load_file(self,file_path):
with open(file_path, 'r', encoding='utf-8') as file:
self.file_content = file.readlines()
def add_custom_words(self,words_list):
for name in words_list:
jieba.add_word(name)
def prepare_file(self,stop_words):
for line in self.file_content:
cut_line =[word for word in jieba.cut(line) if word not in stop_words]
self.file_sentences.append(cut_line)
def model_train(self,iter,window):
self.model = word2vec.Word2Vec(self.file_sentences,iter=iter,window=window,sg=1)
def extract_chat_relations(self,chat_names):
for name in chat_names:
most_similar_words = self.model.wv.most_similar(positive=[name], topn=15)
words = []
objects = []
for w, _ in most_similar_words:
if w not in dict_names:
words.append(w)
else:
objects.append(w)
print(name, '经常聊天对象:', objects, '常用词汇:', words)
3、结果预览
'''
小单单 经常聊天对象: ['谢三哥', '阿秋', '大熊']
常用词汇: ['加油', '呸', '哈哈哈哈', '快去', '中毒', '干嘛', '微博']
张某人 经常聊天对象: ['大熊', '海某人', '谢三哥', '冉某人']
常用词汇: ['加油', '干嘛', '呸', '决斗', '快去', '投资']
海某人 经常聊天对象: ['谢三哥', '张某人', '冉某人']
常用词汇: ['加油', '呸', '干嘛', '鬼', '快去', '微博']
谢三哥 经常聊天对象: ['阿秋', '大熊']
常用词汇: ['加油', '哈哈哈哈', '呸', '快去', '幸福', '有点像', "'"]
大熊 经常聊天对象: ['阿秋', '谢三哥']
常用词汇: ['呸', '加油', '快去', '微博', '干嘛', '出现']
阿秋 经常聊天对象: ['大熊', '谢三哥']
常用词汇: ['呸', '加油', '微博', '快去', '干嘛', "'"]
冉某人 经常聊天对象: ['谢三哥', '阿秋', '张某人', '海某人']
常用词汇: ['加油', '呸', '快去', '幸福', '火腿', '悲伤', '进']
'''