python aiml开发文档_使用Python AIML搭建聊天机器人的方法示例
AIML全名為Artificial Intelligence Markup Language(人工智能標(biāo)記語言),是一種創(chuàng)建自然語言軟件代理的XML語言,是由RichardS. Wallace 博士和Alicebot開源軟件組織于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。
書寫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ì)其他語言的依附性。
關(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庫
pip install aiml
2、獲取alice資源
Python aiml安裝完成后在Python安裝目錄下的 Lib/site-packages/aiml下會(huì)有alice子目錄,這個(gè)是系統(tǒng)自帶的一個(gè)簡(jiǎn)單的語料庫。
3、Python下加載alice
取得alice資源之后就可以直接利用Python aiml庫加載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:
raise AttributeError('module %s has not attribute __file__' % name)
return os.path.dirname(os.path.abspath(path))
alice_path = get_module_dir('aiml') + '/alice'
#切換到語料庫所在工作目錄
os.chdir(alice_path)
alice = aiml.Kernel()
alice.learn("startup.xml")
alice.respond('LOAD ALICE')
while True:
print alice.respond(raw_input("Enter your message >> "))
上述流程非常的簡(jiǎn)單,接下來我們要自己從0開始創(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文件。
LOAD AIML B
basic_chat.aiml
創(chuàng)建一個(gè)AIML文件
在上面,我們創(chuàng)建的AIML文件只能處理一個(gè)模式:load aiml b。當(dāng)我們向機(jī)器人輸入那個(gè)命令時(shí),它將會(huì)嘗試加載basic_chat.aiml。除非我們真的創(chuàng)建了它,否則無效。下面是你可以寫進(jìn)basic_chat.aiml的內(nèi)容。我們將匹配兩個(gè)基本的模式和響應(yīng)。
HELLO
Well, hello!
WHAT ARE YOU
I'm a bot, silly!
隨機(jī)響應(yīng)
你也可以像下面這樣添加隨機(jī)響應(yīng)。它將在接受到一個(gè)以”O(jiān)ne time I”開頭的消息的時(shí)候隨機(jī)響應(yīng)。*是一個(gè)匹配任何東西的通配符。
ONE TIME I *
Go on.How old are you?Be more specific.I did not know that.Are you telling the truth?I don't know what that means.Try to tell me that another way.Are you talking about an animal, vegetable or mineral?What is it?使用已存在的AIML文件
編寫你自己的AIML文件是一個(gè)很有趣的事,但是它將花費(fèi)很大的功夫。我覺得它需要大概10,000個(gè)模式才會(huì)開始變得真實(shí)起來。幸運(yùn)的是,ALICE基金會(huì)提供了大量免費(fèi)的AIML文件。在Alice Bot website上瀏覽AIML文件。
測(cè)試新建的機(jī)器人
目前為止,所有 XML 格式的 AIML 文件都準(zhǔn)備好了。作為機(jī)器人大腦的組成部分,它們都很重要,不過目前它們只是信息(information)而已。機(jī)器人需要活過來。你可以借助任何語言定制 AIML。這里還是使用Python。
# -*- coding: utf-8 -*-
import aiml
import os
mybot_path = './mybot'
#切換到語料庫所在工作目錄
os.chdir(mybot_path)
mybot = aiml.Kernel()
mybot.learn("std-startup.xml")
mybot.respond('load aiml b')
while True:
print mybot.respond(raw_input("Enter your message >> "))
這是我們可以開始的最簡(jiǎn)單的程序。它創(chuàng)建了一個(gè)aiml對(duì)象,學(xué)習(xí)啟動(dòng)文件,然后加載剩余的aiml文件。然后,它已經(jīng)準(zhǔn)備好聊天了,而我們進(jìn)入了一個(gè)不斷提示用戶消息的無限循環(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)你開始擁有很多AIML文件時(shí),它將花費(fèi)很長(zhǎng)的時(shí)間來學(xué)習(xí)。這就是brain文件從何而來。在機(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'
#切換到語料庫所在工作目錄
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:
print mybot.respond(raw_input("Enter your message >> "))
記住,如果你使用了上面寫的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è)語音識(shí)別源碼。在它進(jìn)入到AIML之前處理這個(gè)消息。你可能想要在某些特定的消息上跳過AIML處理。
while True:
message = raw_input("Enter your message >> ")
if message == "quit":
exit()
elif message == "save":
mybot.saveBrain("bot_brain.brn")
else:
bot_response = mybot.respond(message)
# Do something with bot_response
會(huì)話與斷言
通過指定一個(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)來設(shè)置斷言
MY DOGS NAME IS *
That is interesting that you have a dog named
WHAT IS MY DOGS NAME
Your dog's name is .
使用上面的AIML,你可以告訴機(jī)器人:
My dogs name is Max
而機(jī)器人會(huì)回答你:
That is interesting that you have a dog named Max
然后,如果你問機(jī)器人:
What is my dogs name?
機(jī)器人將會(huì)回答:
Your dog's name is Max.
aiml可以用來實(shí)現(xiàn)對(duì)話機(jī)器人,但是用于中文有以下問題:
中文規(guī)則庫較少。規(guī)則庫相當(dāng)于對(duì)話機(jī)器人的“大腦”,一般來說,規(guī)則庫越豐富,對(duì)話機(jī)器人的應(yīng)對(duì)就更像人。目前英文的規(guī)則庫已經(jīng)很豐富,涵蓋面很廣,而且是公開可獲取的。但公開的中文規(guī)則庫就基本沒有。
AIML解釋器對(duì)中文支持不好。實(shí)際上,Python下的Pyaiml模塊(解析器)已經(jīng)能比較好的支持中文,但是也存在以下問題:英文單詞間一般都有空格或標(biāo)點(diǎn)區(qū)分,因此具備一種“自然分詞”特性,由于中文輸入沒有以空格分隔的習(xí)慣,以上會(huì)在實(shí)踐中造成一些不便。比如要實(shí)現(xiàn)有/無空格的輸入匹配,就需要在規(guī)則庫中同時(shí)包含這兩種模式。
解決方案:
自己搭建語料庫(比如從字幕文件中獲取訓(xùn)練)
自己中文分詞工具(如jieba)
相關(guān)開源項(xiàng)目:
參考資料:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
總結(jié)
以上是生活随笔為你收集整理的python aiml开发文档_使用Python AIML搭建聊天机器人的方法示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图片随意命名可能被广告拦截插件拦截
- 下一篇: 熵权法求权重python代码