【聊天机器人篇】--聊天机器人从初始到应用

一、前述

维基百科中的机器人是指主要用于协助编者执行大量自动化、高速或机械式、繁琐的编辑工作的计算机程序或脚本及其所登录的帐户。

二、具体

1、最简单的就是基于Rule-Base的聊天机器人。

也就是计算设计好语料库的问答语句。 就是小学生级别的 问什么 答什么

import random

# 打招呼
greetings = [‘hola‘, ‘hello‘, ‘hi‘, ‘Hi‘, ‘hey!‘,‘hey‘]
# 回复打招呼
random_greeting = random.choice(greetings)

# 对于“你怎么样?”这个问题的回复
question = [‘How are you?‘,‘How are you doing?‘]
# “我很好”
responses = [‘Okay‘,"I‘m fine"]
# 随机选一个回
random_response = random.choice(responses)

# 机器人跑起来
while True:
    userInput = input(">>> ")
    if userInput in greetings:
        print(random_greeting)
    elif userInput in question:
        print(random_response)
    # 除非你说“拜拜”
    elif userInput == ‘bye‘:
        break
    else:
        print("I did not understand what you said")

结果:

>>> hi
hey
>>> how are u
I did not understand what you said
>>> how are you
I did not understand what you said
>>> how are you?
I did not understand what you said
>>> How are you?
I‘m fine
>>> bye

2、升级I:

显然 这样的rule太弱智了,我们需要更好一点的“精准对答”,比如 透过关键词来判断这句话的意图是什么(intents)。

from nltk import word_tokenize
import random

# 打招呼
greetings = [‘hola‘, ‘hello‘, ‘hi‘, ‘Hi‘, ‘hey!‘,‘hey‘]
# 回复打招呼
random_greeting = random.choice(greetings)

# 对于“假期”的话题关键词
question = [‘break‘,‘holiday‘,‘vacation‘,‘weekend‘]
# 回复假期话题
responses = [‘It was nice! I went to Paris‘,"Sadly, I just stayed at home"]
# 随机选一个回
random_response = random.choice(responses)

# 机器人跑起来
while True:
    userInput = input(">>> ")
    # 清理一下输入,看看都有哪些词
    cleaned_input = word_tokenize(userInput)
    # 这里,我们比较一下关键词,确定他属于哪个问题
    if  not set(cleaned_input).isdisjoint(greetings):
        print(random_greeting)
    elif not set(cleaned_input).isdisjoint(question):
        print(random_response)
    # 除非你说“拜拜”
    elif userInput == ‘bye‘:
        break
    else:
        print("I did not understand what you said")
>>> hi
hey
>>> how was your holiday?
It was nice! I went to Paris
>>> wow, amazing!
I did not understand what you said
>>> bye

大家大概能发现,这依旧是文字层面的“精准对应”。现在主流的研究方向,是做到语义层面的对应。比如,“肚子好饿哦”, “饭点到了”,应该表示的是要吃饭了的意思。在这个层面,就需要用到word vector之类的embedding方法,这部分内容 日后的课上会涉及到。

3、升级II:

光是会BB还是不行,得有知识体系!才能解决用户的问题。我们可以用各种数据库,建立起一套体系,然后通过搜索的方式,来查找答案。比如,最简单的就是Python自己的graph数据结构来搭建一个“地图”。依据这个地图,我们可以清楚的找寻从一个地方到另一个地方的路径,然后作为回答,反馈给用户。

# 建立一个基于目标行业的database
# 比如 这里我们用python自带的graph
graph = {‘上海‘: [‘苏州‘, ‘常州‘],
         ‘苏州‘: [‘常州‘, ‘镇江‘],
         ‘常州‘: [‘镇江‘],
         ‘镇江‘: [‘常州‘],
         ‘盐城‘: [‘南通‘],
         ‘南通‘: [‘常州‘]}

# 明确如何找到从A到B的路径
def find_path(start, end, path=[]):
    path = path + [start]
    if start == end:
        return path
    if start not in graph:
        return None
    for node in graph[start]:
        if node not in path:
            newpath = find_path(node, end, path)
            if newpath: return newpath
    return None
print(find_path(‘上海‘, "镇江"))
[‘上海‘, ‘苏州‘, ‘常州‘, ‘镇江‘]

同样的构建知识图谱的玩法,也可以使用一些Logic Programming,比如上个世纪学AI的同学都会学的Prolog。或者比如,python版本的prolog:PyKE。他们可以构建一种复杂的逻辑网络,让你方便提取信息,而不至于需要你亲手code所有的信息:

