Python AIML搭建聊天機(jī)器人的過(guò)程介紹
發(fā)布日期:2016-09-22文章來(lái)源:轉(zhuǎn)載
下面我們來(lái)看一篇關(guān)于Python AIML搭建聊天機(jī)器人的過(guò)程介紹,希望這篇文章能夠幫助到各位朋友,具體的步驟細(xì)節(jié)如下文介紹。
AIML全名為Artificial Intelligence Markup Language(人工智能標(biāo)記語(yǔ)言),是一種創(chuàng)建自然語(yǔ)言軟件代理的XML語(yǔ)言,是由RichardS. Wallace 博士和Alicebot開(kāi)源軟件組織于1995-2000年間發(fā)明創(chuàng)造的。AIML是一種為了匹配模式和確定響應(yīng)而進(jìn)行規(guī)則定義的 XML 格式。
AIML的設(shè)計(jì)目標(biāo)如下:
AIML應(yīng)當(dāng)為大眾所易學(xué)易會(huì)。
AIML應(yīng)當(dāng)使最小的概念得以編碼使之基于L.I.C.E支持一種刺激-響應(yīng)學(xué)科系統(tǒng)組件。
AIML應(yīng)當(dāng)兼容XML。
書(shū)寫(xiě)AIML可處理程序文件應(yīng)當(dāng)簡(jiǎn)單便捷。
AIML對(duì)象應(yīng)當(dāng)對(duì)人而言具有良好的可讀性和清晰度。
AIML的設(shè)計(jì)應(yīng)當(dāng)正式而簡(jiǎn)潔。
AIML應(yīng)當(dāng)包含對(duì)其他語(yǔ)言的依附性。
關(guān)于AIML詳細(xì)的初級(jí)讀物,可翻閱 Alice Bot’s AIML Primer 。你同樣可以在 AIML Wikipedia page 了解更多 AIML 的內(nèi)容以及它能夠做什么。借助 Python 的 AIML 包,我們很容易實(shí)現(xiàn)人工智能聊天機(jī)器人。
1、安裝Python aiml庫(kù)
pip install aiml
2、獲取alice資源
Python aiml安裝完成后在Python安裝目錄下的 Lib/site-packages/aiml下會(huì)有alice子目錄,這個(gè)是系統(tǒng)自帶的一個(gè)簡(jiǎn)單的語(yǔ)料庫(kù)。
3、Python下加載alice
取得alice資源之后就可以直接利用Python aiml庫(kù)加載alice brain了。
# -*- coding: utf-8 -*-
import aiml
import sys
import os
def get_module_dir(name):
? ?path = getattr(sys.modules[name], '__file__', None)
? ?if not path:
? ? ? ?raiseAttributeError('module %s has not attribute __file__' % name)
? ?return os.path.dirname(os.path.abspath(path))
alice_path = get_module_dir('aiml') + '/alice'
#切換到語(yǔ)料庫(kù)所在工作目錄
os.chdir(alice_path)
alice = aiml.Kernel()
alice.learn("startup.xml")
alice.respond('LOAD ALICE')
while True:
printalice.respond(raw_input("Enter your message >> "))
上述流程非常的簡(jiǎn)單,接下來(lái)我們要自己從0開(kāi)始創(chuàng)建自己的機(jī)器人。
創(chuàng)建標(biāo)準(zhǔn)啟動(dòng)文件
標(biāo)準(zhǔn)的做法是,創(chuàng)建一個(gè)名為std-startup.xml的啟動(dòng)文件,作為加載AIML文件的主入口點(diǎn)。在這個(gè)例子中,我們將創(chuàng)建一個(gè)基礎(chǔ)的文件,它匹配一個(gè)模式,并且返回一個(gè)相應(yīng)。我們想要匹配模式load aiml b,然后讓它加載我們的aiml大腦作為響應(yīng)。我們將在一步內(nèi)創(chuàng)建basic_chat.aiml文件。
LOADAIML B
創(chuàng)建一個(gè)AIML文件
在上面,我們創(chuàng)建的AIML文件只能處理一個(gè)模式:load aiml b。當(dāng)我們向機(jī)器人輸入那個(gè)命令時(shí),它將會(huì)嘗試加載basic_chat.aiml。除非我們真的創(chuàng)建了它,否則無(wú)效。下面是你可以寫(xiě)進(jìn)basic_chat.aiml的內(nèi)容。我們將匹配兩個(gè)基本的模式和響應(yīng)。
? ? ? ?HELLO
? ? ? ?WHATAREYOU
隨機(jī)響應(yīng)
你也可以像下面這樣添加隨機(jī)響應(yīng)。它將在接受到一個(gè)以”O(jiān)ne time I”開(kāi)頭的消息的時(shí)候隨機(jī)響應(yīng)。*是一個(gè)匹配任何東西的通配符。
? ? ? ?ONETIME I *
使用已存在的AIML文件
編寫(xiě)你自己的AIML文件是一個(gè)很有趣的事,但是它將花費(fèi)很大的功夫。我覺(jué)得它需要大概10,000個(gè)模式才會(huì)開(kāi)始變得真實(shí)起來(lái)。幸運(yùn)的是,ALICE基金會(huì)提供了大量免費(fèi)的AIML文件。在 Alice Bot website 上瀏覽AIML文件。
測(cè)試新建的機(jī)器人
目前為止,所有 XML 格式的 AIML 文件都準(zhǔn)備好了。作為機(jī)器人大腦的組成部分,它們都很重要,不過(guò)目前它們只是信息(information)而已。機(jī)器人需要活過(guò)來(lái)。你可以借助任何語(yǔ)言定制 AIML。這里還是使用Python。
# -*- coding: utf-8 -*-
importaiml
importos
mybot_path = './mybot'
#切換到語(yǔ)料庫(kù)所在工作目錄
os.chdir(mybot_path)
mybot = aiml.Kernel()
mybot.learn("std-startup.xml")
mybot.respond('load aiml b')
while True:
? ?printmybot.respond(raw_input("Enter your message >> "))
這是我們可以開(kāi)始的最簡(jiǎn)單的程序。它創(chuàng)建了一個(gè)aiml對(duì)象,學(xué)習(xí)啟動(dòng)文件,然后加載剩余的aiml文件。然后,它已經(jīng)準(zhǔn)備好聊天了,而我們進(jìn)入了一個(gè)不斷提示用戶消息的無(wú)限循環(huán)。你將需要輸入一個(gè)機(jī)器人認(rèn)識(shí)的模式。這個(gè)模式取決于你加載了哪些AIML文件。我們將啟動(dòng)文件作為一個(gè)單獨(dú)的實(shí)體創(chuàng)建,這樣,我們之后可以向機(jī)器人添加更多的aiml文件,而不需要修改任何程序源碼。我們可以在啟動(dòng)xml文件中添加更多的可供學(xué)習(xí)的文件。
加速Brain加載
當(dāng)你開(kāi)始擁有很多AIML文件時(shí),它將花費(fèi)很長(zhǎng)的時(shí)間來(lái)學(xué)習(xí)。這就是brain文件從何而來(lái)。在機(jī)器人學(xué)習(xí)所有的AIML文件后,它可以直接將它的大腦保存到一個(gè)文件中,這個(gè)文件將會(huì)在后續(xù)的運(yùn)行中動(dòng)態(tài)加速加載時(shí)間。
# -*- coding: utf-8 -*-
import aiml
import os
mybot_path = './mybot'
#切換到語(yǔ)料庫(kù)所在工作目錄
os.chdir(mybot_path)
mybot = aiml.Kernel()
if os.path.isfile("mybot_brain.brn"):
? ?mybot.bootstrap(brainFile="mybot_brain.brn")
else:
? ?mybot.bootstrap(learnFiles="std-startup.xml", commands="load aiml b")
? ?mybot.saveBrain("mybot_brain.brn")
while True:
? ?printmybot.respond(raw_input("Enter your message >> "))
記住,如果你使用了上面寫(xiě)的brain方法,在運(yùn)行的時(shí)候加載并不會(huì)將新增改變保存到brain中。你將需要?jiǎng)h除brain文件以便于它在下一次啟動(dòng)的時(shí)候重建,或者需要修改代碼,使得它在重新加載后的某個(gè)時(shí)間點(diǎn)保存brain。
增加Python命令
如果你想要為你的機(jī)器人提供一些特殊的運(yùn)行Python函數(shù)的命令,那么,你應(yīng)該為機(jī)器人捕獲輸入消息,然后在將它發(fā)送給mybot.respond()之前處理它。在上面的例子中,我們從raw_input中獲得了用戶的輸入。然而,我們可以從任何地方獲取輸入??赡苁且粋€(gè)TCP socket,或者是一個(gè)語(yǔ)音識(shí)別源碼。在它進(jìn)入到AIML之前處理這個(gè)消息。你可能想要在某些特定的消息上跳過(guò)AIML處理。
while True:
? ?message = raw_input("Enter your message >> ")
? ?if message == "quit":
? ? ? ?exit()
? ?elifmessage == "save":
? ? ? ?mybot.saveBrain("bot_brain.brn")
? ?else:
? ? ? ?bot_response = mybot.respond(message)
? ? ? ?# Do something with bot_response
會(huì)話與斷言
通過(guò)指定一個(gè)會(huì)話,AIML可以為不同的人剪裁不同的會(huì)話。例如,如果某個(gè)人告訴機(jī)器人,他的名字是Alice,而另一個(gè)人告訴機(jī)器人他的名字是Bob,機(jī)器人可以區(qū)分不同的人。為了指定你所使用的會(huì)話,將其作為第二個(gè)參數(shù)傳給respond()
sessionId = 12345
mybot.respond(raw_input(">>>"), sessionId)
這對(duì)于為每一個(gè)客戶端定制個(gè)性化的對(duì)話是很有幫助的。你將必須以某種形式生成自己的會(huì)話ID,并且跟蹤它。注意,保存brain文件不會(huì)保存所有的會(huì)話值。
? ?sessionId = 12345
? ?# 會(huì)話信息作為字典獲取. 包含輸入輸出歷史,
? ?# 以及任何已知斷言
? ?sessionData = mybot.getSessionData(sessionId)
? ?# 每一個(gè)會(huì)話ID需要時(shí)一個(gè)唯一值。
? ?# 斷言名是機(jī)器人在與你的會(huì)話中了解到的某些/某個(gè)名字
? ?# 機(jī)器人可能知道,你是"Billy",而你的狗的名字是"Brandy"
? ?mybot.setPredicate("dog", "Brandy", sessionId)
? ?clients_dogs_name = mybot.getPredicate("dog", sessionId)
? ?mybot.setBotPredicate("hometown", "127.0.0.1")
? ?bot_hometown = mybot.getBotPredicate("hometown")
在AIML中,我們可以使用模板中的set響應(yīng)來(lái)設(shè)置斷言
? ? ?MYDOGSNAMEIS *
? ? ?WHATIS MYDOGSNAME
使用上面的AIML,你可以告訴機(jī)器人:
Mydogsnameis Max
而機(jī)器人會(huì)回答你:
Thatis interestingthatyouhave a dognamedMax
然后,如果你問(wèn)機(jī)器人:
Whatis mydogsname?
機(jī)器人將會(huì)回答:
Yourdog's nameis Max.
aiml可以用來(lái)實(shí)現(xiàn)對(duì)話機(jī)器人,但是用于中文有以下問(wèn)題:
中文規(guī)則庫(kù)較少。規(guī)則庫(kù)相當(dāng)于對(duì)話機(jī)器人的“大腦”,一般來(lái)說(shuō),規(guī)則庫(kù)越豐富,對(duì)話機(jī)器人的應(yīng)對(duì)就更像人。目前英文的規(guī)則庫(kù)已經(jīng)很豐富,涵蓋面很廣,而且是公開(kāi)可獲取的。但公開(kāi)的中文規(guī)則庫(kù)就基本沒(méi)有。
AIML解釋器對(duì)中文支持不好。實(shí)際上,Python下的Pyaiml模塊(解析器)已經(jīng)能比較好的支持中文,但是也存在以下問(wèn)題:英文單詞間一般都有空格或標(biāo)點(diǎn)區(qū)分,因此具備一種“自然分詞”特性,由于中文輸入沒(méi)有以空格分隔的習(xí)慣,以上會(huì)在實(shí)踐中造成一些不便。比如要實(shí)現(xiàn)有/無(wú)空格的輸入匹配,就需要在規(guī)則庫(kù)中同時(shí)包含這兩種模式。