python aiml开发文档_使用Python AIML搭建聊天机器人的方法示例
AIML全名為Artificial Intelligence Markup Language(人工智能標記語言),是一種創建自然語言軟件代理的XML語言,是由RichardS. Wallace 博士和Alicebot開源軟件組織于1995-2000年間發明創造的。AIML是一種為了匹配模式和確定響應而進行規則定義的 XML 格式。
AIML的設計目標如下:
AIML應當為大眾所易學易會。
AIML應當使最小的概念得以編碼使之基于L.I.C.E支持一種刺激-響應學科系統組件。
AIML應當兼容XML。
書寫AIML可處理程序文件應當簡單便捷。
AIML對象應當對人而言具有良好的可讀性和清晰度。
AIML的設計應當正式而簡潔。
AIML應當包含對其他語言的依附性。
關于AIML詳細的初級讀物,可翻閱Alice Bot's AIML Primer。你同樣可以在AIML Wikipedia page了解更多 AIML 的內容以及它能夠做什么。借助 Python 的 AIML 包,我們很容易實現人工智能聊天機器人。
1、安裝Python aiml庫
pip install aiml
2、獲取alice資源
Python aiml安裝完成后在Python安裝目錄下的 Lib/site-packages/aiml下會有alice子目錄,這個是系統自帶的一個簡單的語料庫。
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 >> "))
上述流程非常的簡單,接下來我們要自己從0開始創建自己的機器人。
創建標準啟動文件
標準的做法是,創建一個名為std-startup.xml的啟動文件,作為加載AIML文件的主入口點。在這個例子中,我們將創建一個基礎的文件,它匹配一個模式,并且返回一個相應。我們想要匹配模式load aiml b,然后讓它加載我們的aiml大腦作為響應。我們將在一步內創建basic_chat.aiml文件。
LOAD AIML B
basic_chat.aiml
創建一個AIML文件
在上面,我們創建的AIML文件只能處理一個模式:load aiml b。當我們向機器人輸入那個命令時,它將會嘗試加載basic_chat.aiml。除非我們真的創建了它,否則無效。下面是你可以寫進basic_chat.aiml的內容。我們將匹配兩個基本的模式和響應。
HELLO
Well, hello!
WHAT ARE YOU
I'm a bot, silly!
隨機響應
你也可以像下面這樣添加隨機響應。它將在接受到一個以”One time I”開頭的消息的時候隨機響應。*是一個匹配任何東西的通配符。
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文件是一個很有趣的事,但是它將花費很大的功夫。我覺得它需要大概10,000個模式才會開始變得真實起來。幸運的是,ALICE基金會提供了大量免費的AIML文件。在Alice Bot website上瀏覽AIML文件。
測試新建的機器人
目前為止,所有 XML 格式的 AIML 文件都準備好了。作為機器人大腦的組成部分,它們都很重要,不過目前它們只是信息(information)而已。機器人需要活過來。你可以借助任何語言定制 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 >> "))
這是我們可以開始的最簡單的程序。它創建了一個aiml對象,學習啟動文件,然后加載剩余的aiml文件。然后,它已經準備好聊天了,而我們進入了一個不斷提示用戶消息的無限循環。你將需要輸入一個機器人認識的模式。這個模式取決于你加載了哪些AIML文件。我們將啟動文件作為一個單獨的實體創建,這樣,我們之后可以向機器人添加更多的aiml文件,而不需要修改任何程序源碼。我們可以在啟動xml文件中添加更多的可供學習的文件。
加速Brain加載
當你開始擁有很多AIML文件時,它將花費很長的時間來學習。這就是brain文件從何而來。在機器人學習所有的AIML文件后,它可以直接將它的大腦保存到一個文件中,這個文件將會在后續的運行中動態加速加載時間。
# -*- 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方法,在運行的時候加載并不會將新增改變保存到brain中。你將需要刪除brain文件以便于它在下一次啟動的時候重建,或者需要修改代碼,使得它在重新加載后的某個時間點保存brain。
增加Python命令
如果你想要為你的機器人提供一些特殊的運行Python函數的命令,那么,你應該為機器人捕獲輸入消息,然后在將它發送給mybot.respond()之前處理它。在上面的例子中,我們從raw_input中獲得了用戶的輸入。然而,我們可以從任何地方獲取輸入。可能是一個TCP socket,或者是一個語音識別源碼。在它進入到AIML之前處理這個消息。你可能想要在某些特定的消息上跳過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
會話與斷言
通過指定一個會話,AIML可以為不同的人剪裁不同的會話。例如,如果某個人告訴機器人,他的名字是Alice,而另一個人告訴機器人他的名字是Bob,機器人可以區分不同的人。為了指定你所使用的會話,將其作為第二個參數傳給respond()
sessionId = 12345
mybot.respond(raw_input(">>>"), sessionId)
這對于為每一個客戶端定制個性化的對話是很有幫助的。你將必須以某種形式生成自己的會話ID,并且跟蹤它。注意,保存brain文件不會保存所有的會話值。
sessionId = 12345
# 會話信息作為字典獲取. 包含輸入輸出歷史,
# 以及任何已知斷言
sessionData = mybot.getSessionData(sessionId)
# 每一個會話ID需要時一個唯一值。
# 斷言名是機器人在與你的會話中了解到的某些/某個名字
# 機器人可能知道,你是"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響應來設置斷言
MY DOGS NAME IS *
That is interesting that you have a dog named
WHAT IS MY DOGS NAME
Your dog's name is .
使用上面的AIML,你可以告訴機器人:
My dogs name is Max
而機器人會回答你:
That is interesting that you have a dog named Max
然后,如果你問機器人:
What is my dogs name?
機器人將會回答:
Your dog's name is Max.
aiml可以用來實現對話機器人,但是用于中文有以下問題:
中文規則庫較少。規則庫相當于對話機器人的“大腦”,一般來說,規則庫越豐富,對話機器人的應對就更像人。目前英文的規則庫已經很豐富,涵蓋面很廣,而且是公開可獲取的。但公開的中文規則庫就基本沒有。
AIML解釋器對中文支持不好。實際上,Python下的Pyaiml模塊(解析器)已經能比較好的支持中文,但是也存在以下問題:英文單詞間一般都有空格或標點區分,因此具備一種“自然分詞”特性,由于中文輸入沒有以空格分隔的習慣,以上會在實踐中造成一些不便。比如要實現有/無空格的輸入匹配,就需要在規則庫中同時包含這兩種模式。
解決方案:
自己搭建語料庫(比如從字幕文件中獲取訓練)
自己中文分詞工具(如jieba)
相關開源項目:
參考資料:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
總結
以上是生活随笔為你收集整理的python aiml开发文档_使用Python AIML搭建聊天机器人的方法示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图片随意命名可能被广告拦截插件拦截
- 下一篇: Tomcat8安装即配置教程