news 2026/2/3 3:25:32

初探 Python 製作一個 簡單聊天機器人

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
初探 Python 製作一個 簡單聊天機器人

前言

透過這篇文章,我們將使用 python spacCy開發一個用於聊天機器人

本範例以 Python 為基礎,結合 spaCy 的中文語言模型,實作一個可進行基本中文對話的簡易 ChatBot。

安裝相關模型

spaCy是一個用於自然語言處理的開源軟件庫

參看: https://pypi.org/project/spacy/

% pip install spacy

安裝 使用 spaCy 的 中文模型

% python3 -m spacy download zh_core_web_sm

中文模型簡介:

zh_core_web_sm: 最小的中文語言模型,用於基本的語言處理任務。

zh_core_web_md: 一個中等大小的中文語言模型,比 zh_core_web_sm 包含更多的詞彙、語言特徵和上下文訊息,可以用於更多的語言處理任務。

zh_core_web_lg: 最大的中文語言模型,比 zh_core_web_md 包含更多的語言特徵和上下文信息。

建立對話回覆檔(範例)

將回覆內容獨立存放於外部responses.json檔案,不僅能讓對話資料與程式邏輯分離,也讓後續新增或調整對話內容變靈活。

{ "greeting": [ "你好!", "你好呀,有什麼需要幫忙的嗎?", "哈囉~", "嗨,很高興見到你", "嗨!今天過得如何?" ], "how_are_you": [ "我很好,謝謝你的關心!", "還不錯,你呢?", "一切都很順利~", "心情不錯,希望你也是", "還可以,正在學習中" ], "goodbye": [ "再見!", "掰掰,祝你有美好的一天", "下次再聊!", "保重~", "期待再和你聊天" ], "thanks": [ "不客氣!", "很高興能幫上忙", "沒問題!", "隨時都可以找我", "這是我應該做的" ], "name": [ "我是簡單的聊天機器人", "你可以叫我 ChatBot", "我是一個用 Python 寫的聊天機器人", "目前還沒有名字 😄", "我是你的對話小助手" ], "help": [ "你可以跟我聊天或問問題", "我可以陪你練習對話", "你可以問我一些簡單的問題", "我還在學習中,但我會盡力回答", "試著跟我說聲你好吧" ], "default": [ "我還在學習,能換個方式說嗎?", "這個我暫時不太懂", "可以再說清楚一點嗎?", "不好意思,我沒聽懂", "這部分我還需要多學習" ], "weather": [ "今天天氣如何呢?", "我沒辦法即時查天氣", "你可以看看窗外", "天氣好壞都要保持好心情", "希望今天是個好天氣" ], "jokes": [ "為什麼程式設計師不喜歡大自然?因為有太多 bug", "程式設計師最怕三個字:可以改嗎?", "我不是懶,我只是把效能最佳化到極致", "我不是健忘,只是記憶比較挑人", "世界上最遙遠的距離,是需求文件跟實際功能", "程式跑不動的時候,先怪電腦,準沒錯", "為什麼程式設計師不喜歡出門?因為外面沒有 Wi-Fi", "Debug 就像當偵探,而兇手通常是昨天的自己", "程式寫得好不好不重要,能不能跑比較重要", "我有一個笑話關於遞迴,但你可能要聽很多次才懂", "需求說『很簡單』的時候,通常最不簡單", "為什麼程式設計師愛喝咖啡?因為沒有咖啡就沒有 code", "有時候程式不是錯,只是不照你的想法執行", "能跑的程式就是好程式", "Bug 不會消失,它只是換個地方出現", "為什麼程式設計師討厭早起?因為腦袋還沒 compile", "今天的我,比昨天多懂一個 bug", "我不是拖延症,我只是比較晚開始", "今天本來想早睡,結果手機不同意", "有時候腦袋轉得太快,身體卻跟不上", "我不是方向感不好,只是比較有探索精神", "錢不是問題,問題是我沒有錢", "我每天都很努力,只是努力在想要不要努力", "有些事情想不通,就先不要想了", "人生很多問題,睡一覺也不一定會解決,但至少比較不累", "我對未來很有規劃,只是還沒開始", "明明什麼都沒做,卻覺得很累", "有些人表面看起來很正常,其實也是", "我不是不想動,是沙發黏住我了", "今天的我,依然沒有辜負昨天的期待", "有時候沉默,不是沒話說,是在整理思緒", "夢想還在路上,只是搭的是慢車", "我不是選擇困難,只是每個都想選", "生活已經很難了,笑一個比較划算" ] }

