QQ聊天记录简单分析

0.0^. Description

  从QQ导出了和好友从2016-08-25到2017-11-18的消息记录,85874行,也算不少。于是就有了大致分析、可视化一下。步骤大致如下:

  • 消息记录文件预处理
  • 使用jieba分词
  • 使用wordcloud生成词云
  • 生成简单图表

  结果大致如下:

1.1^. Preprocessing

  导出的文件大概格式如下:(已去掉多余空行)

2016-08-26 11:02:56 PM 少平
这……
2016-08-26 11:03:02 PM 少平
这bug都被你发现了
2016-08-26 11:03:04 PM C
反驳呀
2016-08-26 11:03:25 PM C
too young
2016-08-26 11:04:43 PM C
我去刷鞋子
2016-08-26 11:04:58 PM 少平
嗯嗯
好的

Observation&Notice:

  • 每条消息上都有对应发送时间和发送者
  • 列表内容
  • 一条消息内可能有换行

  由此,

  • 可以依照发送者对消息分开为聊天双方。
  • 将各自的内容分别放在文件中,便于后续分词和制作词云。
  • 将所有聊天时间抽取出来,可以对聊天时段进行分析和图表绘制。

Arguments:
  infile⇒infile\Rightarrow原始导出消息记录文件
  outfile1⇒outfile1\Rightarrow对话一方的消息记录文件名
  outfile2⇒outfile2\Rightarrow对话另一方的消息记录文件名
Outputs:
  预处理后的分别储存的消息记录文件(其中只包含一方聊天内容)以及一个消息时间文件

# -*- coding: utf-8 -*-
""" Spilt the original file into different types in good form. """import re
import codecsIN_FILE = './data.txt'
OUT_CONTENT_FILE_1 = './her_words.txt'
OUT_CONTENT_FILE_2 = './my_words.txt'
OUT_TIME_FILE = './time.txt'
UTF8='utf-8'
MY_NAME_PATTERN = u'少平'
TIME_PATTERN = r'\d{4,4}-\d\d-\d\d \d{1,2}:\d\d:\d\d [AP]M'
TEST_TPYE_LINE = u'2017-10-14 1:13:49 AM 少平'def split(infile, outfile1, outfile2):"""Spilt the original file into different types in good form."""out_content_file_1 = codecs.open(outfile1, 'a', encoding=UTF8)out_content_file_2 = codecs.open(outfile2, 'a', encoding=UTF8)out_time_file = codecs.open(OUT_TIME_FILE, 'a', encoding=UTF8)try:with codecs.open(infile, 'r', encoding=UTF8) as infile:line = infile.readline().strip()while line:if re.search(TIME_PATTERN, line) is not None: # type linestime = re.search(TIME_PATTERN, line).group()out_time_file.write(u'{}\n'.format(time))content_line = infile.readline()flag = 0    # stands for my wordsif re.search(MY_NAME_PATTERN, line):flag = 0else:flag = 1while content_line and re.search(TIME_PATTERN, content_line) is None:if flag == 1:out_content_file_1.write(content_line)else:out_content_file_2.write(content_line)content_line = infile.readline()line = content_lineexcept OSError:print 'error occured here.'out_time_file.close()out_content_file_1.close()out_content_file_2.close()if __name__ == '__main__':split(IN_FILE, OUT_CONTENT_FILE_1, OUT_CONTENT_FILE_2)

2.2^. Get word segmentations using jieba

  使用jieba分词对聊天记录进行分词。

import codecs
import jiebaIN_FILE_NAME = ('./her_words.txt', './my_words.txt')
OUT_FILE_NAME = ('./her_words_out.txt', './my_words_out.txt')def split(in_files, out_files):"""Cut the lines into segmentations and save to files"""for in_file, out_file in zip(in_files, out_files):outf = codecs.open(out_file, 'a', encoding=UTF8)with codecs.open(in_file, 'r', encoding=UTF8) as inf:line = inf.readline()while line:line = line.strip()seg_list = jieba.cut(line, cut_all=True, HMM=True)for word in seg_list:outf.write(word+'\n')line = inf.readline()outf.close()if __name__ == '__main__':split(IN_FILE_NAME, OUT_FILE_NAME)

