Python实例题

题目

基于 Python 的简单聊天机器人

要求

  • 使用 Python 构建一个聊天机器人,支持以下功能:
    • 基于规则的简单问答系统
    • 关键词匹配和意图识别
    • 上下文记忆功能
    • 支持多轮对话
    • 可扩展的知识库
  • 使用tkinter构建图形用户界面。
  • 实现至少 5 个不同领域的问答功能。

解题思路

  • 使用tkinter构建界面,包括消息显示区和输入框。
  • 设计基于规则的问答引擎,使用关键词匹配和模式识别。
  • 实现简单的上下文管理,支持多轮对话。

代码实现

import tkinter as tk
from tkinter import ttk, scrolledtext
import re
import random
import time
from datetime import datetimeclass ChatBot:def __init__(self, root):self.root = rootself.root.title("智能聊天机器人")self.root.geometry("600x700")# 对话历史self.chat_history = []# 上下文记忆self.context = {}# 知识库self.knowledge_base = self._load_knowledge_base()# 创建主界面self.create_main_window()def _load_knowledge_base(self):"""加载知识库"""return {"问候": {"patterns": ["你好", "hi", "hello", "嗨", "早上好", "中午好", "晚上好"],"responses": ["你好!有什么我可以帮助你的吗?", "嗨,今天过得怎么样?", "你好呀!", "很高兴见到你!"]},"天气": {"patterns": ["天气", "下雨", "晴天", "温度", "多云"],"responses": ["我无法实时获取天气信息呢。你可以查看天气预报网站或应用程序。", "天气变化莫测,建议你出门前查看一下天气预报。"]},"时间": {"patterns": ["时间", "几点", "什么时候"],"responses": ["现在的时间是:{}", "当前时间为:{}"]},"姓名": {"patterns": ["你叫什么", "名字", "称呼"],"responses": ["我叫智能聊天机器人,你可以叫我小智。", "我是小智,很高兴认识你!"]},"爱好": {"patterns": ["喜欢", "爱好", "兴趣"],"responses": ["我喜欢和人聊天,了解各种知识!", "我的爱好是回答你的问题,有什么想聊的吗?"]},"功能": {"patterns": ["能做什么", "功能", "可以帮助", "用途"],"responses": ["我可以回答问题、提供信息、陪你聊天,还可以和你讨论各种话题!", "我是一个多功能聊天机器人,有什么需要我帮忙的吗?"]},"再见": {"patterns": ["再见", "拜拜", "bye", "下次见", "回头见"],"responses": ["再见!祝你有个愉快的一天!", "期待下次再聊,拜拜!", "bye~"]},"感谢": {"patterns": ["谢谢", "感谢", "感激", "谢谢啦"],"responses": ["不客气,随时为你服务!", "能帮到你我很开心!", "这是我应该做的!"]},"吃饭": {"patterns": ["吃什么", "推荐食物", "午餐", "晚餐", "早餐"],"responses": ["今天推荐你尝试一下意大利面,配上红酒和沙拉,非常美味!", "如果你喜欢中餐,可以试试宫保鸡丁和炒饭。", "寿司和刺身也是不错的选择哦!"]},"旅游": {"patterns": ["旅游", "去哪里玩", "推荐景点", "旅行"],"responses": ["如果你喜欢自然风光,可以考虑去黄山或张家界。", "历史爱好者可以去北京、西安等古都。", "喜欢海滨城市的话,三亚和厦门是不错的选择。"]},"学习": {"patterns": ["学习", "如何学习", "提高成绩", "读书"],"responses": ["制定合理的学习计划很重要,每天坚持学习一定时间。", "多做练习、总结归纳是提高学习效果的好方法。", "阅读是获取知识的有效途径,建议你多读书。"]}}def create_main_window(self):"""创建主窗口"""# 创建顶部标题ttk.Label(self.root, text="智能聊天机器人", font=('SimHei', 16, 'bold')).pack(pady=10)# 创建聊天历史显示区域chat_frame = ttk.LabelFrame(self.root, text="聊天记录")chat_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)self.chat_display = scrolledtext.ScrolledText(chat_frame, wrap=tk.WORD, state=tk.DISABLED)self.chat_display.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)# 创建输入区域input_frame = ttk.Frame(self.root)input_frame.pack(fill=tk.X, padx=10, pady=10)self.message_var = tk.StringVar()message_entry = ttk.Entry(input_frame, textvariable=self.message_var, width=50)message_entry.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=5)message_entry.bind("<Return>", self.send_message)ttk.Button(input_frame, text="发送", command=self.send_message).pack(side=tk.RIGHT, padx=5)# 创建状态栏self.status_var = tk.StringVar(value="就绪")ttk.Label(self.root, textvariable=self.status_var, relief=tk.SUNKEN, anchor=tk.W).pack(side=tk.BOTTOM, fill=tk.X)# 显示欢迎信息self._display_message("机器人", "你好!我是智能聊天机器人,有什么可以帮助你的吗?")def send_message(self, event=None):"""发送消息"""message = self.message_var.get().strip()if not message:return# 显示用户消息self._display_message("你", message)# 清空输入框self.message_var.set("")# 更新状态栏self.status_var.set("思考中...")# 在单独的线程中生成回复threading.Thread(target=self._generate_response, args=(message,)).start()def _generate_response(self, message):"""生成回复"""try:# 记录对话历史self.chat_history.append(("你", message))# 处理消息response = self._process_message(message)# 延迟显示,模拟思考time.sleep(0.5)# 显示回复self.root.after(0, lambda: self._display_message("机器人", response))# 更新状态栏self.root.after(0, lambda: self.status_var.set("就绪"))except Exception as e:self.root.after(0, lambda: self._display_message("机器人", f"抱歉,发生了错误:{str(e)}"))self.root.after(0, lambda: self.status_var.set("就绪"))def _process_message(self, message):"""处理用户消息"""# 预处理消息message = message.lower()# 检查是否有上下文if 'context' in self.context:context = self.context['context']if context == 'time':# 处理时间相关的上下文del self.context['context']return datetime.now().strftime("%Y-%m-%d %H:%M:%S")# 检查知识库匹配for category, data in self.knowledge_base.items():for pattern in data['patterns']:if re.search(pattern, message):# 特殊处理时间查询if category == "时间":self.context['context'] = 'time'# 随机选择一个回复response = random.choice(data['responses'])# 如果回复中需要填充内容if "{}" in response:if category == "时间":response = response.format(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))return response# 如果没有匹配到任何内容return "抱歉,我不理解你的问题。你可以换一种表达方式或问我其他问题。"def _display_message(self, sender, message):"""显示消息"""self.chat_display.config(state=tk.NORMAL)# 添加消息timestamp = datetime.now().strftime("%H:%M:%S")self.chat_display.insert(tk.END, f"[{timestamp}] {sender}: {message}\n\n")# 滚动到底部self.chat_display.see(tk.END)# 禁用编辑self.chat_display.config(state=tk.DISABLED)if __name__ == "__main__":root = tk.Tk()app = ChatBot(root)root.mainloop()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/87705.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87705.shtml
英文地址,请注明出处:http://en.pswp.cn/web/87705.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

