天天看點

ALICE源代碼分析

前言

ALICE(愛麗絲)事實上是“人工語言計算機實體”的英文縮寫。

它以前在往年(2000年、2001年和2004年)的勒布納人工智能獎角逐中三次獲勝。并在其它年度中也獲過驕人的成績。它是一個開源軟體,能夠在​​這裡以java版本号為例解說一下ALICE的聊天原理和代碼實作部分。

下面提到的實作都是指java版本号。

原理

         ALICE聊天的原理還是比較簡單,它有一個對話庫。

當使用者問一個問題後。ALICE通過在對話庫中查找同樣問題的答案作為回答。Java版本号支援通配符比對問題,能夠大大降低問答資料庫的規模。

         原理非常easy,可是假設問答資料庫足夠豐富的話。還是能讓人有些驚豔的感覺。

問答資料庫管理

         問答庫使用AIML語言來存儲。AIML是一種相似HTML的标記語言,xml格式。

例如以下就是AIML語言中的一對問題和答案:

<category>

   <pattern>WHO ARE YOU</pattern>

<template>Iam Alice, nice to meet you!</template>

</category>

當使用者輸入WHO ARE YOU時,Alice就會回答I am Alice, nice to meet you!就是這麼簡單。

         ALICE啟動時會把對話資料庫載入到記憶體中,實作源代碼為Graphmaster(GM)。GM事實上就是一顆Trie樹,僅僅隻是節點是一個單詞。ALICE把問題(Topic,That)分成單詞清單,然後按Trie樹的方式存入記憶體中,當查詢時,依照Trie樹的方式查詢,假設找到比對的問題,那麼拿出相應的答案。傳回給使用者。

以WHO ARE YOU為例,在記憶體中方式應該例如以下:

         GM:(WHO)

                   \

         GM:(ARE)

                     \

         GM:(YOU) -->Category{<pattern>:WHO ARE YOU;<template>:I am Alice, nice to meetyou! }

當然在實作中還支援一些特殊标記方法。如<set>設定上下文。<srai>調用Srai類來處理一些特殊标記的轉換等。

啟動

         ALICE的主程式為bitoflife.chatterbean.ChatterBean,它接受1~2個參數,第一個參數是配置檔案Bots/properties.xml的路徑,假設有第二個參數且是’gui’則啟動GUI界面。否則啟動Console界面。

    ChatterBean構造函數中會載入Context,Splitter,并載入問答資料庫。最後把問答資料庫的引用傳給AliceBot。

回答問題

         詳細實作為AliceBot.respond()

private void respond(Sentence sentence,Sentence that, Sentence topic, Response response){

   if (sentence.length() > 0)

    {

     Match match = new Match(this, sentence, that, topic); // 建構比對串

     Category category = graphmaster.match(match); // 資料庫中查找比對串,比對的方法

                                             //支援通配符的trie查找算法

     response.append(category.process(match)); // 比對串進行回答處理

    }

}

因為ALICE中存在一個*比對串。全部比對不到的問題都會被該模式響應:

    <pattern>*</pattern>

    <template>I am sorry, my answers arelimited -- you must provide the right questions.</template>

當中Category.process是一個依照AIML語言進行解析的操作。AIML語言中設定了一些預設的操作,值得借鑒,如GET,SET,SRAI等等,通過反射。把這些标記轉換實際的java類,然後調用這些類的process方法。

這些AIML元素都繼承自TemplateElement。是一種Composite+Template設計模式。

public String process(Match match){

   StringBuilder value = new StringBuilder();

    for(TemplateElement i : children)

     value.append(i.process(match));

   return value.toString();

後記

         ALICE聊天機器的原理和代碼實作相對照較簡單。而載入足夠的問答資料庫後還是有不少趣味的,隻是離真正的人工智能還差非常遠非常遠。近期身邊有非常多小朋友在學說話,他們一開始都是在反複學習單詞,經過N邊的反複後學會了媽媽。爸爸等等名詞後,然後又學習其它動詞,然後把這些詞組合起來說。

我想這整個過程正是一個人工智能應該走的路。命名實體識别/映射,規則學習和應用,甚至是推理。真正學會了規則自學習和推理的聊天機器人才是真正意義上的人工智能機器人吧。