AIML学习(一)
AIML 是什么?
AIML由Richard Wallace發(fā)明。他設(shè)計(jì)了一個(gè)名為 A.L.I.C.E. (Artificial Linguistics Internet Computer Entity 人工語(yǔ)言網(wǎng)計(jì)算機(jī)實(shí)體) 的機(jī)器人,并獲得了多項(xiàng)人工智能大獎(jiǎng)。有趣的是,圖靈測(cè)試的其中一項(xiàng)就在尋找這樣的人工智能:人與機(jī)器人通過文本界面展開數(shù)分鐘的交流,以此查看機(jī)器人是否會(huì)被當(dāng)作人類。AIML是一種為了匹配模式和確定響應(yīng)而進(jìn)行規(guī)則定義的 XML 格式。
關(guān)于 AIML 詳細(xì)的初級(jí)讀物,可翻閱 Alice Bot’s AIML Primer。你同樣可以在 AIML Wikipedia page了解更多 AIML 的內(nèi)容以及它能夠做什么。我們首先將創(chuàng)建 AIML 文件,并用 Python 賦予它生命。
創(chuàng)建標(biāo)準(zhǔn)的啟動(dòng)文件
創(chuàng)建一個(gè)啟動(dòng)文件 std-startup.xml 作為讀取AIML文件的主入口點(diǎn)是標(biāo)準(zhǔn)做法。在這里,將創(chuàng)建了一個(gè)初始文件用來(lái)匹配一種模式和進(jìn)行一個(gè)動(dòng)作。我們想匹配模式 load aiml b ,并且使它載入我們的 aiml 大腦作為響應(yīng)。我們將即時(shí)創(chuàng)建 basic_chat.aiml 文件。
創(chuàng)建 AIML 文件
上面我們已經(jīng)創(chuàng)建了只有一種模式句柄的 AIML 文件,load aiml b。當(dāng)我們通過命令行運(yùn)行這個(gè)機(jī)器人,它會(huì)嘗試讀取 basic_chat.aiml。除非我們已經(jīng)完成創(chuàng)建,否則載入失敗。下面的示例代碼將告訴你 basic_chat.aiml 文件可以加入什么。我們將匹配兩種基礎(chǔ)的模式和響應(yīng)。
隨機(jī)響應(yīng)
你同樣可以像下面的示例代碼一樣添加隨機(jī)響應(yīng)。當(dāng)接收到“One time I”開頭的信息(message),通配符“*”可以進(jìn)行模糊匹配。
運(yùn)用 Python
目前為止,所有 XML 格式的 AIML 文件都準(zhǔn)備好了。作為機(jī)器人大腦的組成部分,它們都很重要,不過目前它們只是信息(information)而已。機(jī)器人需要活過來(lái)。你可以借助任何語(yǔ)言定制 AIML,但某些好心人已經(jīng)用 Python 這么做了。
注意,aiml 包只能在 Python2 環(huán)境下運(yùn)行。
最簡(jiǎn)單的 Python 程序
我們可以用如下最簡(jiǎn)單程序入門。它創(chuàng)建了 aiml 類,學(xué)習(xí)啟動(dòng)文件,然后讀取其余 aiml 文件。接下來(lái),它已經(jīng)準(zhǔn)備好聊天了,我們也進(jìn)入了一個(gè)不斷提示用戶輸入信息的死循環(huán)。你需要輸入一個(gè)機(jī)器人能識(shí)別的模式。模式的識(shí)別取決于你載入的 AIML 文件。
因?yàn)槲覀兘?dòng)文件作為獨(dú)立實(shí)體,所以我們稍后可以對(duì)機(jī)器人添加更多 aiml 文件而不需要調(diào)試任何程序的源代碼。只有在 xml 格式的 starup 下,我們才能添加更多文件。
import aiml# 創(chuàng)建Kernel()和 AIML 學(xué)習(xí)文件 kernel = aiml.Kernel() kernel.learn("std-startup.xml") kernel.respond("load aiml b")# 按組合鍵 CTRL-C 停止循環(huán) while True:print kernel.respond(raw_input("Enter your message >> "))加速大腦載入
當(dāng)你漸漸有了許多 AIML 文件,機(jī)器人就需要很多時(shí)間去學(xué)習(xí)。這就需要大腦文件的介入了。在機(jī)器人學(xué)習(xí)完所有 AIML 文件后,它可以直接以文件形式存儲(chǔ)大腦,再次運(yùn)行時(shí)可以大大提升載入時(shí)間。
運(yùn)行時(shí)重載 AIML
運(yùn)行時(shí),你可以發(fā)送載入信息給機(jī)器人,接著將會(huì)重載 AIML 文件。注意你是否像上文那樣使用了大腦方式,飛速重載不會(huì)造成大腦有新的變化。你要么刪除大腦文件,以便下次啟動(dòng)時(shí)重建;要么修改代碼,以便重載后的某一時(shí)刻能夠儲(chǔ)存大腦。下一節(jié)將利用新建 Python 命令來(lái)讓機(jī)器人執(zhí)行這些操作。
添加 Python 命令
如果你想通過運(yùn)行 Python 函數(shù)來(lái)為機(jī)器人添加一些特別的命令,那么你應(yīng)該在發(fā)送 kernel.respond() 函數(shù)前截取輸入信息并處理。在上述的例子中,我們借助 raw_input 函數(shù)獲取用戶的輸入。由此我們無(wú)論如何都能獲取我們的輸入信息。可能好似一個(gè) TCP 套接字(socket),或者使聲源轉(zhuǎn)換成文本源。你也許不想 AIML 處理對(duì)于某些信息。因此在它們傳遞給 AIML 時(shí)處理。
會(huì)話和謂詞(Predicates)
通過指定會(huì)話,AIML 能根據(jù)不同對(duì)話者隨機(jī)應(yīng)變。舉個(gè)例子,如果某人告訴機(jī)器人他們叫 Alice,另一個(gè)人則告訴機(jī)器人它叫 Bob,機(jī)器人可以分清他們。指定你需要的會(huì)話,將它作為第二個(gè)參數(shù)傳遞給 respond()。
和每個(gè)客戶都能有個(gè)性化的對(duì)話——這棒極了。你不得不生成你特有的會(huì)話ID并追蹤。記住保存大腦文件不要保存所有的會(huì)話值。
sessionId = 12345# 將會(huì)話信息作為字典 # 包含輸入輸出的歷史像已知謂詞那樣 sessionData = kernel.getSessionData(sessionId)# 每個(gè)會(huì)話ID需要一個(gè)唯一的值 # 用會(huì)話中機(jī)器人已知的人或事給謂詞命名 # 機(jī)器人已經(jīng)知道你叫"Billy"而你的狗叫"Brandy" kernel.setPredicate("dog", "Brandy", sessionId) clients_dogs_name = kernel.getPredicate("dog", sessionId)kernel.setBotPredicate("hometown", "127.0.0.1") bot_hometown = kernel.getBotPredicate("hometown")在AIML中,我們可以在 項(xiàng)中設(shè)置謂詞。
<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 你可以告訴機(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ì)這么回應(yīng)你:
Your dog's name is Max.aiml可以用來(lái)實(shí)現(xiàn)對(duì)話機(jī)器人,但是用于中文有以下問題:
- 中文規(guī)則庫(kù)較少。規(guī)則庫(kù)相當(dāng)于對(duì)話機(jī)器人的“大腦”,一般來(lái)說,規(guī)則庫(kù)越豐富,對(duì)話機(jī)器人的應(yīng)對(duì)就更像人。目前英文的規(guī)則庫(kù)已經(jīng)很豐富,涵蓋面很廣,而且是公開可獲取的。但公開的中文規(guī)則庫(kù)就基本沒有。
AIML解釋器對(duì)中文支持不好。實(shí)際上,Python下的Pyaiml模塊(解析器)已經(jīng)能比較好的支持中文,但是也存在以下問題:英文單詞間一般都有空格或標(biāo)點(diǎn)區(qū)分,因此具備一種“自然分詞”特性,由于中文輸入沒有以空格分隔的習(xí)慣,以上會(huì)在實(shí)踐中造成一些不便。比如要實(shí)現(xiàn)有/無(wú)空格的輸入匹配,就需要在規(guī)則庫(kù)中同時(shí)包含這兩種模式。
解決方案:自己搭建語(yǔ)料庫(kù)(比如從字幕文件中獲取訓(xùn)練)
自己中文分詞工具(如jieba)
相關(guān)開源項(xiàng)目: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
總結(jié)
- 上一篇: Linux网络抓包
- 下一篇: 支付宝”向他付款”,定额付款收款链接生成