相机:Camera原理讲解(使用OpenGL+QT开发三维CAD)

相机为三维场景提供了灵活便捷的视角变换和交互能力&#xff0c;通过相机操作可以实现全方位、各角度的场景浏览。 怎样在三维场景中引入相机&#xff0c;怎样处理和实现视角的放缩、移动、旋转&#xff1f;在视角旋转时以指定目标为中心又该怎样处理&#xff1f; 原文&#…

开源的虚拟电厂预测数据:资源、应用与挑战

引言 虚拟电厂(Virtual Power Plant, VPP)是一种通过聚合分布式能源资源(如太阳能、风能、储能系统、电动汽车和可控负荷)来优化电力系统运行的数字化能源管理平台。准确的预测数据是虚拟电厂高效运行的关键,而开源数据为研究者和企业提供了低成本、高透明度的解决方案。…

IDE全家桶专用快捷键----------个人独家分享!!

给大家分享一下我个人整理的快捷键&#xff0c;其中包含对电脑的操作&#xff0c;以及在编写代码时的操作&#x1f680;Window系列1 WindowsR 开启运行对话框--->输入cmd启动黑窗口​2 WindowsE 快速打开我的电脑 ​3 WindowsL 电脑锁屏 ​4 WindowsD 显示/恢复桌面 ​5 Win…

