最近憋了这么久,自己开发了一个本地人工智能(算不上真正的人工智能,只是一个问答机器人)有些繁琐,功能太多了,没法一个个解释,直接上代码
import re
import random
import time
from time import strftime,gmtime
import difflib#模糊匹配库
f=open('main.txt','r',encoding='utf-8')#读取本目录下main.txt数据库
main=f.read()#读取数据库
times=0#定义询问次数
mistake=0#定义非法询问
mid=0#初始化模糊搜索开关
sen=['风吹着我单薄的衣衫,我一个人走在想你的路上,又温暖,又凄凉。','爱一个人不是要拥有他,只要在远方默默地注视他,也就心满意足。','我现在,唯一拿的起放不下的是筷子,唯一陷进去出不来的是被窝。','男人喜欢漂亮脸蛋,女人喜欢甜言蜜语。所以女人化妆,男人撒谎。','叶子的离开,是风的追求,还是树的不挽留','风告诉我,美好总是在远方,所以它会一直不停的寻找。。。漂流的瓶子固执的躺在沙滩的怀抱,在等待,等待有一天美好会回来,所以一直等待。。。','早知如此绊人心,何如当初莫相识。','乱世浮尘,不堪遥望,唯有情意,晨光依旧。','如今最好,别说来日方长,时光难留,只有一去不返。','是谁把光阴剪成了烟花,一瞬间,看尽繁华。是谁把思念翻起了浪花,一转身,浪迹天涯。','一花一世界,一叶一追寻。一曲一场叹,一生为一人。','时光瘦,指缝宽,你的微笑始终向暖,赐了我一晌贪欢。','宠辱不惊,看庭前花开花落,去留无意,望天上云卷云舒。','永远太远,我们都承诺不起。时光变换,若干年后,变了的恐怕不只是容颜。','一朝春去红颜老,花落人亡两不知。','再美好也经不住遗忘,再悲伤也抵不过时间。','就算世界再荒芜,也总会有一个人是你的信徒。']#定义佳句
def welcome():#欢迎界面
print('Hello!'+'\n'+'输入\'$\'可以关闭我,当前模糊匹配已开启,输入\'&\'可以关闭')#实现提示用户
data=strftime("%Y/%m/%d %H:%M")#获取当前时间
time=int(strftime("%H"))#获取当前小时
print('..:现在是'+data)#向用户反馈时间并更具不同时间段反馈不同内容
if 5<time<10:#早上
print('..:早上好呀,新的一天开始了,要努力唷~')
if 9<time<13:#中午
print('..:快到吃饭的点了,想好吃什么了吗?')
if 12<time<15:#午觉
print('..:我的麻麻告诉我这个时间段该午休咯....')
if 14<time<18:#下午
print('..:下午到了,要努力工作丫~')
if 17<time<25:#晚上
print('..:时候不早了,吃完饭就睡了吧,记住:睡前擦香香,会变更漂亮')
if -1<time<3:
print('..:这么晚还不睡,和我的爸爸一起变秃头吧.....')
if 2<time<6:
print('..:已经这个点了,别睡了了吧,通宵hhhhhhhhh....')
mis()
def mis():#问答主界面
while True:#实现循环对话
key=input('User:')#等待用户输入,
global mistake#定义全局变量
global times
global mid#是否开启模糊匹配开关
if key=='$':
print('美好的时光总是短暂的,再见咯~~~'+'\n'+random.choice(sen))
break
if key=='&':
if mid==1:#模糊搜索关闭情况下提示
print('..:提示:模糊搜索已关闭,无需再次关闭....')
continue
else:#关闭模糊搜索
mid=1#关闭模糊搜索数值重置为1,关闭模糊搜索
print('..:提示:关闭成功!!输入\'*\'便可打开')
continue
if key=='*':
if mid==0:#模糊搜索开启情况下提示
print('..:提示:模糊搜索已开启,无需再次开启....')
continue
else:#开启模糊搜索
mid=0#关闭模糊搜索数值重置为0,开启模糊搜索
print('..:提示:开启成功!!输入\'*\'可以再次关闭')
continue
if key=='':
if mistake==0:
print('..:不可以直接输入回车哟~~')
if mistake==1:
print('..:孩子乖,别闹~~~~~')
if mistake==2:
print('..:别这样,SB')
if mistake>=3:
print('..:拜拜你个SB')
break
mistake+=1#非法询问累计
continue
decide(key,mid)#实现简单的操作执行
times+=1#询问次数累计
mistake=0#一次正确输入则清零非法输入次数
def decide(key,mid):#实现模糊搜索过滤
if mid==0:
dim(key)#向模糊搜索传入问题
else:#mid数值被重置,直接搜索,跳过模糊搜索
find(key)
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 in return_words:
find(return_word)#得到模糊问题
elif nub==0:
print('..:worry,数据库模糊匹配失败....')
else:
dim_more(return_words)#跳转到多个匹配结果处理
def dim_more(key):#模糊搜索多个匹配结果处理
try:
a=key[0]#获取每一个数据
b=key[1]
c=key[2]
key_nub=input('你可能想问:'+'\n'+'1:'+a+'\n'+'2:'+b+'\n'+'3:'+c+'\n'+'..:输入序列号查看结果')
try:#尝试把key_nub转换为整型,并执行匹配操作
key_nub=int(key_nub)
if key_nub==1:#根据输入序号传递问题
find(a)
elif key_nub==2:
find(b)
elif key_nub==3:
find(c)
else:#输入其他数值后跳转
print('..:worry,请输入正确数值,正在跳转....')#输入错误跳转
except:
print('..:worry,输入非法字符,正在跳转....')
except:
d=key[0]
find(d)
def find(key):#定义查找函数
try:
try:#正向查找
answer=re.findall('{}@(.*?)\n'.format(key),main)#正向查找回答
nub=int(len(answer))
if nub!=1:#判断是否有多个回答
code=input(answer[0]+' 回车查看更多回答'+'\n')#判断是否打印多个回答
if code=='':#打印
for All in answer:#循环打印多个回答
print('...:'+All)#实现打印所有回答
else:
#print('\n'+'..:')
mis()
else:
print('..:'+answer[0])
except:#反向查找
answer=re.findall('\n(.*?)@{}'.format(key),main)#查找回答
print(answer[0])
except:#数据库没有的打印错误
print('...:'+'worry,数据库没有答案,正在跳转....')
welcome()
至于数据库嘛,我没有连接,而是读取的本地txt文件
txt数据库格式为:问题@你想要的回答
数据库我就不发了,有想要的小伙伴加我QQ2113365920
我私发,再贴一下效果图吧,亲测可用,人头担保