最基础版本的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
升级I:
“精准对答”
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
升级II:
建立知识体系
# 建立一个基于目标行业的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('上海', "镇江"))
升级III:
任何行业,都分个前端后端,利用Google的API,写一个类似钢铁侠Tony的语音小秘书Jarvis:
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
参考加号聊天机器人的model