son_of(bruce, thomas, norma)
son_of(fred_a, thomas, norma)
son_of(tim, thomas, norma)
daughter_of(vicki, thomas, norma)
daughter_of(jill, thomas, norma)

4、升级III:

任何行业,都分个前端后端。AI也不例外。我们这里讲的算法,都是后端跑的。那么, 为了做一个靠谱的前端,很多项目往往也需要一个简单易用,靠谱的前端。比如,这里,利用Google的API,写一个类似钢铁侠Tony的语音小秘书Jarvis:我们先来看一个最简单的说话版本。利用gTTs(Google Text-to-Speech API), 把文本转化为音频。

from gtts import gTTS
import os
tts = gTTS(text=‘您好,我是您的私人助手,我叫小辣椒‘, lang=‘zh-tw‘)
tts.save("hello.mp3")
os.system("mpg321 hello.mp3")

同理,有了文本到语音的功能,我们还可以运用Google API读出Jarvis的回复:

(注意:这里需要你的机器安装几个库 SpeechRecognition, PyAudio 和 PySpeech)

import speech_recognition as sr
from time import ctime
import time
import os
from gtts import gTTS
import sys

# 讲出来AI的话
def speak(audioString):
    print(audioString)
    tts = gTTS(text=audioString, lang=‘en‘)
    tts.save("audio.mp3")
    os.system("mpg321 audio.mp3")

# 录下来你讲的话
def recordAudio():
    # 用麦克风记录下你的话
    r = sr.Recognizer()
    with sr.Microphone() as source:
        audio = r.listen(source)

    # 用Google API转化音频
    data = ""
    try:
        data = r.recognize_google(audio)
        print("You said: " + data)
    except sr.UnknownValueError:
        print("Google Speech Recognition could not understand audio")
    except sr.RequestError as e:
        print("Could not request results from Google Speech Recognition service; {0}".format(e))

    return data

# 自带的对话技能(rules)
def jarvis():

    while True:

        data = recordAudio()

        if "how are you" in data:
            speak("I am fine")

        if "what time is it" in data:
            speak(ctime())

        if "where is" in data:
            data = data.split(" ")
            location = data[2]
            speak("Hold on Tony, I will show you where " + location + " is.")
            os.system("open -a Safari https://www.google.com/maps/place/" + location + "/&")

        if "bye" in data:
            speak("bye bye")
            break

# 初始化
time.sleep(2)
speak("Hi Tony, what can I do for you?")

# 跑起
jarvis()
Hi Tony, what can I do for you?
You said: how are you
I am fine
You said: what time is it now
Fri Apr  7 18:16:54 2017
You said: where is London
Hold on Tony, I will show you where London is.
You said: ok bye bye
bye bye

不仅仅是语音前端。包括应用场景:微信,slack,Facebook Messager,等等 都可以把我们的ChatBot给integrate进去。

原文地址:https://www.cnblogs.com/LHWorldBlog/p/9278918.html

时间: 2024-08-29 11:51:24

【聊天机器人篇】--聊天机器人从初始到应用的相关文章

Mina airQQ聊天 客户端篇(三)

开发工具 (FlashBuilder4.7) 程序类型(Adobe Air) Flex Air做的桌面程序,效果还挺好看的,最主要是Socket这一块,它也是异步的,并且在Flex中的事件机制比较强大(个人认为) 有改一些样式,重新看看新的效果吧: 大致的实现方式: 在WindowedApplication中包含登陆窗口和主界面,用Flex中的状态来切换,聊天窗口时Window组件,好友列表用树菜单 实现好友分组,好友上线时改成在线图标,收到消息时头像抖动,聊天显示实现图文混排,系统托盘,其它貌

android asmack 注册 登陆 聊天 多人聊天室 文件传输

XMPP协议简介 XMPP协议(Extensible Messaging and PresenceProtocol,可扩展消息处理现场协议)是一种基于XML的协议,目的是为了解决及时通信标准而提出来的,最早是在Jabber上实现的.它继承了在XML环境中灵活的发展性.因此,基于XMPP的应用具有超强的可扩展性.并且XML很易穿过防火墙,所以用XMPP构建的应用不易受到防火墙的阻碍.利用XMPP作为通用的传输机制,不同组织内的不同应用都可以进行有效的通信. 这篇文章有基本的介绍,http://bl

优傲机器人:协作机器人助力电子制造业智能转型

