用Python做有趣的AI项目 2【进阶版】:智能聊天机器人 v2(NLTK + 规则引擎)

🧰 技术栈与工具

Python 3

NLTK(自然语言处理)

datetime(时间处理)

正则表达式 re

规则引擎(我们手动构造)

可选扩展:天气API、情感分析、数据库

📦 第一步:安装依赖

bash
pip install nltk

首次运行需要下载资源:

python

import nltk
nltk.download('punkt')
nltk.download('wordnet')
nltk.download('omw-1.4')

📚 第二步:构建核心代码框架

我们先建立一个模块化结构,便于扩展:

python
# chatbot.py
import nltk
import random
import re
import datetime
from nltk.stem import WordNetLemmatizer

# 初始化
lemmer = WordNetLemmatizer()
user_name = None  # 简单的上下文记忆

# NLP预处理
def normalize(text):
    text = text.lower()
    text = re.sub(r'[^\w\s]', '', text)
    tokens = nltk.word_tokenize(text)
    return [lemmer.lemmatize(token) for token in tokens]

🧠 第三步:定义“意图”和“规则库”

我们用关键词和模板构建规则库:

python
# 主题关键词与应答模板
intents = {
    "greeting": {
        "keywords": ["hello", "hi", "你好", "嗨", "早上好"],
        "responses": ["你好呀!", "嗨~ 你来了!", "很高兴见到你!"]
    },
    "farewell": {
        "keywords": ["bye", "goodbye", "退出", "再见", "拜拜"],
        "responses": ["再见,期待下次聊天!", "拜拜啦~", "走好鸭!"]
    },
    "name_query": {
        "keywords": ["你叫什么", "你是谁", "你的名字"],
        "responses": ["我是一个智能聊天机器人~ 你可以叫我小智。"]
    },
    "weather": {
        "keywords": ["天气", "下雨", "晴天"],
        "responses": ["今天天气挺不错的(其实我也不知道)😂", "我还不会看天气呢~ 但希望是阳光明媚的!"]
    },
    "time": {
        "keywords": ["几点", "时间", "现在是什么时候"],
        "responses": ["现在是 " + datetime.datetime.now().strftime("%H:%M")]
    },
    "default": {
        "responses": ["这个我还不太懂呢~", "你可以问我时间、天气、打招呼哦~"]
    }
}

🎯 第四步:意图识别函数

这个函数识别用户输入属于哪个意图:

python

def match_intent(user_input):
    tokens = normalize(user_input)
    for intent, data in intents.items():
        for keyword in data.get("keywords", []):
            if any(keyword in user_input for keyword in data["keywords"]):
                return intent
    return "default"

🧑‍🏫 第五步:对话生成器(根据意图生成回答)

python

def generate_response(user_input):
    global user_name

    if "我叫" in user_input:
        name_match = re.search(r"我叫(\w+)", user_input)
        if name_match:
            user_name = name_match.group(1)
            return f"好的,{user_name},我记住你啦~ 😊"
    
    intent = match_intent(user_input)
    responses = intents[intent]["responses"]
    
    if intent == "time":  # 时间动态更新
        return "现在是 " + datetime.datetime.now().strftime("%H:%M:%S")
    
    return random.choice(responses)

🖥️ 第六步:主程序循环

python

def chat():
    print("小智:你好呀!我是小智,智能聊天机器人。输入 '退出' 结束聊天~")
    
    while True:
        user_input = input("你:")
        if user_input.lower() in ['退出', '拜拜', '再见']:
            print("小智:再见,期待下次聊天!")
            break
        else:
            response = generate_response(user_input)
            print("小智:" + response)

if __name__ == "__main__":
    chat()

✅ 运行效果示例

你:你好
小智:你好呀!

你:现在几点了
小智:现在是 14:35:22

你:我叫小明
小智:好的,小明,我记住你啦~

你:天气怎么样?
小智:我还不会看天气呢~ 但希望是阳光明媚的!

你:再见
小智:拜拜啦~

🧩 进阶方向

接入真实天气 API(如 OpenWeather)

接入语音识别 + TTS(如 speech_recognition + pyttsx3)

引入情感分析(如 TextBlob)判断用户心情

多轮对话(Rasa、transformers 或记忆机制)

加入更多主题模块(如笑话、星座、翻译)

