怎样用脚本分析聊天记录数据?

wen 实用脚本 2

本文目录导读:

怎样用脚本分析聊天记录数据?

  1. 第一步:数据提取与解析
  2. 第二步:数据清洗
  3. 第三步:基础统计与分析
  4. 第四步:进阶分析(社交网络与话题聚类)
  5. 第五步:隐私与法律注意事项
  6. 完整工作流总结
  7. 快速开始:复制下面代码即可跑通(需要安装依赖)

分析聊天记录数据是一个常见的数据挖掘任务,可以用于情感分析、话题聚类、用户行为分析、社交网络分析等,下面我会提供一个通用的技术路线和示例脚本思路,涵盖从数据提取、清洗到分析的完整流程。

由于聊天记录格式多样(微信、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)'消息长度分布')

情感分析(使用 textblobsnownlp

# 简单情感分析(需安装 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:]])

第五步:隐私与法律注意事项

  1. 数据脱敏:在分析前应匿名化用户名、电话号码、银行卡号等敏感信息。
  2. 合规性:如果数据涉及第三方(如工作群、他人聊天),需获得知情同意或确保分析用途合法。
  3. 存储安全:分析完成后,及时删除原始数据。

完整工作流总结

阶段 工具/库 产出
导出 微信/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()
# ... 后续分析函数调用

如果你能提供更具体的聊天记录格式或分析目标(比如你想看情感变化趋势、想找吵架高峰点、或想分析谁最积极响应),我可以帮你进一步定制脚本。

抱歉,评论功能暂时关闭!