人工智能概念:RNN中的基础Encoder-Decoder框架

文章目录一、序列&#xff08;Seq2Seq&#xff09;转换的核心架构二、Encoder-Decoder框架基础原理2.1 整体工作流程2.2 编码器&#xff08;Encoder&#xff09;详解2.3 解码器&#xff08;Decoder&#xff09;工作机制与缺陷三、基础框架的核心缺陷分析&#xff08;以"欢…

R 列表:深入解析与高效应用

R 列表&#xff1a;深入解析与高效应用 引言 在R语言中&#xff0c;列表&#xff08;List&#xff09;是一种非常重要的数据结构&#xff0c;它允许我们将不同类型的数据组合在一起。列表在数据分析和统计建模中扮演着至关重要的角色。本文将深入探讨R列表的概念、创建方法、…

uniapp 国密sm2加密

1. uniapp 国密sm2加密 在uniapp中使用国密SM2算法进行加密解密&#xff0c;你可以通过安装第三方库miniprogram-sm-crypto来实现。这个库提供了SM2、SM3和SM4算法的实现&#xff0c;可以在小程序和uniapp项目中使用。 1.1. 安装miniprogram-sm-crypto 首先&#xff0c;你需要…

07_持续集成与部署:DevOps的核心引擎

07_持续集成与部署:DevOps的核心引擎 引言 在快速迭代的软件开发时代,持续集成(CI)与持续部署(CD)已成为企业提升竞争力的关键。通过自动化构建、测试和部署流程,CI/CD能够显著缩短交付周期,提高软件质量,降低发布风险。本文将深入探讨CI/CD的核心理念、实施路径与最…

电脑休眠设置

Dont Sleep的意思就是“不要睡觉”&#xff0c;用在电脑里就是“阻止休眠”的意思。但这款软件其实有“阻止休眠”和“允许休眠”两个功能。 阻止休眠时可以选择事件&#xff0c;是计时器、电池、CPU、网络这几个事件进行触发阻止休假的功能。 允许休眠也可以根据自己的需求进行…

蓝牙墨水屏上位机学习(3)

main.js中sendimg()函数学习&#xff0c;对应发送图片按钮函数代码如下&#xff1a;async function sendimg() {const canvasSize document.getElementById(canvasSize).value;const ditherMode document.getElementById(ditherMode).value;const epdDriverSelect document.…

Linux应用基础

1. 基础概念 1.1 系统调用 系统调用实际上是Linux内核为上层应用程序提供的API接口&#xff0c;方便应用程序进行调用&#xff0c;类似于SVC。 1.2 库函数 库函数是应用层里边的东西&#xff0c;在系统调用的上层&#xff0c;通常以动态库文件&#xff08;.so&#xff09;形式…

【时间序列数据处理的噩梦与救赎:一次复杂数据可视化问题的深度复盘】

时间序列数据处理的噩梦与救赎&#xff1a;一次复杂数据可视化问题的深度复盘 创建时间: 2025/7/3 技术栈: Vue 3 TypeScript UniApp ECharts 问题级别: &#x1f534; 系统性架构问题 &#x1f3af; 引言&#xff1a;当简单需求变成技术噩梦 “老哥&#xff0c;这个图表时…

Redis--黑马点评--基于stream消息队列的秒杀优化业务详解