接下来我们将继续升级这个聊天机器人,加入以下功能,使其更智能、更实用:

天气查询:接入天气 API,提供实时天气信息。

语音识别与合成:实现语音输入和语音输出,提升交互体验。

情感分析:分析用户情绪,提供更贴心的回应。

多轮对话:支持上下文记忆,实现更自然的对话。

🧰 第一步:安装必要的库

bash

pip install nltk pyttsx3 SpeechRecognition requests textblob

🌤️ 第二步:接入天气 API

我们将使用免费的天气 API,如 OpenWeatherMap,获取实时天气信息。

获取 API 密钥
访问 OpenWeatherMap 官网。

注册并登录账户。

在用户中心获取 API 密钥(API Key)。

获取天气信息

python

import requests

def get_weather(city):
    api_key = '你的API密钥'
    url = f'http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&lang=zh_tw&units=metric'
    response = requests.get(url)
    data = response.json()
    if data['cod'] == 200:
        main = data['main']
        weather = data['weather'][0]
        temperature = main['temp']
        description = weather['description']
        return f"{city} 的当前天气是:{description},气温 {temperature}°C。"
    else:
        return "抱歉,我无法获取该城市的天气信息。"

#🗣️ 第三步:实现语音识别与合成
语音识别(Speech-to-Text)

python

import speech_recognition as sr

def listen():
    recognizer = sr.Recognizer()
    with sr.Microphone() as source:
        print("请说话...")
        audio = recognizer.listen(source)
        try:
            text = recognizer.recognize_google(audio, language='zh-TW')
            print(f"你说:{text}")
            return text
        except sr.UnknownValueError:
            print("抱歉,我没听清楚。")
            return ""
        except sr.RequestError:
            print("抱歉,语音服务不可用。")
            return ""

语音合成(Text-to-Speech)

python

import pyttsx3

def speak(text):
    engine = pyttsx3.init()
    engine.setProperty('rate', 150)  # 语速
    engine.setProperty('volume', 1)  # 音量
    engine.setProperty('voice', 'zh')  # 语音
    engine.say(text)
    engine.runAndWait()

😊 第四步:实现情感分析

我们将使用 TextBlob 库进行情感分析。

python

from textblob import TextBlob

def analyze_sentiment(text):
    blob = TextBlob(text)
    sentiment = blob.sentiment.polarity
    if sentiment > 0:
        return "你听起来心情不错!😊"
    elif sentiment < 0:
        return "你似乎有些不开心,我能帮忙吗?😟"
    else:
        return "你的心情很中立,有什么我可以帮你的吗?🙂"

#🧠 第五步:实现多轮对话
我们将使用一个简单的上下文管理器来记住用户的名字。

python

user_name = ""

def set_user_name(name):
    global user_name
    user_name = name
    return f"好的,我记住你叫 {user_name} 了!"

def get_user_name():
    if user_name:
        return f"你叫 {user_name},对吧?"
    else:
        return "你叫什么名字呢?"

🧩 第六步:整合所有功能

python

def chatbot():
    print("你好!我是你的智能聊天助手。")
    while True:
        print("\n你可以说:'天气' + 城市名,'语音','退出' 等。")
        text = listen()
        if '退出' in text:
            speak("再见!期待下次与您聊天。")
            break
        elif '天气' in text:
            city = text.split('天气')[-1].strip()
            if city:
                weather_info = get_weather(city)
                speak(weather_info)
            else:
                speak("请告诉我你想查询天气的城市。")
        elif '语音' in text:
            speak("你好!我可以听你说话并回应你。")
        elif '我叫' in text:
            name = text.split('我叫')[-1].strip()
            if name:
                response = set_user_name(name)
                speak(response)
            else:
                speak("你叫什么名字呢?")
        elif '你叫什么' in text:
            response = get_user_name()
            speak(response)
        else:
            sentiment_response = analyze_sentiment(text)
            speak(sentiment_response)
            print(sentiment_response)

🚀 第七步:运行聊天机器人

python

if __name__ == "__main__":
    chatbot()

📌 注意事项

天气查询:确保你已经获取并替换了有效的 OpenWeatherMap API 密钥。

语音识别:需要安装麦克风驱动,并确保环境安静以提高识别准确率。

情感分析:TextBlob 的情感分析是基于英文语料库,可能对中文的支持有限,效果可能不如预期。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值