在日常聊天应用中,情绪感知有助于更好理解用户的心理状态,从而提供更贴心的交互和疏导建议。同时,结合多搜索引擎网页搜索功能,可以提升工具的实用性,让用户即时获取想要的信息。
本项目基于 Python 的 PyQt5 框架,利用简单的关键词字典进行多标签情绪识别,并支持用户输入关键词后自动调用指定搜索引擎网页搜索,其实就是一个简单的人机哈,以后慢慢开始给它上智能。
整个程序分为几个核心部分:
情绪关键词字典和情绪建议字典
多情绪识别函数 predict_multi_emotions
PyQt5 界面类 SimpleChatApp
搜索引擎 URL 字典与网页搜索逻辑
EMOTION_KEYWORDS = {
"anger": ["讨厌", "烦", "气炸", ...],
"frustration": ["失望", "挫败", "沮丧", ...],
"resentment": ["不公平", "委屈", ...],
...
"neutral": []
}
EMOTION_SUGGESTIONS = {
"anger": "可以试试深呼吸,或者写下来让自己冷静下来。",
"frustration": "遇到困难时,试着分解问题一步步解决。",
...
"neutral": "欢迎继续聊天,我在呢 :)"
}
作用:
通过预先定义的情绪关键词,帮助程序识别输入文本中潜在的多种情绪。
针对每类情绪给出相应的安抚或建议话术,提升交互体验。
设计思路:
细分情绪类别,不仅限于传统的“愤怒”、“悲伤”等大类,还包括“挫败”、“怨恨”、“孤独”等更细粒度的情绪,增强分析精度。
建议内容多样化,针对不同情绪给出不同的心理疏导建议,体现人性化关怀。
可扩展点:
可导入更多丰富词库或结合外部词典完善关键词。
建议可以动态加载,甚至调用在线心理咨询接口。
def predict_multi_emotions(text, top_k=3):
text = text.lower()
scores = defaultdict(int)
total_matches = 0
for emotion, keywords in EMOTION_KEYWORDS.items():
for word in keywords:
if word in text:
scores[emotion] += 1
total_matches += 1
if total_matches == 0:
return [{"label": "neutral", "score": 1.0}]
emotion_scores = [(emo, count / total_matches) for emo, count in scores.items()]
emotion_scores.sort(key=lambda x: x[1], reverse=True)
result = []
for emo, score in emotion_scores[:top_k]:
result.append({"label": emo, "score": round(score, 2)})
return result
功能:
接收用户输入文本,按情绪关键词统计匹配次数。
支持多标签识别,返回匹配度最高的前 top_k 个情绪及其置信度。
工作流程:
将文本转换为小写,统一处理。
遍历每个情绪类别及其关键词,判断关键词是否出现在文本中。
累加匹配计数,计算每个情绪关键词的匹配次数。
根据匹配次数占所有匹配词总数的比例,计算置信度分数。
返回得分最高的几个情绪标签。
优点:
轻量级,不依赖复杂模型,实时快速响应。
多情绪叠加识别,更贴近真实多维度情绪表达。
局限性:
仅基于关键词匹配,无法处理上下文复杂语义。
无法识别隐晦或反语表达。
置信度简单计算,可考虑基于词频权重优化。
class SimpleChatApp(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("多情绪识别+多引擎网页搜索聊天工具")
self.resize(500, 450)
self.init_ui()
def init_ui(self):
layout = QVBoxLayout()
self.chat_box = QTextEdit()
self.chat_box.setReadOnly(True)
layout.addWidget(self.chat_box)
self.input_line = QLineEdit()
self.input_line.setPlaceholderText("请输入消息...(输入 @搜索 关键词 可自动网页搜索)")
layout.addWidget(self.input_line)
self.engine_selector = QComboBox()
self.engine_selector.addItems(SEARCH_ENGINES.keys())
layout.addWidget(self.engine_selector)
self.send_button = QPushButton("发送")
self.send_button.clicked.connect(self.handle_send)
layout.addWidget(self.send_button)
self.setLayout(layout)
def handle_send(self):
user_text = self.input_line.text().strip()
if not user_text:
return
self.chat_box.append(f"你: {user_text}")
self.input_line.clear()
if user_text.startswith("@搜索") or user_text.startswith("@查找"):
query = user_text[3:].strip()
if query:
engine = self.engine_selector.currentText()
self.chat_box.append(f"助手: 正在通过 {engine} 搜索:{query}\n")
self.perform_web_search(query, engine)
return
emotions = predict_multi_emotions(user_text, top_k=3)
response_lines = []
for emo_dict in emotions:
label = emo_dict['label']
score = emo_dict['score']
suggestion = EMOTION_SUGGESTIONS.get(label, "")
response_lines.append(f"检测到情绪:{label} (置信度 {score:.2f})\n建议:{suggestion}")
self.chat_box.append("助手: " + "\n\n".join(response_lines) + "\n")
def perform_web_search(self, query, engine):
base_url = SEARCH_ENGINES.get(engine, SEARCH_ENGINES["Google"])
url = f"{base_url}{query}"
webbrowser.open(url)
界面组件:
QTextEdit 作为聊天窗口,显示聊天历史。
QLineEdit 用于用户输入消息。
QComboBox 提供搜索引擎选择。
QPushButton 用于发送消息。
功能点:
用户输入文本后点击发送。
判断是否以 @搜索 或 @查找 开头,是则执行网页搜索。
否则执行情绪识别,返回多个情绪及建议。
结果以聊天助手消息形式追加显示。
事件处理:
handle_send() 方法负责整体逻辑分支控制。
perform_web_search() 利用系统默认浏览器打开对应搜索链接。
交互体验:
发送后输入框清空,聊天记录持续更新。
搜索引擎可自由切换,灵活满足用户需求。
SEARCH_ENGINES = {
"Google": "https://www.google.com/search?q=",
"Bing": "https://www.bing.com/search?q=",
"百度": "https://www.baidu.com/s?wd="
}
用途:根据用户选择动态生成搜索链接。
使用:perform_web_search() 中拼接搜索词后打开浏览器。
界面显示:
本项目用简洁的关键词匹配方法实现了多情绪细粒度检测,适合轻量级心理疏导和聊天场景。结合多搜索引擎支持,极大增强了工具的实用性。
未来可以尝试的方向:
结合上下文情绪趋势分析,检测情绪变化轨迹。
接入自然语言理解模型,提升语义识别准确率。
自动抓取搜索结果摘要并显示在聊天窗口,增强用户体验。
支持语音输入输出,丰富交互方式。
UI 美化及移动端适配。