基于redis的stream结构作为消息队列&#xff0c;实现异步秒杀下单 需求&#xff1a; 创建一个Stream类型的消息队列&#xff0c;名为stream.oreders 修改之前的秒杀下单Lua脚本&#xff0c;在认定有抢够资格后&#xff0c;直接向stream.orders中添加消息&#xff0c;内容包括…

Zephyr RTOS 防止中断影响数据写入

目录 概述 1 中断保护核心策略 1.1 中断锁定/解锁 (IRQ Locking) 1.2 自旋锁 (Spin Locks) 2 高级保护技术 2.1 双重缓冲技术 2.2 RCU (Read-Copy-Update) 模式 3 中断安全数据写入模式 3.1 FIFO队列保护 3.2 原子操作保护 4 性能优化策略 4.1 分区数据保护 4.2 中断…

Hinge×亚矩云手机:以“深度连接”为名,重构云端社交的“真实感”

当传统婚恋社交应用困于“浅层匹配”“硬件性能瓶颈”与“信任成本高企”&#xff0c;当Z世代对“灵魂共鸣、沉浸体验、隐私安全”的需求愈发迫切&#xff0c;以“设计让你删除的应用”为理念的Hinge&#xff0c;正携手亚矩云手机开启一场“云端深度社交革命”——用云端算力破…

OpenSSL 内存泄漏修复全景:119 个历史 Commit 的类型分析与防御启示

1 前言 openssl 开源库作为 C/C 项目中常用的组件库&#xff0c;截至 2025年7月4日 &#xff0c;openssl 的提交记录包含 119 个 Fix memory leak 。 本文基于源码 Commit 分析&#xff0c;揭示了 OpenSSL 内存泄漏修复从被动应对到主动防御的演进趋势&#xff0c;给各位 C/C…

十一、Python 3.13 的新特性和更新内容

1. 性能提升 1.1 解释器性能优化 更快的启动速度&#xff1a;Python 3.13 启动时间比 3.12 快约 10-15%。内存使用优化&#xff1a;减少了内存占用&#xff0c;特别是在处理大型数据结构时。 1.2 字节码优化 新的字节码指令&#xff1a;引入了更高效的字节码指令&#xff0…

后端 Maven打包 JAR 文件、前端打包dist文件、通过后端服务访问前端页面、Nginx安装与部署

打包 JAR 文件通常使用 Maven 或 Gradle 构建工具&#xff08;Spring Boot 项目默认推荐 Maven&#xff09;。以下是详细步骤和常见问题解答&#xff1a; 一、后端 Maven打包 JAR 文件 1. 确保项目是 Spring Boot 项目 项目结构应包含 pom.xml&#xff08;Maven 配置文件&am…

大数据系列 | 日志数据采集工具Filebeat的架构分析及应用

大数据系列 | 日志数据采集工具Filebeat的架构分析及应用 1. Filebeat的由来2. Filebeat原理架构分析3. Filebeat的应用3.1. 安装Filebeat3.2. 实战采集应用程序日志1. Filebeat的由来 在介绍Filebeat之前,先介绍一下Beats。Beats是一个家族的统称,Beats家族有8个成员,早期的…

基于 Vue + RuoYi 架构设计的商城Web/小程序实训课程

以下是基于 Vue RuoYi 架构设计的商城Web/小程序实训课程方案&#xff0c;结合企业级开发需求与教学实践&#xff0c;涵盖全栈技术栈与实战模块&#xff1a; &#x1f4da; 一、课程概述 目标&#xff1a;通过Vue前端 RuoYi后端&#xff08;Spring Boot&#xff09;开发企业…

Puppeteer 相关漏洞-- Google 2025 Sourceless

题目的代码非常简单,核心只有这一句 page.goto(url, { timeout: 2000 });方案1 Puppeteer 是一个常用的自动化浏览器工具&#xff0c;默认支持 Chrome&#xff0c;但也可以配置支持 Firefox。然而&#xff0c;当 Puppeteer 运行在 Firefox 上时&#xff0c;会自动关闭一些安全特…