Python實例題:基于 Python 的簡單聊天機器人

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;會自動關閉一些安全特…