建立檔案simple_chatbot.py

import os import spacy import json import random # 取得 目前所在的資料夾路徑 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) RESPONSES_PATH = os.path.join(BASE_DIR, "responses.json") # 載入中文模型 nlp = spacy.load("zh_core_web_sm") # 讀取回覆資料 with open(RESPONSES_PATH, "r", encoding="utf-8") as f: responses = json.load(f) def get_response(intent): return random.choice(responses.get(intent, responses["default"])) def respond_to_user(user_input): doc = nlp(user_input) text = user_input.lower() if any(word in text for word in ["你好", "哈囉", "嗨", "hello", "hi"]): return get_response("greeting") if any(word in text for word in ["你好吗", "你好嗎", "過得"]): return get_response("how_are_you") if any(word in text for word in ["你是誰", "你的名字"]): return get_response("name") if any(word in text for word in ["幫助", "能做什麼"]): return get_response("help") if any(word in text for word in ["笑話", "講個笑話", "好笑的"]): return get_response("jokes") if any(word in text for word in ["謝謝", "感謝"]): return get_response("thanks") if any(word in text for word in ["再見", "掰掰", "bye"]): return get_response("goodbye") # 使用 NER(人名/地點) for ent in doc.ents: if ent.label_ == "PERSON": return f"你提到了 {ent.text},他是你的朋友嗎?" if ent.label_ == "GPE": return f"{ent.text} 聽起來是個地方" return get_response("default") if __name__ == "__main__": print("ChatBot 已啟動,輸入「bye」結束對話") while True: user_input = input("你:") if user_input.strip() == "": continue response = respond_to_user(user_input) print("ChatBot:", response) if user_input in ["bye","再見", "掰掰"]: break

備註:

NER (命名實體識別)是什麼

一般指識別文本中具有特定意義的實體,指的是可以用專有名詞標識的事物,通常包括人名、地名、組織機構名、日期時間、專有名詞等文字。

測試

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/30 4:43:24

KeyShot许可证激活步骤及使用指南

一、KeyShot许可证激活步骤 获取许可证文件:从官方渠道或授权合作伙伴处获取KeyShot许可证文件。 打开KeyShot软件:启动软件后,您将看到许可证激活界面。 输入许可证信息:在界面中输入许可证文件的名称、许可证密钥等必要信息。 选…

作者头像 李华
网站建设 2026/1/30 18:00:23

网络编程基础:OSI 模型与 TCP/IP 协议栈详解

作为网络编程的入门核心,理解网络分层模型是掌握数据通信逻辑的关键。本文将拆解 OSI 七层模型的功能,并对比 TCP/IP 协议栈的简化设计,帮你快速建立网络通信的底层认知。一、OSI 七层模型:网络通信的 “标准框架”OSI&#xff08…

作者头像 李华
网站建设 2026/1/30 16:57:57

EagleTrader交易员采访|不遵守交易规则,真的是自由吗?

对很多交易员来说,真正的困难,从来不是行情本身。而是在一次次盈利与回撤之间,仍然愿意相信规则;是在没有掌声、没有监督的交易日里,持续做出那些“看起来不那么刺激”的选择。这类情况也往往只会被少数人长期坚持。朱…

作者头像 李华
网站建设 2026/1/30 20:16:58

java计算机毕业设计鲜花商城网 基于SpringBoot的线上花店零售与配送平台 面向节日场景的O2O鲜花订购与会员营销系统

计算机毕业设计鲜花商城网9(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。情人节、母亲节、毕业季……“送花”永远是最保险的表达,却也是最耗时的线下跑腿&#xff…

作者头像 李华
网站建设 2026/2/2 3:50:33

注意!教你选出合肥市面上正规又靠谱的门头设计安装企业!

注意!教你选出合肥市面上正规又靠谱的门头设计安装企业!在商业竞争日益激烈的当下,一个独特且合适的门头设计安装对于企业的品牌形象塑造至关重要。然而,市面上的门头设计安装企业众多,质量参差不齐,如何选…

作者头像 李华
网站建设 2026/1/29 18:13:33

失业 3 个月投 127 份简历?网安零成本转行月薪 12K,你们敢试吗?

失业 3 个月投了 127 份简历?别卷了!我靠网安转行月薪 12K,附 3 个月零成本入门攻略 去年被裁那天,我盯着招聘软件上 “35 岁以下优先” 的字样,把简历里的 “5 年行政经验” 改了又改,结果投出去的 127 份…

作者头像 李华