按上次说的,今天说说聊天机器人这个小小的项目,这个就和人工AI开始挂钩了。我们现在很容易看到小孩子的玩具某某智能语音机器人,只要连上网就能和小朋友对话,还能讲故事、学英语、朗诵古诗,再配合上各式各样的灯话,优美别致、时尚科技感超强的造型,令小朋友爱不释手、家长们也赞不绝口,享受着高科技带来的快乐。

其实这种智能机器人实现的原理很简单,还是那句万年不变的话,这就是0与1的区别,在不懂程序人看来,好神奇,世界如此奇妙;在懂程序人看来,就其实就是调用数据库和网络接口请求的结果,貌似神秘感一下子都消失了,没有神秘感也不是什么好事,大家都知道魔术是假的,但是就是吸引别人,一旦谜底揭露才发现还不如一直不说漏的好。

我写的这个聊天机器人利用的事最最简单的原理,首先不是语音对话聊天,只是最原始的命令行内容输入,聊天机器人针对输入的内容作出聊天内容的回应,就和当初我们码字聊QQ、微信似得,只不过是程序在和你聊。对于那些百无聊赖的人来说是打发时间必备之良药。貌似微信也有这方面的机器人,咱们来自己编写代码,哈哈,神不神奇?奇不奇妙?

当我一会上了代码之后,就恍然大悟,你也会说也不过如此。不过再高大上的程序、功能,最开始也是十分low的,最早的计算机还好几层楼房那么高呢。

我这个聊天机器人原理是什么呢?就是相当于电脑的搜索功能一样,只不过搜索的事语言库,这个语言库就是将我们日常说的话,或者英语日常用语几百句之类的对话,一问一答存入到这个语言库之中。我们聊天也摆脱不了这些话,什么你叫什么、你住在哪里。。。这样的唠嗑。当我们输入打字的内容,程序就会根据输入的内容在这个语言库匹配问句,匹配问句有个阈值,超过这个阈值就认为问的这句话就是语言库的这个问答,之后再把回答返回给你,哈哈,是不是很简单。如果这个语言库的内容足够丰富,回答内容足够多,再根据自己的需要选择不同的风格,什么幽默搞笑无厘头、端庄文雅名家秀风格不同选的语言库也不同。就会比真人聊天还有意思。

我的这个语言库就是从网上爬取的日常对话几千句存成一个txt文本文件,简单的不能再简单了。不过原理就是这么个原理,有兴趣的你可以爬取更多的对话内容,存入数据库。现实中的某某机器人都是联网之后,向这个数据库接口发送请求,返回来转换成语音让大、小朋友听到,聊天有聊天的语言库,讲故事有讲故事的故事库,古诗的事古诗库。下面这就是我的语言库。

我这个还可以进一步完善,实现语音和语音的聊天效果,不用黑乎乎丑陋的命令行界面,麦克风将语音输入,之后利用语音转换文字的AI接口,这样的算法不用自己来实现,咱也实现不了,但是谁叫咱们站在巨人的肩膀呢?直接调用接口,这样的接口网上很多。你的语音转换成文字,程序用这个文字去匹配,匹配到阈值超过某个值,(我写的是75),就把对应的回答获取到,在通过文字转换成语言的AI接口,通过音箱让你听到。哈哈,想和林志玲聊天就用林志玲的语音,想和郭德纲聊天就用老郭的语音,当然转成明星的语音是需要收费的。好像导航的语音就有明星的。感兴趣的可以试一试。

用到的第三方库from fuzzywuzzy import process,from fuzzywuzzy import fuzz。问题相似度的阈值代码score=fuzz.ratio(quest, key),score大于75,就程序就认为是这个问题。直接上代码,代码很简单、原理也很简单,但是这也是项目,是项目就意味着有收益。


# -*- coding: UTF-8 -*-
from fuzzywuzzy import process
from fuzzywuzzy import fuzz
import re
import os
import sys
import warnings
def txtRead(filePath, encodeType = 'utf-8'):
listLine = []
try:
file = open(filePath, 'r', encoding= encodeType)
while True:
line = file.readline()
if not line:
break
listLine.append(line)
file.close()
except Exception as e:
logger.info(str(e))
finally:
return listLine
if __name__ == '__main__':
warnings.filterwarnings('ignore')
path = os.path.abspath(os.path.dirname(sys.argv[0]))+'\Data\source.txt'
q_a=[]
qa_list = txtRead(path)
for qa in qa_list:
q=qa.strip().split("\t")[0]
a=qa.strip().split("\t")[1]
dic={q:a}
q_a.append(dic)
print("开始聊天")
while True:
print("你问: ")
quest = input()
for i in q_a:
for key,value in i.items():
score=fuzz.ratio(quest, key)
if score >75:
a=value
print('小姜机器人:',a)