#Python# 自己写简易聊天机器人

该文章已生成可运行项目,

基于Python的简易聊天小程序(结尾附上源码)

前言

在当今数字化时代,聊天机器人已成为人机交互的重要方式之一。本文将详细介绍一个基于Python的简易聊天小程序,该程序通过关键词匹配和相似度计算来实现智能回复功能。

任务实现

该聊天小程序的核心功能是接收用户输入,通过一系列处理后返回智能回复。主要包括以下几个部分:

  • 用户输入处理
  • 关键词匹配与相似度计算
  • 回复生成

1.用户输入处理

首先我们创建一个数据库,用于训练聊天机器人,代码如下:
PyChat.py

trainer = {
    "嗨": "你好呀!",
    "今天怎么样": "我很好,谢谢。",
    "你叫什么名字": "我是Pychat。",
    "你多大了": "我是一个程序,没有年龄哦。",
    "你能做什么": "我可以陪你聊天,回答你的问题。",
    "天气怎么样": "抱歉,我无法获取实时天气信息。",
    "今天星期几": "今天是星期日。",
    "你喜欢什么": "我喜欢和你聊天。",
    "再见": "再见!",
    "谢谢": "不客气!",
    "你好": "你好呀!",
    "晚安": "晚安,祝你做个好梦!",
    "早上好": "早上好呀!",
    "下午好": "下午好!",
    "晚上好": "晚上好!",
    "你在哪里": "我在你的电脑里哦。",
    "你是谁": "我是Pychat,一个聊天机器人。",
    "你是男生还是女生": "我是一个程序,没有性别哦。",
    "你有什么爱好": "我喜欢和你聊天。",
    "你会说中文吗": "当然啦,我会说中文。",
    "你会说英文吗": "我也可以说英文哦。Hello!",
    "你会唱歌吗": "抱歉,我不会唱歌。",
    "你会跳舞吗": "抱歉,我不会跳舞。",
    "你会画画吗": "抱歉,我不会画画。",
    "你会编程吗": "我是一个程序,当然会编程啦。"
}

之所以采用字典存储,是因为字典的键值对有利于对用户输入处理后输出合适的答案。
接下来程序应该输出问候语并获取用户输入:

print("你好,我是Pychat")
user = input("你:")

2.关键词匹配与相似度计算

算法原理

该聊天小程序使用的是基于集合的相似度计算方法,主要通过计算用户输入与训练数据的交集和并集来确定它们之间的相似度。具体公式为:
similarity = 交集大小 ÷ 并集大小 \text{similarity} = \text{交集大小}÷\text{并集大小} similarity=交集大小÷并集大小
其中,交集指的是用户输入与程序输出中相同的字符,并集指的是用户输入和程序输出中的所有字符(重复字符只保留一个)。如图所示:

交集与并集

算法流程

  1. 输入预处理:去除用户输入和训练数据中的标点符号。
  2. 交集计算:计算用户输入与训练数据的交集。
  3. 并集计算:计算用户输入与训练数据的并集。
  4. 相似度计算:根据交集和并集的大小计算相似度。

3.算法实现

去除中文和英文标点符号

import re
user = re.sub(r'[^\w\s]|[\u3000-\u303F\uFF00-\uFFEF]', '', user)

这部分代码使用正则表达式去除用户输入中的中文和英文标点符号,以便后续处理。

交集计算

intersection = []
aggregate = []
save = []
similar_list = []
common = [i for i in user if i in a_clean]
intersection.append(len(common))

intersection:交集
aggregate:并集
save:存储问题
similar_list:存储相似度

这部分代码通过列表推导式计算用户输入与训练数据的交集,并将交集的大小保存到 intersection 列表中。

并集计算

union = list(set(user + a_clean))
aggregate.append(len(union))

这部分代码通过将用户输入和训练数据合并成一个集合来计算并集,并将并集的大小保存到 aggregate 列表中。

相似度计算

for i in range(len(save)):
    if aggregate[i] == 0:
        similar_list.append(0)
    else:
        similar_list.append(intersection[i] / aggregate[i])

这部分代码根据交集和并集的大小计算相似度,并将相似度保存到 similar_list 列表中。

完整代码

import re

trainer = {
    "嗨": "你好呀!",
    "今天怎么样": "我很好,谢谢。",
    "你叫什么名字": "我是Pychat。",
    "你多大了": "我是一个程序,没有年龄哦。",
    "你能做什么": "我可以陪你聊天,回答你的问题。",
    "天气怎么样": "抱歉,我无法获取实时天气信息。",
    "今天星期几": "今天是星期日。",
    "你喜欢什么": "我喜欢和你聊天。",
    "再见": "再见!",
    "谢谢": "不客气!",
    "你好": "你好呀!",
    "晚安": "晚安,祝你做个好梦!",
    "早上好": "早上好呀!",
    "下午好": "下午好!",
    "晚上好": "晚上好!",
    "你在哪里": "我在你的电脑里哦。",
    "你是谁": "我是Pychat,一个聊天机器人。",
    "你是男生还是女生": "我是一个程序,没有性别哦。",
    "你有什么爱好": "我喜欢和你聊天。",
    "你会说中文吗": "当然啦,我会说中文。",
    "你会说英文吗": "我也可以说英文哦。Hello!",
    "你会唱歌吗": "抱歉,我不会唱歌。",
    "你会跳舞吗": "抱歉,我不会跳舞。",
    "你会画画吗": "抱歉,我不会画画。",
    "你会编程吗": "我是一个程序,当然会编程啦。"
}

print("你好,我是Pychat")

while True:
    user = input("你:")
    # 去除中文和英文标点符号
    user = re.sub(r'[^\w\s]|[\u3000-\u303F\uFF00-\uFFEF]', '', user)

    intersection = []
    aggregate = []
    save = []
    similar_list = []

    for a in trainer:
        # 去除中文和英文标点符号
        a_clean = re.sub(r'[^\w\s]|[\u3000-\u303F\uFF00-\uFFEF]', '', a)
        save.append(a)
        # 计算交集
        common = [i for i in user if i in a_clean]
        intersection.append(len(common))
        # 计算并集
        union = list(set(user + a_clean))
        aggregate.append(len(union))

    for i in range(len(save)):
        if aggregate[i] == 0:
            similar_list.append(0)
        else:
            similar_list.append(intersection[i] / aggregate[i])

    max_similarity = max(similar_list)
    x = similar_list.index(max_similarity)

    key = save[x]
    print("Pychat:", trainer[key], sep="")

    if trainer[key] == "再见!":
        break

使用while实现无限循环,并在输出再见时使用break结束程序。

算法优缺点

  1. 优点
  • 实现简单:该算法的实现非常简单,易于理解和扩展。
  • 计算高效:该算法的时间复杂度为O(n),其中n是用户输入和训练数据的长度,计算效率较高。
  1. 不足
  • 依赖于输入顺序:该算法不考虑输入的顺序,可能会导致相似度计算不准确。
  • 无法处理语义:该算法仅基于字符的匹配,无法处理语义上的相似性。

运行结果

你好,我是Pychat
你:你好
Pychat:你好呀!
你:你是谁
Pychat:我是Pychat,一个聊天机器人。
你:再见
Pychat:再见!

小结

本次我们初步利用集合算法实现Python聊天程序,该程序还存在很多不足,欢迎大家一起探讨,也请大家多多支持!

本文章已经生成可运行项目
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值