使用python模拟简单客服机器人
文章目录
本次案例的背景为拥有一个装载用户基础资料及快递信息的数据表,需要机器人通过表中的索引字段及具体信息,针对用户提出的问题作出正确或有参考价值的回答。
本次案例将通过将数据表导入数据库的方式,用python连接数据库,使用正则表达式使得机器人可以针对用户的问题关键词提取所需信息并回答。
1.安装MYSQL与Navicat
1.1安装教程
开始搭建机器人之前,首先需要保证电脑搭建了MYSQL环境,本文中使用的数据库版本为MYSQL8.0,并且在本文中还使用了Navicat作为便捷操作数据库的软件,用于将csv文件导入数据库的操作。
具体的安装教程可以参考另一位博主,他的教程十分详细且有配套资源,十分适合新手进行学习。此处附上教程地址
[Python进阶(一)(MySQL,Navicat16免费安装)](https://blog.csdn.net/m0_73795841/article/details/127918876?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167800384916800211581487%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167800384916800211581487&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-127918876-null-null.142%5Ev73%5Ewechat,201%5Ev4%5Eadd_ask,239%5Ev2%5Einsert_chatgpt&utm_term=navicat16%E6%BF%80%E6%B4%BB&spm=1018.2226.3001.4187)1.2数据导入数据库
安装完毕后,将准备好的商品信息导入数据库表中进行备用。
2.开始搭建机器人
2.1 连接数据库
由于机器人在问答时需要根据后台的货物信息数据进行输出,因此在搭建机器人之前应该将python与数据库进行连接,并且使用cursor()获取游标。
import time
import mysql.connector
import re
mydb = mysql.connector.connect(
host="localhost",
user="root",
password="******", #此处*号为数据库密码
database="zz"
)
cursor = mydb.cursor()
2.2 索引设置
机器人在进行问答时,需要根据某个字段作为索引,以此来提取商品的其它基础信息,常见的有以用户账户名、商品订单号等来作为索引。根据要求,此处使用用户账户名作为索引字段(ACOUNT)。
def user_name() :
message = input("请输入您的用户名:")
time.sleep(1)
cursor = mydb.cursor()
if type(message)==int:
cursor.execute("SELECT * FROM good WHERE ACCOUNT = "+message)
elif type(message)==str:
cursor.execute("SELECT * FROM good WHERE ACCOUNT = '"+message+"'")
row = cursor.fetchone()
if row==None:
print("对不起,系统中没找到您的用户名,请重新核对您的用户名。")
user_name()
elif row !=None:
print(f"您好!尊敬的{message},很高兴为您服务,请问有什么能帮到您的吗?")
return row
row=user_name()
这个函数的作用为,当用户输入自己的用户账号名时,使用游标定位该ID所在行的全部数据,再使用fetchone命令将其全部抓取出来,保存在一个元组row当中,倘若匹配到的row为空,则代表不存在这个账户名,提示错误并让用户再次输入,若匹配到的row不为空则输出欢迎语句。
2.3 信息匹配
上一个函数中,我们已经成功将用户的账户名作为索引,当用户输入自己的账户名称后,会抓取所有剩余的商品信息保存在row当中:
接下来可以通过指定元组中的index,提取该用户账号下,指定的商品元素进行匹配,利用正则表达式将其结合成为得体句子回复客户。一下代码为将各类商品信息各自封装为一个函数,在后续客户进行提问时,通过关键词匹配到对应商品信息函数进行数据提取输出。
def start_time():#发货时间
if row[6]!=None:
print("亲您所购买的宝贝计划在"+str(row[6])+"进行发货~预计将会在"+str(row[7])+"到达,不要着急哟" )
else:
print("哎呀!机器客服这边暂时找不到相关数据呜呜呜~亲可以联系一下人工客服")
mydb.close()
def ID():#商品单号
if row[0]!=None:
print("亲您所购买的宝贝单号是"+str(row[0])+"")
else:
print("哎呀!机器客服这边暂时找不到相关数据呜呜呜~亲可以联系一下人工客服")
mydb.close()
def start_local():#发货地
if row[8]!=None:
print("亲您所购买的宝贝计划从"+str(row[8])+"发出~不要着急哟")
else:
print("哎呀!机器客服这边暂时找不到相关数据呜呜呜~亲可以联系一下人工客服")
mydb.close()
def state():#商品状态
if row[5]!=None:
print("亲您所购买的宝贝现在在"+str(row[5])+"中~不要着急哟")
else:
print("哎呀!机器客服这边暂时找不到相关数据呜呜呜~亲可以联系一下人工客服")
mydb.close()
def save():#优惠
if row[10]!=None:
print("亲您所购买的产品有"+str(row[10])+"哦")
else:
print("哎呀!机器客服这边暂时找不到相关数据呜呜呜~亲可以联系一下人工客服")
mydb.close()
def company():#优惠
if row[4]!=None:
print("亲您所购买的产品由"+str(row[4])+"派送哦,请耐心等待~")
else:
print("哎呀!机器客服这边暂时找不到相关数据呜呜呜~亲可以联系一下人工客服")
mydb.close()
def good_name():#名称
if row[2]!=None:
print("亲您所购买的物品名称为"+str(row[2])+"哦,感谢惠顾~")
else:
print("哎呀!机器客服这边暂时找不到相关数据呜呜呜~亲可以联系一下人工客服")
mydb.close()
def price():#价格
if row[3]!=None:
print("亲您所购买的物品价格为"+str(row[3])+"哦,感谢惠顾~")
else:
print("哎呀!机器客服这边暂时找不到相关数据呜呜呜~亲可以联系一下人工客服")
mydb.close()
def ending():#收货地
if row[9]!=None:
print("亲您的收货城市为"+str(row[9])+"哦,感谢惠顾~")
else:
print("哎呀!机器客服这边暂时找不到相关数据呜呜呜~亲可以联系一下人工客服")
mydb.close()
2.4 问题关键字匹配
首先定义一个空字符串str,用于存放客户输入的问题,再通过写一个问答函数的形式,使用if和else语句,将装载客户问题的字符串str与每种可能的情况进行正则匹配,若匹配上,则跳转至对应函数开始匹配货物信息表,若不匹配,则引导用户转人工客服服务。
str1=""
def answer_robot(str1):
if re.search(r'.*快递(.*)?',str1):#涉及到快递公司的问题
str2 = company()
elif re.search(r'.*发货时间(.*)?',str1):#涉及到商品时间的问题
str2 = start_time()
elif re.search(r'(\w)?[编号|单号|货号]\w',str1):#涉及到商品单号的问题
str2 = ID()
elif re.search(r'(\w)?[名称|物品]\w',str1):#涉及到商品名称的问题
str2 = good_name()
elif re.search(r'(\w)?[价格]\w',str1):#涉及到商品价格的问题
str2 = price()
elif re.search( r'(\w)?[哪里|发货地]\w',str1):#涉及到商品发货地的问题
str2 = start_local()
elif re.search(r'.*状态(.*)?',str1):#涉及到商品状态的问题
str2 = state()
elif re.search(r'.*[优惠](.*)?',str1):#涉及到商品优惠的问题
str2 = save()
elif re.search(r'.*[7天|无理由](.*)?',str1):#涉及到商品状态的问题
str2 = "亲!我们支持7天无理由退货哦~"
elif re.search(r'.*[发票](.*)?',str1):#涉及到商品状态的问题
str2 = "亲!开发票请留下必要的个人信息哟"
elif re.search(r'.*[货到付款](.*)?',str1):#涉及到商品状态的问题
str2 = "亲亲!我们暂时不支持货到付款,十分抱歉!"
elif re.search(r'.*[花呗](.*)?',str1):#涉及到商品状态的问题
str2 = "亲!我们支持花呗付款哦~"
else:
str2 = "问题太复杂啦!建议转接人工服务哟~"
return str2
2.5 编写主函数
主函数的内容为写一个死循环,当客户输入问题时,进行关键词匹配并输出答案,无论成功或者失败,在问题结束后再次让客户输入问题,且每次回答休眠1s时间
def main():
while True:#可以循环多次使用(ctrl+c结束程序)
str1 = input("请问您有什么疑问么:")
str3 = answer_robot(str1)
time.sleep(1)
print(str3)
main()
但此处有一个很大的缺点,需要使用ctrl+c中止程序,后续可以用正则匹配到类似“结束”或者“谢谢”字眼的方式跳出循环来中止程序。
3.结果展示
4.鼠鼠的一些话
本文是来自一个python萌新的一次小实战案例的纪念,其中还存在着一些纰漏,如若实在需要参考可以优化一下代码中的正则匹配,使得其匹配可以更加准确。<\p>