问答机器人从0到1 04
import re,sys#导入模块
from time import strftime,gmtime
import difflib
f=open('main.txt','r',encoding='utf-8')#以读取的方式打开txt数据库
main=f.read()#读取txt文件到缓存并赋值给main
dim_nub=0#定义模糊搜索开关
def welcome():
print('先生,输入$可以关闭我嚛,模糊搜索已开启,输入&关闭')
time_return()#时间问候
wait_enter()
#while True:
def wait_enter():
question=input('...')#等待用户输入问题
if question=='':
return_word('不可以直接回车哟')
open_function(question)
def open_function(function):
global dim_nub
if function=='$':
return_word('后会有期!')
sys.exit()
elif function=='&':
if dim_nub==1:
return_word('模糊搜索已关闭,无需再次关闭')
else:
dim_nub=1
return_word('模糊搜索已关闭,输入*开启')
elif function=='*':
if dim_nub==0:
return_word('模糊搜索已开启,无需再次开启')
else:
dim_nub=0
return_word('模糊搜索已开启,输入&可再次关闭')
else:
if dim_nub==0:
trends(function)
dim(function)
elif dim_nub==1:
trends(function)
find_return(function)
def trends(word):
key_word_time=['时间','现在几点了','现在几点','time','what time','现在几点了?','几点了?','几点了','几点?','几点']
if word in key_word_time:
return_word(strftime("%Y年%m月%d日 %H:%M"))
else:
pass
def dim(word):#定义模糊搜索关键字
keywords=re.findall('\n(.*?)@',main,re.S)#问题列表
answers=re.findall('@(.*?)\n',main,re.S)#回答列表
value=keywords+answers#合并问题和回答也就是正向和逆向搜索
return_words=difflib.get_close_matches(word,value,10, cutoff=0.6)#模糊匹配
nub=int(len(return_words))#判断有多少给合适条件
if nub==1:#判断是否有多个回答
for return_word_dim in return_words:
find_return(return_word_dim)#得到模糊问题
elif nub==0:
return_word('worry,数据库模糊匹配失败....')
else:
dim_more(return_words)#跳转到多个匹配结果处理
def dim_more(key):#模糊搜索多个匹配结果处理
try:
a=key[0]#获取每一个数据
b=key[1]
c=key[2]
key_nub=input('你可能想问:\n1.{}\n2.{}\n3.{}\n'.format(a,b,c)+'..:输入序列号查看结果')
try:#尝试把key_nub转换为整型,并执行匹配操作
key_nub=int(key_nub)
if key_nub==1:#根据输入序号传递问题
find_return(a)
elif key_nub==2:
find_return(b)
elif key_nub==3:
find_return(c)
else:#输入其他数值后跳转
return_word('worry,请输入正确数值,正在跳转....')#输入错误跳转
except:
return_word('worry,输入非法字符,正在跳转....')
except:
d=key[0]
find_return(d)
def time_return():
data=strftime("%Y年%m月%d日 %H:%M")#获取当前时间
return_word('当前日期为{}'.format(data))#打印当前时间
hour=int(strftime("%H"))#获取当前小时
if 4<hour<12:#不同的时间段不同回答
return_word('上午好,先生')
elif 11<hour<17:
return_word('中午好,先生')
elif 16<hour<24:
return_word('晚上好')
else:
return_word('这么晚还不睡,和我的粑粑一起变秃头小宝贝叭~~~')
def find_return(question):
try:
#通过正则查找方便快捷
try:#正向查找
answer=re.findall('{}@(.*?)\n'.format(question),main,re.S)[0]#通过问题寻找答案
return_word(answer)#打印回答
except:#反向查找
answer=re.findall('\n(.*?)@{}\n'.format(question),main)[0]#通过答案寻找问题
return_word(answer)
except:
turn='没有找寻到答案,请换个说法试试:-)正在跳转....'
return_word(turn)
def return_word(word):
print('>>>{}'.format(word))
wait_enter()#跳转等待页面
welcome()
今天新增:1.根据用户输入特定关键词输出动态变化的数据(目前只有时间在后面将会完善)2.可以手动开启或关闭模糊搜索并且在开启模糊搜索后再次开启无效,并提示用户(关闭亦如此)3.修复输入回车的错误4.完善各项功能
效果图:
再附上一张我的数据库图片吧: