1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
| import pandas as pd import pyecharts as pc from pyecharts import options as opts import jieba
##数据预处理 def data_process(url): df=pd.read_csv(url) df = df[df['Type'] == 1] # 只保留文本聊天 ##保留特定群员信息 df=df[(df['NickName']=="你的名字")| (df['NickName']=='她的名字')] ##这里换成你想保留人的群聊名字 selected_columns = ['IsSender', 'StrContent', 'StrTime'] df = df[selected_columns] # 只取'IsSender','StrContent','StrTime'列 df['StrTime'] = pd.to_datetime(df['StrTime']) df['Date'] = df['StrTime'].dt.date return df
##读取群聊文件的地址,这里改成你导出的群聊文件地址 fileurl=r"你的群聊文件地址"
df=data_process(fileurl)
def zhuzhuangtu(): # 每天聊天频率柱状图 chat_frequency = df['Date'].value_counts().sort_index() total_messages = len(df) date_labels = [date.strftime('%m-%d') for date in chat_frequency.index] bar = pc.charts.Bar() bar.add_xaxis(date_labels) bar.add_yaxis('频率', list(chat_frequency)) bar.render("./data/zhuzhuantu.html") return bar
# 双方信息数量对比 def pie(): sent_by_me = df[df['IsSender'] == 1]['StrContent'] sent_by_others = df[df['IsSender'] == 0]['StrContent'] count_sent_by_me = len(sent_by_me) count_sent_by_others = len(sent_by_others) labels = ['你的名字', '她的名字'] sizes = [count_sent_by_me, count_sent_by_others] pie=pc.charts.Pie() pie.add("",[list(z) for z in zip(labels,sizes)]) # 添加标签 pie.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")) return pie
##每小时聊天记录 # 根据一天中的每一个小时进行统计聊天频率,并生成柱状图 def xiaoshitu():
df['DateTime'] = pd.to_datetime(df['StrTime']) df['Hour'] = df['DateTime'].dt.hour
hourly_counts = df['Hour'].value_counts().sort_index().reset_index() hourly_counts.columns = ['Hour', 'Frequency'] bar1=pc.charts.Bar() bar1.add_xaxis(hourly_counts['Hour'].to_list()) bar1.add_yaxis('频率',hourly_counts['Frequency'].to_list()) return bar1
##绘制词云 def ciyun():
# 获取词云内容 words = df['StrContent'].to_string() ##分词
# 定义要去除的词列表 filter_list = ['的', '了', '是', '在', '和', '我', '之','我们', '你们', '他们', '有', '也', '不', '人', '这', '个', '你', '上', '到', '们','小','中', '为', '上', '们', '都', '会', '他', '地', '那', '要', '就', '以', '说', '来', '可以', '对', '出', '从', '到', '……', '呀', '吧'] words = jieba.cut(words,cut_all=False) filtered_words = [word for word in words if word not in filter_list and word.isalpha()] # words=' '.join(filtered_words ) # print(type(filtered_words)) #计算词频 word_dict = {} for word in filtered_words: if len(word) > 1: if word in word_dict: word_dict[word] += 1 else: word_dict[word] = 1 # 将词频统计结果转换为列表 word_list = [(word, value) for word, value in word_dict.items()] # print(word_list)
# 绘制词云 wordcloud = pc.charts.WordCloud() wordcloud.add("", word_list, word_size_range=[20,100]) return wordcloud
#主函数 if __name__=='__main__': zhuzhuang=zhuzhuangtu() pietu=pie() xiaoshi=xiaoshitu() ciyuntu=ciyun() # zhuzhuang.set_global_opts(title_opts={"text": "聊天月份频率图"}) pietu.set_global_opts(title_opts={"text": "聊天数量饼图"}) xiaoshi.set_global_opts(title_opts={"text": "聊天全天分布图"}) ciyuntu.set_global_opts(title_opts={"text": "词云"}) page = pc.charts.Page(layout=pc.charts.Page.SimplePageLayout) page.add(zhuzhuang) page.add(pietu) page.add(xiaoshi) page.add(ciyuntu)
# 设置页面标题 page.page_title="聊天信息总结"
# 保存页面 page.render("你要保存的地址+文件名.html")
|