forked from huohuoer/wechat-cli
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsentiment_analysis.py
More file actions
142 lines (121 loc) · 7.08 KB
/
Copy pathsentiment_analysis.py
File metadata and controls
142 lines (121 loc) · 7.08 KB
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# -*- coding: utf-8 -*-
"""微信聊天记录情感分析工具"""
import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')
import json
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
from textblob import TextBlob
# 初始化 VADER
analyzer = SentimentIntensityAnalyzer()
# 你和霖霖的聊天记录(从 wechat-cli 导出)
messages = [
{"sender": "霖霖", "text": "留咨线索", "time": "2026-04-13 15:19"},
{"sender": "me", "text": "我这里也 视频 6 个 小红 1", "time": "2026-04-13 15:24"},
{"sender": "霖霖", "text": "那就 11 个啊", "time": "2026-04-13 15:24"},
{"sender": "霖霖", "text": "一个都没成案吗", "time": "2026-04-13 15:25"},
{"sender": "me", "text": "一个报 5 万的,企业客户,没了后续,一 6000 的,退费。其他的没了后续", "time": "2026-04-13 15:25"},
{"sender": "霖霖", "text": "不急,我和老弟儿一起面对 [握手]", "time": "2026-04-13 15:59"},
{"sender": "me", "text": "嗯。这半个月不再拍摄新的内容。我的主要工作就是把前面的视频剪辑出来,然后离职的时候争取 1 的赔偿,在这个过程中,我与下家律所进行沟通", "time": "2026-04-13 16:01"},
{"sender": "霖霖", "text": "我的建议是跟轩主任聊,聊完换工作方案:要么就做一个账号,选题写脚本拍摄剪辑发布您全程把控;要么同时做三个账号,把剪辑分出去,您只做选题和脚本创作。先做一段时间看看效果。现在的工作方案很内耗,进度无法大力推进,您觉得呢?", "time": "2026-04-13 17:33"},
{"sender": "霖霖", "text": "我可以固定每周抽出一天或两天拍摄,按照咱们上次在交大的速度,每天可以拍几十甚至上百条,保证每日更新一条甚至多条。咱们也可以大力出奇迹呢", "time": "2026-04-13 17:36"},
{"sender": "me", "text": "我的计划是和轩主任聊完之后,我争取多一个月再离职。争取一个月的补偿。只做一个账号,短期还是出不来业绩。他们要业绩,但是没有等的这个耐心。从根上就搞不定了", "time": "2026-04-13 17:36"},
{"sender": "me", "text": "你的事情我继续做着。哪怕我不在这里了。继续弄着也没问题", "time": "2026-04-13 17:37"},
{"sender": "霖霖", "text": "有没啥短期出业绩的办法捏", "time": "2026-04-13 17:38"},
{"sender": "me", "text": "没有办法", "time": "2026-04-13 17:38"},
{"sender": "me", "text": "如果有的话,我早就用了", "time": "2026-04-13 17:38"},
{"sender": "霖霖", "text": "焦虑或者没办法时,最好的出路就是去做事,从一件件具体的细微的事情做起,先把今天的视频发出来,做着做着办法就来了", "time": "2026-04-13 17:47"},
{"sender": "霖霖", "text": "等做到第 100 件小事,就破局了", "time": "2026-04-13 17:48"},
{"sender": "me", "text": "我没有焦虑,只是很理智的分析了目前所处的情况,现在的现状就是这样。我所需要做的就是当问题来临的时候按照既定的规则来做就好了", "time": "2026-04-13 17:48"},
{"sender": "霖霖", "text": "发到 100 个视频,就有业绩", "time": "2026-04-13 17:49"},
{"sender": "霖霖", "text": "希望老弟儿留下来 [流泪]", "time": "2026-04-13 19:55"},
{"sender": "霖霖", "text": "现在就是黑暗前的黎明", "time": "2026-04-13 19:44"},
{"sender": "me", "text": "我认为,没有太大的必要去深度聊这些,你和他们合作以来,赚到钱了吗", "time": "2026-04-13 20:00"},
{"sender": "霖霖", "text": "没 [捂脸]", "time": "2026-04-13 20:00"},
{"sender": "霖霖", "text": "老弟来了还是支持蛮大的", "time": "2026-04-13 20:01"},
{"sender": "me", "text": "那就是了。所以没有意义", "time": "2026-04-13 20:01"},
]
def analyze_sentiment(text):
"""分析文本情感"""
# VADER 分数
vader_score = analyzer.polarity_scores(text)
# TextBlob 分数
try:
blob = TextBlob(text)
tb_polarity = blob.sentiment.polarity
tb_subjectivity = blob.sentiment.subjectivity
except:
tb_polarity = 0
tb_subjectivity = 0
return {
'vader': {
'pos': vader_score['pos'],
'neu': vader_score['neu'],
'neg': vader_score['neg'],
'compound': vader_score['compound']
},
'textblob': {
'polarity': tb_polarity,
'subjectivity': tb_subjectivity
}
}
def get_emotion_label(compound_score):
"""根据 compound 分数给出情感标签"""
if compound_score >= 0.05:
return "😊 积极"
elif compound_score <= -0.05:
return "😔 消极"
else:
return "😐 中性"
# 分析每条消息
print("=" * 80)
print("📊 微信聊天记录情感分析 - 霖霖对话")
print("=" * 80)
# 按发送者统计
stats = {
"霖霖": {"pos": [], "neg": [], "neu": [], "compound": []},
"me": {"pos": [], "neg": [], "neu": [], "compound": []}
}
for msg in messages:
result = analyze_sentiment(msg['text'])
msg['sentiment'] = result
msg['emotion_label'] = get_emotion_label(result['vader']['compound'])
# 统计
sender = msg['sender']
if sender in stats:
stats[sender]['pos'].append(result['vader']['pos'])
stats[sender]['neg'].append(result['vader']['neg'])
stats[sender]['neu'].append(result['vader']['neu'])
stats[sender]['compound'].append(result['vader']['compound'])
# 打印详细结果
print(f"\n[{msg['time']}] {msg['sender']}: {msg['text'][:50]}...")
print(f" 情感:{msg['emotion_label']} | 正面:{result['vader']['pos']:.2f} 中性:{result['vader']['neu']:.2f} 负面:{result['vader']['neg']:.2f} 综合:{result['vader']['compound']:.2f}")
# 汇总统计
print("\n" + "=" * 80)
print("📈 情感趋势汇总")
print("=" * 80)
for sender, data in stats.items():
if data['compound']:
avg_pos = sum(data['pos']) / len(data['pos'])
avg_neg = sum(data['neg']) / len(data['neg'])
avg_compound = sum(data['compound']) / len(data['compound'])
print(f"\n{sender}:")
print(f" 消息数:{len(data['compound'])} 条")
print(f" 平均正面:{avg_pos:.2f}")
print(f" 平均负面:{avg_neg:.2f}")
print(f" 平均综合分:{avg_compound:.2f} ({get_emotion_label(avg_compound)})")
# 关键洞察
print("\n" + "=" * 80)
print("💡 关键洞察")
print("=" * 80)
# 找出最积极和最消极的消息
all_messages = sorted(messages, key=lambda x: x['sentiment']['vader']['compound'], reverse=True)
most_positive = all_messages[0]
most_negative = all_messages[-1]
print(f"\n😊 最积极的消息:")
print(f" {most_positive['sender']}: {most_positive['text']}")
print(f" 情感分:{most_positive['sentiment']['vader']['compound']:.2f}")
print(f"\n😔 最消极的消息:")
print(f" {most_negative['sender']}: {most_negative['text']}")
print(f" 情感分:{most_negative['sentiment']['vader']['compound']:.2f}")
print("\n" + "=" * 80)