本文目录导读:

分析聊天记录数据是一个常见的数据挖掘任务,可以用于情感分析、话题聚类、用户行为分析、社交网络分析等,下面我会提供一个通用的技术路线和示例脚本思路,涵盖从数据提取、清洗到分析的完整流程。
由于聊天记录格式多样(微信、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()
# ... 后续分析函数调用
如果你能提供更具体的聊天记录格式或分析目标(比如你想看情感变化趋势、想找吵架高峰点、或想分析谁最积极响应),我可以帮你进一步定制脚本。