close
文章出處

前言

用python的AIML包很容易就能寫一個人工智能聊天機器人。 AIML是Artificial Intelligence Markup Language的簡寫, 但它只是一個簡單的XML。 下面的代碼例子會帶你寫一個你自己的Python人工智能聊天機器人。

什么是AIML?

AIML是Richard Wallace開發的。 他開發了一個叫A.L.I.C.E(Artificial Linguistics Internet Computer Entity)的機器人并且贏了幾個人工智能的獎項。 有趣的是, 其中一個圖靈測試是讓一個人在文本界面跟一個機器人聊幾分鐘,看看人們是否認為它是個人類。 AIML是一種定義了匹配模式和決定響應的規則的一種XML。

要看完整的AIML入門,可以看一下 Alice Bot's AIML Primer.你可以在AIML wiki頁學更多關于AIML的知識并知道它能做什么。 我們先寫一些AIML文件并用Python給它一點生命。

寫標準啟動文件

標準是寫一個叫std-startup.xml的啟動文件作為載入AIML文件的主入口點。 這個例子里我們會寫一個可以匹配一個模式并做一個動作的基本文件。 我們想要匹配模式load aiml b, 然后讓它載入我們的aiml大腦。我們會花一分鐘寫一個basic_chat aiml文件。

<aiml version="1.0.1" encoding="UTF-8">
    <!-- std-startup.xml -->

    <!-- Category is an atomic AIML unit -->
    <category>

        <!-- Pattern to match in user input -->
        <!-- If user enters "LOAD AIML B" -->
        <pattern>LOAD AIML B</pattern>

        <!-- Template is the response to the pattern -->
        <!-- This learn an aiml file -->
        <template>
            <learn>basic_chat.aiml</learn>
            <!-- You can add more aiml files here -->
            <!--<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 -->

    <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文件很有意思,但會是個很大的工作量。我想它需要大約一萬的模式才能看起來真實一點。幸好,ALICE基金提供很多免費的AIML文件。可以在Alice Bot網站看看AIML文件。那有個叫std-65-percent.xml文件包括了常規65%的場景。那也有一個可以讓你玩21點(BlackJack)的機器人。

寫Python

到目前為止,所有的東西都是AIML XML文件。這些是可以構造機器人大腦的重要部分,但這些只是一些信息。機器人需要變活。你需要用一些語言來實現AIML規范,但一些好心人已經用Python做了。

先用pip裝aiml包。

pip install aiml

記住aiml包只能在Python 2下用。 Python 3可以用GitHub上的Py3kAiml替代。

簡單Python程序

這是我們能啟動的最簡單的程序。它建一個aiml對象,學習啟動文件,并加載剩下的aiml文件。這之后,就可以聊天了,然后我們進入一個無限循環并持續讓用戶輸入消息。你需要輸入一個機器人能識別的模式。模式識別依賴于你之前加載的AIML文件。

我們寫個單獨的啟動文件,這樣我們可以不用動程序源碼加載更多的aiml文件。我們可以在啟動xml文件加更多的文件來學習。

import aiml

# Create the kernel and learn AIML files
kernel = aiml.Kernel()
kernel.learn("std-startup.xml")
kernel.respond("load aiml b")

# Press CTRL-C to break this loop
while True:
    print kernel.respond(raw_input("Enter your message >> "))

加速大腦啟動

當你有很多AIML文件,這需要學很長時間。這就要靠機器人大腦文件了。在機器人學習了所有的AIML文件后并可以直接把大腦存到一個文件里,這樣在下次啟動時就可以直接加速。

import aiml
import os

kernel = aiml.Kernel()

if os.path.isfile("bot_brain.brn"):
    kernel.bootstrap(brainFile = "bot_brain.brn")
else:
    kernel.bootstrap(learnFiles = "std-startup.xml", commands = "load aiml b")
    kernel.saveBrain("bot_brain.brn")

# kernel now ready for use
while True:
    print kernel.respond(raw_input("Enter your message >> "))

運行中重載AIML

你可以在運行時發重載消息給機器人來重載AIML文件。記住如果你使用了之前寫的大腦方法,重載不會節省剛對大腦做的改動。你需要刪除大腦文件一遍下次啟動時可以重建,或者你需要改代碼讓機器人在下次重載后的一個時間點來保存大腦。看下節寫Python命令給機器人。

load aiml b

加Python命令

如果你要給你的機器人加一些命令來運行Python函數,那你需要捕獲機器人的輸入信息并在發給kernel.respond()前處理它。上個例子我們從raw_input得到了用戶的輸入。我們可以從很多地方得到輸入。比如一個TCP socket,或一個語音轉文本的源。在它發給AIML前處理它。你需要在某些消息時跳過AIML。

while True:
    message = raw_input("Enter your message to the bot: ")
    if message == "quit":
        exit()
    elif message == "save":
        kernel.saveBrain("bot_brain.brn")
    else:
        bot_response = kernel.respond(message)
        # Do something with bot_response

會話和斷言

通過一個會話,AIML可以區分不同人的不同的對話。例如,如果一個人告訴機器人她的名字是Alice,另一個人告訴機器人他的名字是Bob,機器人可以區分他們。為了指定你在用哪個會話你可以傳給respond()第二個參數。

sessionId = 12345
kernel.respond(raw_input(">>>"), sessionId)

這樣每個客戶都有個性化的聊天,很好。你可以生成你自己的session id(會話id)并跟蹤他們。記住保存大腦文件并不會保存所有會話值。

sessionId = 12345

# Get session info as dictionary. Contains the input
# and output history as well as any predicates known
sessionData = kernel.getSessionData(sessionId)

# Each session ID needs to be a unique value
# The predicate name is the name of something/someone
# that the bot knows about in your session with the bot
# The bot might know you as "Billy" and that your "dog" is named "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中我們可以在模板中設置response來設置斷言。

<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 Tag Reference Table

原文:http://www.devdungeon.com/content/ai-chat-bot-python-aiml


本文來自微信平臺「麥芽面包」
微信公眾號「darkjune_think」轉載請注明。
微信掃一掃關注公眾號。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 AutoPoster 的頭像
    AutoPoster

    互聯網 - 大數據

    AutoPoster 發表在 痞客邦 留言(0) 人氣()