您好,登錄后才能下訂單哦!
AIML全名為Artificial Intelligence Markup Language(人工智能標記語言),是一種創建自然語言軟件代理的XML語言,是由RichardS. Wallace 博士和Alicebot開源軟件組織于1995-2000年間發明創造的。AIML是一種為了匹配模式和確定響應而進行規則定義的 XML 格式。
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文件。
<aiml version="1.0.1" encoding="UTF-8"> <!-- std-startup.xml --> <!-- Category是一個自動的AIML單元 --> <category> <!-- Pattern用來匹配用戶輸入 --> <!-- 如果用戶輸入 "LOAD AIML B" --> <pattern>LOAD AIML B</pattern> <!-- Template是模式的響應 --> <!-- 這里學習一個aiml文件 --> <template> <learn>basic_chat.aiml</learn> <!-- 你可以在這里添加更多的aiml文件 --> <!--<learn>more_aiml.aiml</learn>--> </template> </category> </aiml>
創建一個AIML文件
在上面,我們創建的AIML文件只能處理一個模式:load aiml b。當我們向機器人輸入那個命令時,它將會嘗試加載basic_chat.aiml。除非我們真的創建了它,否則無效。下面是你可以寫進basic_chat.aiml的內容。我們將匹配兩個基本的模式和響應。
<aiml version="1.0.1" encoding="UTF-8"> <!-- basic_chat.aiml --> <aiml> <category> <pattern>HELLO</pattern> <template> Well, hello! </template> </category> <category> <pattern>WHAT ARE YOU</pattern> <template> I'm a bot, silly! </template> </category> </aiml>
隨機響應
你也可以像下面這樣添加隨機響應。它將在接受到一個以”One time I”開頭的消息的時候隨機響應。*是一個匹配任何東西的通配符。
<category> <pattern>ONE TIME I *</pattern> <template> <random> <li>Go on.</li> <li>How old are you?</li> <li>Be more specific.</li> <li>I did not know that.</li> <li>Are you telling the truth?</li> <li>I don't know what that means.</li> <li>Try to tell me that another way.</li> <li>Are you talking about an animal, vegetable or mineral?</li> <li>What is it?</li> </random> </template> </category>
使用已存在的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響應來設置斷言
<aiml version="1.0.1" encoding="UTF-8"> <category> <pattern>MY DOGS NAME IS *</pattern> <template> That is interesting that you have a dog named <set name="dog"><star/></set> </template> </category> <category> <pattern>WHAT IS MY DOGS NAME</pattern> <template> Your dog's name is <get name="dog"/>. </template> </category> </aiml>
使用上面的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可以用來實現對話機器人,但是用于中文有以下問題:
解決方案:
相關開源項目:
https://github.com/leo108/aliceCN
https://github.com/messense/wechat-bot
https://github.com/Program-O/Program-O
參考資料:
http://www.w3ii.com/aiml/aiml_introduction.html
http://www.devdungeon.com/content/ai-chat-bot-python-aiml
http://www.alicebot.org/documentation/aiml-reference.html
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。