分析聊天记录(2)——分析单⼈的聊天记录
分析聊天记录(2)——分析聊天记录
⽂章⽬录
上⼀篇说到获取到的聊天记录,这⼀篇说说对单⼈聊天记录的分析。
筛选指定聊天记录
假定我们已经获取到⼀个名为message.csv的聊天记录⽂件,我们使⽤python来筛选出指定⼈的聊天记录,存储到chat.csv⽂件中:
import pandas as pd
chat = pd.read_csv('../message.csv', sep=',')
myGirl ='wxid_xxxxxxxxx'# 指定⼈的id
chat = chat[chat['talker']== myGirl]
<_csv('../chat.csv', sep=',')
对于上述代码中的id,可以根据聊天内容和对应的talker来获取,相信⼤家都会获取。
正式进⾏分析
⾸先导⼊⼏个必须的包
import pandas as pd
import time
import seaborn as sns
import numpy as np
from matplotlib.font_manager import*#如果想在图上显⽰中⽂,需导⼊这个包
import matplotlib.pyplot as plt
from tqdm import tqdm
import re, string
np.set_printoptions(linewidth=800, suppress=False)
再导⼊chat.csv⽂件,并提取出⼏个有⽤的列信息。msg['content']是中的主要的聊天信息。msg['t
ype']表⽰该聊天信息属于哪种类型,语⾳、⽂字、图⽚、表情包还是分享链接等等。msg['createTime']表⽰该聊天信息发送的时间,单位是毫秒。msg['isSend']表⽰该聊天信息是否是你发送的,如果是,则值为1,否则为0。还有其他更多的有⽤信息,后续再补充。
chat = pd.read_csv('chat.csv', sep=',')
myGirl ='wxid_xxxxxxx'
lens =len(chat)
代码转换# lens = 100
msg_content =[None,]*lens
msg_type =[None,]*lens
msg_isSend =[None,]*lens
msg_time =[None,]*lens
for i in tqdm(range(lens)):
msg = chat[i:i +1]
msg_content[i]= msg['content'].values[0]
msg_type[i]= msg['type'].values[0]
msg_time[i]= msg['createTime'].values[0]
msg_isSend[i]=int(msg['isSend'].values[0])if msg['isSend'].values[0]in[0.,1.]else-1
在此先总结⼀下msg['type']的⼏种类型,⽬前只总结出这么多类型,后续继续补充:
编号类型
1⽂本消息,包含⼩表情
3图⽚消息,相机中的照⽚和配置有不同,从相册中发送的消息中会保留⼀个 MMAsset,如同 PAAset
34语⾳消息
42名⽚消息,名⽚和普通名⽚
47⼤表情
48位置消息
49分享消息
10000系统消息
419430449转账
-1879048186位置共享
各⾃发送信息条数
⾸先简单统计⼀下收发双⽅的信息数量。同时统计各⾃发出的⽂字总数。
msg_data = np.array([[0,0],[0,0]])
for i in tqdm(range(lens)):
if msg_isSend[i]not in[0,1]:
pass
msg_data[msg_isSend[i]][0]+=1
if msg_type[i]==1:
msg_con = msg_content[i]
msg_data[msg_isSend[i]][1]+=len(msg_con)
print(msg_data)
print(msg_data.sum(0))
labels =['接收到','发送出']
sizes = msg_data[:,0]
myfont = FontProperties(fname=r'../kaiti.TTF', size=22)# 标题字体样式
p = plt.pie(sizes, labels=labels, autopct='%1.1f%%', colors =['magenta','lightskyblue'], shadow=True, startangle=90)
for front in p[1]:
front.set_fontproperties(myfont)
plt.axis('equal')
plt.show()
效果展⽰如下:
统计聊天时间频率
⾸先定义⼏个时间转换函数
# tm_year=2016, tm_mon=11, tm_mday=27, tm_hour=10, tm_min=26, tm_sec=5, tm_wday=6, tm_yday=332, tm_isdst=0
def to_hour(t):
struct_time = time.localtime(t//1000)#将时间戳转换为struct_time元组
# hour = round((struct_time[3] + struct_time[4] / 60), 2)
hour = struct_time[3]
return hour
def to_day(t):
struct_time = time.localtime(t//1000)#将时间戳转换为struct_time元组
day = struct_time[2]
return day
def to_mon(t):
struct_time = time.localtime(t//1000)#将时间戳转换为struct_time元组
mon = struct_time[1]
return mon
def to_wday(t):
struct_time = time.localtime(t//1000)#将时间戳转换为struct_time元组
wday = struct_time[6]
return wday
def to_formatday(t):
struct_time = time.localtime(t//1000)#将时间戳转换为struct_time元组
fday = time.strftime("%Y-%m-%d", struct_time)
return fday
再获取出每周的聊天频率:
hour_set =[to_hour(i)for i in msg_time]
day_set =[to_day(i)for i in msg_time]
mon_set =[to_mon(i)for i in msg_time]
wday_set =[to_wday(i)for i in msg_time]
# print(hour_set)
week_hour = np.zeros([2,7,24]).astype(np.int)
for s, w, h in tqdm(zip(msg_isSend, wday_set, hour_set)):
if s not in[0,1]:
pass
week_hour[s, w, h]+=1
print(week_hour[0].T)
print(week_hour[1].T)
print(week_hour[0].sum(0))
print(week_hour[1].sum(0))
运⾏结果如下,分别显⽰出收发双⽅在每周每⽇的发送信息量:
[[1379 1354 1863 847 1301 1032 1320]
[ 492 627 1028 330 507 422 884]
[ 149 427 289 4 270 70 353]
...........
[1083 844 630 698 806 434 799]
[1061 506 491 565 659 235 727]
[1424 1616 923 1226 630 624 1083]]
[[1659 1865 1864 995 1342 1150 1547]
[ 947 852 1087 226 727 393 1028]
[ 893 330 862 243 709 210 358]
........
[1261 597 511 705 678 312 807]
[1678 1484 948 1450 915 747 1311]]
[9096 4290 1562 841 227 203 380 1048 3069 7001 8221 8934 7393 6787 6220 5626 6816 7287 7691 6741 6395 5294 4244 7526]
[10422 5260 1926 954 324 219 509 1453 3605 8588 9240 9492 8470 7216 6930 6130 7206 7860 8566 7456 7106 6162 4871 8533]
将上述数据保存⾄csv中,导⼊在线统计⽹站,这⾥推荐,相当不错的(⾮⼴告),进⾏⼀丢丢配置,就获得下⾯的展⽰图啦。
获取词云
⽤python当然可以做出不错的词云,但是我很懒,在线词云⽹站也挺多,就是要收费,我使⽤来进⾏制作,由于数据量太⼤,我还充了69块钱 !不过导出的效果还是不错的。
⾸先,使⽤python将聊天记录全部导出,我这⾥分别导出两⼈的聊天记录。然后将记录全部复制到微词云中,再加上⼀丢丢的配置,就完成啦。
fday_set =[to_formatday(i)for i in msg_time]
txtlist =[[],[]]
alllist =[]
reflist =[]
for s, c, t, f in tqdm(zip(msg_isSend, msg_content, msg_type, fday_set)):
if s not in[0,1]:
pass
if t ==1:
txtlist[s].append(c)
alllist.append(c)
# if f == '2020-07-10': # 导出特定⼀天的记录
# print(f)
# reflist.append(c)
print(txtlist[0][:10])
print(txtlist[1][:10])
print(alllist[:10])
with open('','w')as f:
for t in txtlist[0]:
f.write(f'{t}\n')
with open('','w')as f:
for t in txtlist[1]:
f.write(f'{t}\n')
with open('','w')as f:
for t in alllist:
f.write(f'{t}\n')
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论