优傲机器人:协作机器人助力电子制造业智能转型 2016-03-17 16:35:36   来源:EEWORLD    关键字: 基础  智能  质量 中国上海,2016年3月17日——人机协作机器人全球领导企业丹麦优傲机器人公司(Universal Robots)作为协作机器人市场的先驱者,一直致力于推动电子制造业的智能转型.工业4.0及<中国制造2025>的相继出现,为中国传统制造业的升级.寻求新的动能打下了良好的基础与铺垫,进一步将“中国制造”向“中国智造”方向大力推进. 为实现智能升级与

自强队2018中国机器人大赛服务机器人专项赛赛后总结会简报

会议时间:2018年5月18日17:00-19:00会议地点:上海大学(延长校区)电机楼会议室会议主持:陈万米老师参会人员:陈万米.黄慎之老师及2018中国机器人大赛服务机器人专项赛参赛学生 会议纪要: 一.队员小结 贾若楠:GPSR项目中底盘出现问题,如果有语音识别离线包可能带来更好的成绩.主观项目如果能做好实体成绩会更好. 过铭泽:WhoIsWho项目规则有漏洞,大部分队伍的机器人并没有走到志愿者面前,我们的机器人可以实现所有项目,但是由于底盘导致我们的优势没有发挥出来. 徐慧:硬件还需要深

世界聊天、阵营聊天、登录登出及服务器广播

一.如何设置玩家名字样式 当玩家世界聊天.阵营聊天.登录登出及世界广播时,服务器会提示以玩家名字XXX开头的消息 在通用设置里可以格式化设置玩家的名字样式,以分隔符|隔开,例如:数字|数字|数字|数字|数字...,具体设置如下 1 名字前添加阵营,[联盟]或[部落] 110 名字前添加职业图标 三选一 101 名字前添加职业名称 111 名字前添加职业图标和名称 210 名字前添加种族图标 三选一 201 名字前添加种族名称 211 名字前添加种族图标和名称 310 名字前添加VIP图标 三选一

Android学习之智能聊天机器人(图灵机器人)

今天我们来分享一个有趣的应用:Android版的智能聊天机器人 开发工具:Eclipse 开发时间:2015/07/07 所用技术:图灵机器人API  网络通信之异步请求 接口回调  自定义Adapter 下面我将详细叙述开发的步骤: 第一步:申请图灵机器人的API KEY 方法很简单,只需要在图灵机器人API官网注册一个账号,注册成功之后,会显示一个API KEY 图灵机器人API 账号注册网址:图灵机器人 注册成功后,点击平台接入,认真看一下API接入的流程 第二步:开始创建工程进行编码,首

我们一起学习WCF 第九篇聊天功能

说到聊天,那么其实就是传输数据,把自己写的东西传给自己想发送的那么人.我总结一下传输有三种方式 1:就是我们常见的数据库传输 2:就是文件(流)传输 3:就是socket传输 今天我们说的wcf实现聊天其实是基于socket的聊天功能(QQ聊天发展到今天肯定是很牛的了,但是最初肯定也是这样的思想) 今天我先说说基于WCF聊天的原理 1:需要一个回调函数(当用户发送的时候会吧信息回调给客户端本身) 2:需要一个委托(把服务器传来的信息显示给前台) 3:需要一个触发点击事件(目的是为了触发把发送信息

【局域网聊天客户端篇】基于socket与Qt

前言 暑假把linux下的高级编程和网络编程学习了一遍,学习很重要,但是也得有个练手的地方,所以必须做做项目来认识下自己所学习的知识. 能够找到小伙伴一起做项目也是一件很快乐的事情的,很幸运的有两个小伙伴一起做这个项目,而我正好负责整个客户端模块,她两负责编写服务器的模块. 开始吧: 项目具体描述:做一个可以实现单个服务器响应多客户端私聊和群聊的聊天工具.具体功能越丰富越好. 下面我以我们做项目的形式来讲讲我们的项目的实现. 项目策划 虽然只是私底下做项目,但是我们还是做了个小小的项目时间和项目

【探索之路】机器人篇-ROS系统并创建工作空间和项目

在ROS官网,已经给出了详细的教程.下面我就般一下砖,把相应的操作写到这里.官方网址:http://wiki.ros.org/cn/ 安装ROS系统 indigo在ubuntu上的安装教程.官网:http://wiki.ros.org/cn/indigo/Installation/Ubuntu 1. 添加sources.list 配置你的电脑使其能够安装来自 packages.ros.org的软件. ROS Indigo 仅 支持 Saucy (13.10) 和 Trusty (14.04).