3.3^. Make wordclouds using wordcloud

  抽取分词结果中出现频率最高的120个词,使用wordcloud进行词云生成。并且,屏蔽部分词语(STOP_WORDS),替换部分词语(ALTER_WORDS)。

STOP_WORDS = [u'图片', u'表情', u'窗口', u'抖动', u'我要', u'小姐', u'哈哈哈', u'哈哈哈哈', u'啊啊啊', u'嘿嘿嘿']
ALTER_WORDS = {u'被替换词1':u'替换词1',u'被替换词2':u'替换词2'}

Arguments:
  in_files⇒in\_files \Rightarrow分词产生的结果文件
  out_files⇒out\_files \Rightarrow保存词云的目标地址
  shape_files⇒shape\_files \Rightarrow词云形状的图片文件
Output:
  对话双方各自内容的词云

import jieba.analyse
import numpy as np
from PIL import Image
from wordcloud import WordCloudOUT_FILE_NAME = ('./her_words_out.txt', './my_words_out.txt')
OUT_IMG_NAME = ('./her_wordcloud.png', './my_wordcloud.png')
SHAPE_IMG_NAME = ('./YRY.png', './FBL.png')def make_wordcould(in_files, out_files, shape_files):"""make wordcould"""for in_file, out_file, shape_file in zip(in_files, out_files, shape_files):shape = np.array(Image.open(shape_file))content = codecs.open(in_file, 'r', encoding=UTF8).read()tags = jieba.analyse.extract_tags(content, topK=120, withWeight=True)text = {}for word, freq in tags:if word not in STOP_WORDS:if word in ALTER_WORDS:word = ALTER_WORDS[word]text[word] = freqwordcloud = WordCloud(background_color='white', font_path='./font.ttf', mask=shape, width=1080, height=720).generate_from_frequencies(text)wordcloud.to_file(out_file)if __name__ == '__main__':make_wordcould(OUT_FILE_NAME, OUT_IMG_NAME, SHAPE_IMG_NAME)

以下是指定的词云形状(对应WordCloud()中的mask参数):

以下是生成的词云:

4.4^. Generate a simple bar plot about time

  根据预处理中产生的时间文件制作简单柱状图。

#-*- coding: utf-8 -*-
""" make a simple bar plot """import codecs
import matplotlib.pyplot as pltFILE = 'time.txt'def make_bar_plot(file_name):"""make a simple bar plot"""time_list = {}message_cnt = 1with codecs.open(file_name, 'r', encoding='utf-8') as infile:line = infile.readline()while line:line = line.strip()time_in_12, apm = line.split()[1:2]time_in_24 = time_format(time_in_12, apm)if time_in_24 in time_list:time_list[time_in_24] = time_list[time_in_24] + 1else:time_list[time_in_24] = 1line = infile.readline()message_cnt = message_cnt + 1plt.figure(figsize=(18, 9))plt.bar(time_list.keys(), time_list.values(), width=.8,facecolor='lightskyblue', edgecolor='white')plt.xticks(range(len(time_list)), time_list.keys())for x_axies in time_list:y_axies = time_list[x_axies]label = '{}%'.format(round(y_axies*1.0/message_cnt*100, 2))plt.text(x_axies, y_axies+0.05, label, ha='center', va='bottom')plt.title('#message in each hour')plt.savefig('time.png')def time_format(time_in_12, apm):"""docstring"""hour = time_in_12.split(':')[0]hour = int(hour)if apm == 'PM':hour = hour + 12time_in_24 = hour % 24return time_in_24if __name__ == '__main__':make_bar_plot(FILE)

生成的柱状图如下:

