从零开始优化基于RuleBased的聊天机器人

这里记录从最基础的基于规则的聊天机器人,升级到基于逻辑的机器人,再升级到调用Google提供的API来让机器人能说、会听普通话。

最基本的完全基于规则式的问答:问什么就答什么,幼儿园水平。

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

完全基于规则的问答会使召回率极低,因为难以列举的问法太多。

升级I: 现在,我们使用关键词匹配来升级我们的机器人。透过关键词来判断这句话的意图是什么(intents)。

from nltk import word_tokenizeimport 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方法,这些内容将是本博客不断更新的重头戏。

升级II : 建立一个简易的知识图谱来存储“知识体系”

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

# 明确如何找到从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 Noneprint(find_path(‘上海‘, "镇江"))
[‘上海‘, ‘苏州‘, ‘常州‘, ‘镇江‘]

使用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)

升级III:  利用Google的API(需FQ)实现文字合成语音,以及语音识别。

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

同理,除了语音识别,调用Google的接口还可实现语音识别(注意:这里需要你的机器安装几个库 SpeechRecognition, PyAudio 和 PySpeech)

import speech_recognition as srfrom time import ctimeimport timeimport osfrom gtts import gTTSimport 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

原文地址:https://www.cnblogs.com/wangliman/p/9795083.html

时间: 2024-10-09 12:03:24

从零开始优化基于RuleBased的聊天机器人的相关文章

用tensorflow框架搭建基于seq2seq-attention的聊天机器人

Tensorflow版本: GPU: 1.12.0 理论部分: 参考:https://www.bilibili.com/video/av19080685,讲解的超级详细. 代码部分: 1.语料库预处理 2.搭建模型计算图 3.启动session会话,进行模型训练. 文件夹图示如下:其中data文件夹存储对话语料,ids文件夹存储词语和id之间的映射关系,tmp文件夹存储了整个的字典以及word2vec模型,checkpoint文件存储了tensorflow训练的模型. 进入代码实战部分: 首先得

安卓开发之基于AccessibilityService实现聊天机器人对其他应用的调起

前言 前几天看到一个很有趣的应用视频"小不点"交互机器人,其中有一段是用户给它发一段文字/语音,譬如"我想在美团点一份鸡排",然后"小不点"自动将美团应用弹出,并进行"鸡排"搜索等操作,如下图进行简化后的demo所示. 当时感觉到这样子的交互方式挺有趣的,在安卓上也有一定的方案可以实现,今天就基于AccessibilityService来实现了一下.(demo中省去一些自然语言处理的应用,最近也在学习这方面的知识). 一.de

Python网络编程之基于socket实现聊天机器人

通过socket实现局域网内的聊天工具. service.py文件如下: #!/usr/bin/env python # _*_ coding:utf-8 _*_ import socket # 创建一个socket对象 sk = socket.socket() # 绑定允许连接的IP地址和端口 sk.bind(('127.0.0.1', 6053, )) # 服务端允许起来之后,限制客户端连接的数量,如果超过五个连接,第六个连接来的时候直接断开第六个. sk.listen(5) while T

基于itchat定制聊天机器人

#coding=utf8import requestsimport itchat #key自己到图灵注册一个 KEY = '****************************************' def get_response(msg):   # 这里我们就像在"3. 实现最简单的与图灵机器人的交互"中做的一样  # 构造了要发送给服务器的数据   apiUrl = 'http://www.tuling123.com/openapi/api'  #图灵机器人接口   da

初识BOT聊天机器人

最近在想毕业设计做什么,因为在看Python,所以想做个Python项目,浏览网页看到了"BOT",据说这个今年(应该是过去的2016,还没适应~)有点火哈.闭关时间有点久,有点跟不上时代潮流了. BOT是什么?既然谈潮流这么高大上的东西当然不是简单指LOL里面的下路了.这里的BOT指的是ChatBot--聊天机器人. 这个我知道,微软小冰嘛,有调戏过.正好我一直想做一个用来提醒自己任务,安排时间的东西,可以和这个联系在一起,没毛病,继续百度Google. BOT的过去和现在 过去的B

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

一.前述 维基百科中的机器人是指主要用于协助编者执行大量自动化.高速或机械式.繁琐的编辑工作的计算机程序或脚本及其所登录的帐户. 二.具体 1.最简单的就是基于Rule-Base的聊天机器人. 也就是计算设计好语料库的问答语句. 就是小学生级别的 问什么 答什么 import random # 打招呼 greetings = ['hola', 'hello', 'hi', 'Hi', 'hey!','hey'] # 回复打招呼 random_greeting = random.choice(gr

Python微信公众号后台开发<005>:集成智能聊天机器人?

?给公众号集成一个智能聊天机器人 一.前述 ChatterBot是一个基于机器学习的聊天机器人引擎,构建在python上,主要特点是可以自可以从已有的对话中进行学(jiyi)习(pipei). 二.具体 1.安装 是的,安装超级简单,用pip就可以啦 pip install chatterbot 2.流程 大家已经知道chatterbot的聊天逻辑和输入输出以及存储,是由各种adapter来限定的,我们先看看流程图,一会再一起看点例子,看看怎么用. 3.每个部分都设计了不同的“适配器”(Adap

基于torch学汪峰写歌词、聊天机器人、图像着色/生成、看图说话、生成字幕

手把手教你基于torch玩转 学汪峰写词.自动聊天机器人.图像着色.图像生成.看图说话.生成字幕 作者:骁哲.李伟.小蔡.July.说明:本教程出自七月在线开发/市场团队.及七月在线5月深度学习班学员之手,有何问题欢迎加Q群交流:472899334.时间:二零一六年十月十二日. 前言 我们教梵高作画的教程发布之后,国庆7天,上百位朋友一一陆续动手尝试,大有全民DL.全民实验之感.特别是来自DL班的小蔡同学,国庆7天连做10个开源实验,并把这10个实验的简易教程(含自动聊天机器人)发布在社区上:h

基于Perfect用Swift语言编写Slack聊天机器人

基于Perfect用Swift语言编写Slack聊天机器人 本项目是专门为Slack聊天机器人定制的模板服务器. 完整的源代码下载在Github https://github.com/PerfectServers/SlackBot 在本项目模板中,一个聊天机器人可以加入授权频道,读取频道内所有用户发送的"曲奇"并记录在案,而且可以直接答复用户的有关曲奇饼干的问题. 预备知识 在您决定编译.测试或者部署您自己的基于Perfect软件框架体系的聊天机器人之前,以下基础知识??不可或缺??: