本文目录导读:

分析聊天记录数据是一个常见的数据挖掘任务,可以用于情感分析、话题聚类、用户行为分析、社交网络分析等,下面我会提供一个通用的技术路线和示例脚本思路,涵盖从数据提取、清洗到分析的完整流程。
由于聊天记录格式多样(微信、WhatsApp、Telegram、Slack等),我将以微信导出文本和WhatsApp导出文本这两种最常见的形式为例,演示如何使用Python脚本进行分析。
第一步:数据提取与解析
你需要将聊天记录导出为文本文件,不同软件导出格式不同:
- 微信电脑版:可通过“设置 -> 文件管理 -> 打开文件夹”找到
MSG*.db数据库文件(需解密),或者使用第三方工具导出为TXT。 - WhatsApp:设置 -> 聊天 -> 导出聊天记录 -> 选择包含或不包含媒体。
- Telegram / 钉钉:可以用官方API或第三方导出工具。
假设我们得到一个类似 chat.txt 的文件,格式如下(WhatsApp典型格式):
[2025-01-15, 08:32:21] 张三: 今天去哪吃饭?
[2025-01-15, 08:32:45] 李四: 去食堂吧
[2025-01-15, 08:33:10] 王五: 行啊 // 顺便帮我带杯咖啡
解析脚本示例(Python)
import re
import pandas as pd
def parse_whatsapp_chat(file_path):
"""
解析WhatsApp导出的聊天文本,返回DataFrame
"""
with open(file_path, 'r', encoding='utf-8') as f:
lines = f.readlines()
data = []
# 示例正则:匹配 [日期, 时间] 用户: 消息
pattern = r'\[(\d{4}-\d{2}-\d{2}),\s*(\d{2}:\d{2}:\d{2})\]\s*([^:]+):\s*(.*)'
for line in lines:
match = re.match(pattern, line.strip())
if match:
date, time, user, message = match.groups()
data.append({
'date': date,
'time': time,
'user': user.strip(),
'message': message.strip()
})
df = pd.DataFrame(data)
df['timestamp'] = pd.to_datetime(df['date'] + ' ' + df['time'])
return df
# 使用
df = parse_whatsapp_chat('chat.txt')
print(df.head())
第二步:数据清洗
聊天记录通常包含系统消息、表情符号、URL、多余空格等。
import re
def clean_message(text):
# 去除系统消息(如"张三加入了群聊")
if '已加入' in text or '已退出' in text:
return None
# 移除URL
text = re.sub(r'http\S+', '', text)
# 移除多余空格
text = re.sub(r'\s+', ' ', text).strip()
# 可选:移除特殊emoji或保留表情符号
# 这里保留所有字符
return text if text else None
df['message_clean'] = df['message'].apply(clean_message)
df = df.dropna(subset=['message_clean'])
第三步:基础统计与分析
消息量趋势(按天/小时)
import matplotlib.pyplot as plt
# 按日期统计消息数
daily_counts = df.groupby(df['timestamp'].dt.date).size()
daily_counts.plot(kind='line', figsize=(12,4))'每日消息数量')
plt.show()
# 按小时统计活跃时段
df['hour'] = df['timestamp'].dt.hour
hourly_counts = df.groupby('hour').size()
hourly_counts.plot(kind='bar')'按小时消息分布')
plt.show()
发言最多的用户(社交网络活跃度)
top_users = df['user'].value_counts().head(10) top_users.plot(kind='barh')'Top 10 发言用户')
消息长度分布
df['msg_len'] = df['message_clean'].apply(len) df['msg_len'].hist(bins=50)'消息长度分布')
情感分析(使用 textblob 或 snownlp)
# 简单情感分析(需安装 textblob 或 snownlp)
from snownlp import SnowNLP
def sentiment_score(text):
try:
return SnowNLP(text).sentiments # 0~1,越接近1越积极
except:
return 0.5
df['sentiment'] = df['message_clean'].apply(sentiment_score)
# 按用户看平均情感
user_sentiment = df.groupby('user')['sentiment'].mean().sort_values()
词云展示高频词
from wordcloud import WordCloud
# 合并所有消息
all_text = ' '.join(df['message_clean'].tolist())
# 可选:加入停用词(如“了”“的”“是”)
stopwords = set(['的', '了', '在', '是', '我', '你', '他', '她', '它', '就', '也', '都', '去', '说', '不', '有'])
wordcloud = WordCloud(
width=800, height=400,
background_color='white',
font_path='simhei.ttf', # 显示中文需要指定字体
stopwords=stopwords
).generate(all_text)
plt.figure(figsize=(12,6))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
第四步:进阶分析(社交网络与话题聚类)
用户间@关系网络(若数据包含@)
# 提取所有@用户
def extract_mentions(text):
return re.findall(r'@(\w+)', text)
df['mentions'] = df['message_clean'].apply(extract_mentions)
# 构建边列表
edges = []
for idx, row in df.iterrows():
for mention in row['mentions']:
edges.append((row['user'], mention))
edges_df = pd.DataFrame(edges, columns=['source', 'target'])
# 使用networkx作图,略
话题聚类(LDA主题模型)
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
# 分词(需先安装jieba)
import jieba
def segment(text):
words = jieba.lcut(text)
return ' '.join([w for w in words if len(w) > 1]) # 过滤单字
df['seg'] = df['message_clean'].apply(segment)
vectorizer = CountVectorizer(max_features=1000, stop_words='english') # 中文停用词需手动
X = vectorizer.fit_transform(df['seg'])
lda = LatentDirichletAllocation(n_components=5, random_state=42)
lda.fit(X)
# 打印每个主题的关键词
for idx, topic in enumerate(lda.components_):
print(f"Topic {idx}:")
print([vectorizer.get_feature_names_out()[i] for i in topic.argsort()[-10:]])
第五步:隐私与法律注意事项
- 数据脱敏:在分析前应匿名化用户名、电话号码、银行卡号等敏感信息。
- 合规性:如果数据涉及第三方(如工作群、他人聊天),需获得知情同意或确保分析用途合法。
- 存储安全:分析完成后,及时删除原始数据。
完整工作流总结
| 阶段 | 工具/库 | 产出 |
|---|---|---|
| 导出 | 微信/WhatsApp自带导出 | 文本文件 |
| 解析 | re, pandas |
结构化DataFrame |
| 清洗 | re, 自定义函数 |
干净文本 |
| 基础统计 | matplotlib, pandas |
频率图、用户排行 |
| 情感分析 | snownlp, textblob |
情感分数 |
| 词云 | wordcloud |
高频词可视化 |
| 社交网络 | networkx |
@关系图 |
| 话题模型 | scikit-learn + jieba |
主题关键词 |
快速开始:复制下面代码即可跑通(需要安装依赖)
pip install pandas matplotlib snownlp wordcloud jieba scikit-learn
然后将你的聊天记录文件命名为 chat.txt(WhatsApp格式),运行:
# 完整脚本(复制上面所有代码片段组合)
df = parse_whatsapp_chat('chat.txt')
df['message_clean'] = df['message'].apply(clean_message)
df = df.dropna()
# ... 后续分析函数调用
如果你能提供更具体的聊天记录格式或分析目标(比如你想看情感变化趋势、想找吵架高峰点、或想分析谁最积极响应),我可以帮你进一步定制脚本。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播