用 PyQt5 实现情绪识别与多搜索引擎网页搜索的简易聊天工具

背景

在日常聊天应用中,情绪感知有助于更好理解用户的心理状态,从而提供更贴心的交互和疏导建议。同时,结合多搜索引擎网页搜索功能,可以提升工具的实用性,让用户即时获取想要的信息。
本项目基于 Python 的 PyQt5 框架,利用简单的关键词字典进行多标签情绪识别,并支持用户输入关键词后自动调用指定搜索引擎网页搜索,其实就是一个简单的人机哈,以后慢慢开始给它上智能。

代码结构概览

整个程序分为几个核心部分:
情绪关键词字典和情绪建议字典
多情绪识别函数 predict_multi_emotions
PyQt5 界面类 SimpleChatApp
搜索引擎 URL 字典与网页搜索逻辑

1. 情绪关键词字典与情绪建议

EMOTION_KEYWORDS = {
    "anger": ["讨厌", "烦", "气炸", ...],
    "frustration": ["失望", "挫败", "沮丧", ...],
    "resentment": ["不公平", "委屈", ...],
    ...
    "neutral": []
}

EMOTION_SUGGESTIONS = {
    "anger": "可以试试深呼吸,或者写下来让自己冷静下来。",
    "frustration": "遇到困难时,试着分解问题一步步解决。",
    ...
    "neutral": "欢迎继续聊天,我在呢 :)"
}

作用:
通过预先定义的情绪关键词,帮助程序识别输入文本中潜在的多种情绪。
针对每类情绪给出相应的安抚或建议话术,提升交互体验。
设计思路:
细分情绪类别,不仅限于传统的“愤怒”、“悲伤”等大类,还包括“挫败”、“怨恨”、“孤独”等更细粒度的情绪,增强分析精度。
建议内容多样化,针对不同情绪给出不同的心理疏导建议,体现人性化关怀。
可扩展点:
可导入更多丰富词库或结合外部词典完善关键词。
建议可以动态加载,甚至调用在线心理咨询接口。

2. 多情绪识别函数:predict_multi_emotions

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 个情绪及其置信度。
工作流程:
将文本转换为小写,统一处理。
遍历每个情绪类别及其关键词,判断关键词是否出现在文本中。
累加匹配计数,计算每个情绪关键词的匹配次数。
根据匹配次数占所有匹配词总数的比例,计算置信度分数。
返回得分最高的几个情绪标签。
优点:
轻量级,不依赖复杂模型,实时快速响应。
多情绪叠加识别,更贴近真实多维度情绪表达。
局限性:
仅基于关键词匹配,无法处理上下文复杂语义。
无法识别隐晦或反语表达。
置信度简单计算,可考虑基于词频权重优化。

3. PyQt5 界面:SimpleChatApp 类

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() 利用系统默认浏览器打开对应搜索链接。

交互体验:
发送后输入框清空,聊天记录持续更新。
搜索引擎可自由切换,灵活满足用户需求。

4. 搜索引擎字典与搜索功能

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() 中拼接搜索词后打开浏览器。

界面显示:

用 PyQt5 实现情绪识别与多搜索引擎网页搜索的简易聊天工具_第1张图片

用 PyQt5 实现情绪识别与多搜索引擎网页搜索的简易聊天工具_第2张图片

5. 总结与展望

本项目用简洁的关键词匹配方法实现了多情绪细粒度检测,适合轻量级心理疏导和聊天场景。结合多搜索引擎支持,极大增强了工具的实用性。
未来可以尝试的方向:
结合上下文情绪趋势分析,检测情绪变化轨迹。
接入自然语言理解模型,提升语义识别准确率。
自动抓取搜索结果摘要并显示在聊天窗口,增强用户体验。
支持语音输入输出,丰富交互方式。
UI 美化及移动端适配。

你可能感兴趣的:(qt,搜索引擎,microsoft)