聊天机器人Python实现案例 | 老炮儿聊机器语音 | 1st

2020-08-04 16:09:56 浏览数 (1)

世界上最早的聊天机器人诞生于20世纪80年代,名为“阿尔贝特”,用BASIC语言编写而成。目前,聊天机器人从功能和技术的角度,可以分为两类,一类是以 Siri、Amazon Echo、微软小娜等为代表,偏向于工具性的服务型机器人,另一类则是以微软小冰为代表的娱乐型机器人,这两类聊天机器人不仅是应用场景不同,其背后的技术也不尽相同,本文做一个简单的介绍,并给出一个简单有趣的Python实例。

工具型聊天机器人

工具型聊天机器人以完成任务或回答事实性问题为导向,譬如在 Siri 上可以提问“今天的天气如何?”,在 小爱同学上可以下达“小爱同学,关下灯”等指令。工具型聊天机器人背后所依赖的技术是传统的问答系统技术,即 Question Answering(QA)。

QA 技术是自然语言处理中非常受重视的一个研究方向,通常的处理流程是对于输入的问题首先做句法分析(如果是语音输入,先通过语音识别转化为文字),从而理解问题或者指令的结构和意图,当计算机能够准确地了解到用户提问的意图并能根据机器可以理解的方式重新组织之后,就需要寻找答案,通常聊天机器人的背后一定存在一个庞大的数据库(可以是基于维基百科等信息的通用型知识库,也可以是自建的领域知识库),这个数据库中存储着所有指令对应的行为或者问题对应的答案,当系统在数据库中搜索到了自己要做什么或者回答什么的时候,就可以将答案反馈给用户,或者直接实现用户的指令。

娱乐型聊天机器人

娱乐型聊天机器人,则以闲聊或者“调戏”为导向,并不需要给出某一个事实性问题的解答,只要交谈自如、博君一笑即可。

娱乐型聊天机器人,在技术上与第一类服务型机器人有比较大的不同,这一类机器人更多地伴随着深度学习的发展而发展,更准确地说,主要基于循环神经网络技术。在收集了高质量的海量对话数据之后,通过深度学习来训练一个语言模型,进而“读懂”聊天内容。Facebook 的 DeepText 文本理解引擎正是基于这样的想法而实现的。

总的来说,服务型的机器人比较实用,虽然有时候看上去笨笨的,但是一般此类聊天机器人背后都有其应用场景在支撑,比如 Amazon Echo 背后的智能家居,Siri 的个人助手,小 i 机器人的智能客服,IBM Watson 的精准医疗等等,随着在垂直领域的不断深耕,可以不断提升数据库进而提升用户的满意度。而娱乐型机器人也具有其重要价值,比如建立人、机之间的信任,让机器能够更好地为用户画像等等。目前的技术还不能将两者很好地融合在一起,因此在聊天机器人的领域,依然需要场景化的设计。

一个无聊的案例

这个案例很适合无聊的时候玩玩,在你面前的是两个聊天机器人,你可以自己输入一个话题,然后打开沉默,默默的听两个聊天机器人互相聊天。机器人名字可以随意改,比如改成漂漂美眉啊,韩国欧巴啊,感受一下聊天机器人的乐趣!

【Python源代码】

import re

import json

import requests

from time import sleep

import win32com.client

speaker = win32com.client.Dispatch("SAPI.SPVOICE")

print('机器人1:您好,我是聊天机器人菲菲。')

print('机器人2:您好,我是聊天机器人小鱼。')

replys = input("请主人输入开始话题:")

while 1:

info = replys

replysa = replys

resp = requests.get("http://api.qingyunke.com/api.php", {'key': 'free', 'appid': 0, 'msg': info})

resp.encoding = 'utf-8'

resp = resp.json()

resp = re.sub("{br}", "", resp['content'])

print('菲菲:', resp)

speaker.Speak(resp)

sleep(1)

api_url = 'http://www.tuling123.com/openapi/api'

apikey = '4fede3c4384846b9a7d0456a5e1e2943'

req = requests.post(api_url, data={'key': apikey, 'info': resp}).text

replys = json.loads(req)['text']

if replys != replysa:

print('小鱼:', replys)

speaker.Speak(replys)

sleep(1)

else:

replys = "我们换个话题吧!"

参考文章

1、 王先森科技日记:https://www.jianshu.com/p/193afa10e97b

2、 知乎:https://www.zhihu.com/question/28283196

0 人点赞