Python-QQ聊天记录分析-jieba+wordcloud相关推荐

  1. QQ聊天记录分析(R-3.5)

    对QQ聊天记录的分析 数据来源:博主的某个学习群,直接导出聊天记录到文本 #导入算法包 > if(!require("stringr")){install.packages( ...

  2. 微信QQ聊天记录分析工具-微Q

    1.背景 忙了一周,从设计算法到编程,到部署服务器,到最后的UI实现,终于我的微Q诞生了. 用起来非常的简洁,只要把微信或者qq的聊天记录导出来,是个txt文件,导入微Q,手机端也能用,它就能帮你分析 ...

  3. 仅用四行代码就可以挖掘你的QQ聊天记录

    ​大家好,我上次写的一篇博文是--QQ聊天记录分析,地址为:http://blog.csdn.net/wzgl__wh/article/details/69055369 今天来分享一个更简单的方法.那 ...

  4. python可视化文本分析(2)—snownlp jieba分析QQ群成员发言情况

    公众号文章链接 第二个情感分析,主要通过python实现qq群消息分析,分析群成员发言总次数,群成员情绪对比,单个群成员的发言词云状况以及单个同学的发言情感走势. 用到一下库: re正则,matplo ...

  5. python分析qq聊天记录汉字频率

    import re# -*- coding: utf-8 -*- with open('C:\\Users\\BIMK\\Desktop\\1.txt','r+',encoding='UTF-8') ...

  6. 微信聊天记录提取及分析(wordcloud+pyecharts)

    0. 前言 ​ 之所以想要提取微信的聊天记录并分析是因为也开始再学习python,但是单纯看看语法什么的又很无趣,无意间看到python可以进行微信聊天记录的分析,就自己尝试做了一下,感觉还是挺有意思 ...

  7. Python将我与王心凌的QQ聊天记录,生成词云(情人节的后续)

    在这个情人节前夕,我把现任对象回收掉了,这段感情积攒了太多的失望,也给了我太多的伤害,所以我看到这个活动的第一反应是拒绝的.然而人生嘛,最重要的就是体验,沉浸在过去的回忆里没有意义,积极面对才能让自己 ...

  8. python正则将qq聊天记录转换为html

    目录 一.需求 二.知识要点 三.全部代码 四.使用方法 五.转换效果 六.参考资料 一.需求 提取qq聊天记录中的所有图片并保存在指定的文件夹,并将聊天记录转换为html. 二.知识要点 大文件的流 ...

  9. 用Python把QQ聊天记录文件转成WORD并排版

    和女票在一起五年了,保留了几年的QQ聊天记录,偶然翻到,感觉很温暖,就想把这些文字做成一本属于我们的书,应该会很有纪念意义.然而qq备份的聊天记录是txt格式,网上找了半天也没有合适的排版工具,上百页 ...

  10. chatgpt赋能python:Python微信聊天记录:如何导出并分析聊天记录

    Python 微信聊天记录:如何导出并分析聊天记录 微信是目前最受欢迎的聊天工具之一,但是它的聊天记录并不方便导出和分析.本文将介绍如何使用 Python 导出微信聊天记录,并进行分析. 导出微信聊天 ...

最新文章

  1. 关于学习Python的一点学习总结(27->关键字参数和默认值)
  2. 信息安全 CIO最关注什么?
  3. Spring 一二事(4) - 单例
  4. 为什么 JavaScript 的 this 要这么用?
  5. ASP.NET Core 3.0 gRPC 身份认证和授权
  6. Spark在Ambari集群环境的使用
  7. 基于sympy的python实现三层BP神经网络算法
  8. 一个方便的图片载入框架——ImageViewEx
  9. Andorid Studio NDK 开发 - Hello World
  10. import pandas as pd什么意思_【医学名词】多发性骨髓瘤MR、SD、PD分别是什么意思?...
  11. linux 使用ssr客户端_React从CSR到SSR:第一篇
  12. Android Stagefright MPEG4Extractor分析
  13. 计算机专业在经济社会的应用,计算机技术对社会发展的影响
  14. 【Python笔记】列表基础操作 :创建,增加、删除、查询。附加:练习题。用简单代码解释。
  15. java dh_java DH加密算法备忘
  16. 未授予用户在此计算机上的请求登录类型 登录失败的解决方案
  17. scandir 参数
  18. SQL server 表之间的关系生成图
  19. 我又双叒叕赶来科普了
  20. MySQL系列-undo

热门文章

  1. 【2013】【论文笔记】利用graphene产生THz——
  2. Effective Java
  3. (3)资源管理-- Effective C++改善程序与设计的55个具体做法(Effective C++: 55 Specific Ways to Improve Your Programs)
  4. win远程桌面连接服务器,远程桌面连接windows服务器
  5. iradon函数和radon函数
  6. xml转PDF(xmlxslt-」fo-」pdf)_完整项目_CodingPark编程公园
  7. mysql查询之左连接查询与右连接查询
  8. kaggle代码补全
  9. phpnow安装教程
  10. 解决Python中的TypeError list indices must be integers or slices, not float问题