ALICE源代码分析
前言
ALICE(愛麗絲)事實上是“人工語言計算機實體”的英文縮寫。
它以前在往年(2000年、2001年和2004年)的勒布納人工智能獎角逐中三次獲勝。并在其它年度中也獲過驕人的成績。它是一個開源軟件,能夠在http://www.alicebot.org/downloads/programs.html下載到多種語言的實現。
這里以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中存在一個*匹配串。全部匹配不到的問題都會被該模式響應:
<category>
??? <pattern>*</pattern>
??? <template>I am sorry, my answers arelimited -- you must provide the right questions.</template>
</category>
當中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邊的反復后學會了媽媽。爸爸等等名詞后,然后又學習其它動詞,然后把這些詞組合起來說。
我想這整個過程正是一個人工智能應該走的路。命名實體識別/映射,規則學習和應用,甚至是推理。真正學會了規則自學習和推理的聊天機器人才是真正意義上的人工智能機器人吧。
轉載于:https://www.cnblogs.com/mqxnongmin/p/10692798.html
總結
以上是生活随笔為你收集整理的ALICE源代码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 企业——memcache对PHP页面的缓
- 下一篇: 实体类中的属性规范