基于AIML2.0写一个机器人
因為本猿自入行以來都有在開發和維護語音識別這類的產品。只不過是基于像科大訊飛,云知聲這類語音引擎,所以對語言識別這塊比較好奇,因為好奇,所以也很無奈……之前有嘗試過正則式匹配,結果你懂的。
去年年底偶爾看到了AIML(全名為Artificial Intelligence Markup Language(人工智能標記語言)),然后翻了兩篇入門博客,感覺這是個好東西。然后,下載了別人的例子來運行,這回讓我難受了,源碼什么都沒修改,運行結果盡然和人家博客寫的不一致,而且還老掛。又耗了一個星期去查找資料,發現相關博客基本都是基于AliceBot做的Demo,也都有強調Alice不支持中文需要自己修改,而且Alice官網好像也沒有了。當然Iveely Liu也寫了一個aiml解析,結合Iveely搜索引擎做了個智能問答機器人(http://www.cnblogs.com/liufanping/p/5879822.html),幾個工程代碼量比較大,對搜索引擎技術又比較陌生;于是,我找了AIML2.0文檔,決定嘗試自己去寫一個AIML解析器。
年前花了半個月的時間,終于把AIML基本的標簽解析弄得差不多了。下面簡單介紹一些AIML 2.0。
通配符:
AIML1.0提供了*和_,表示“出現一次或者多次”(以下我簡稱它們為“1+統配符”)
AIML2.0新添加了^和#,表示“出現零次或者多次”(以下我簡稱它們為“0+統配符”)
它們的優先級關系:# -> _ -> ^ -> *;
<aiml>標簽
AIML文件的根標簽,包含aiml文件的內容;
集合SET <set>:
AIML2.0在匹配模型中提供了集合元素匹配
<category>
category表示AIML的基本知識單元
<topic>標簽
表示基本知識庫單元的主題分類
<pattern>標簽
描述知識單元匹配模型
<that>標簽
描述上一次匹配的知識單元的匹配模型
<template>標簽
描述AIML知識單元的響應,最簡答的就是直接返回純文字,但大多數情況以文字與標簽結合形式出現。
<random>標簽
描述隨機響應
<condition>標簽
描述條件響應
<li>標簽
描述單條響應
<loop>標簽
用于處理<li>標簽循環響應
<star>標簽
用于提取<pattern>中通配符和集合元素的匹配內容
<thatstar>
用于提取<that>中通配符和集合元素的匹配內容
<topicstar>
用于提取<topic>中通配符和集合元素的匹配內容
<set>和<get>標簽
這里的<set>標簽包含在<template>中,用于設置變量的值,<get>用于獲取某些變量的值
<srai>標識
內容會作為輸入繼續匹配
<sr/>標簽
<sr/> = <srai><star /></srai>
好了,先簡單的介紹這些簡答的標簽;下面我們來看看AIML知識庫的幾個例子:
最簡單的問候語知識單元:
????????<category>
<pattern>你好</pattern>
<template>你好!</template>
</category>
當輸入“你好”時,機器人回應:“你好!”
隨機響應:
????????<category>
????????????<pattern>你有錢嗎?</pattern>
????????????<template>
????????????????<random>
????????????????????<li>談錢傷感情好嗎!</li>
????????????????????<li>作為一個碼農,我真心是窮!</li>
????????????????????<li>你猜!</li>
????????????????</random>
????????</template>
????</category>
????當輸入“你有錢嗎?”,機器人從給定的響應中隨機響應一條。
條件響應:
?<category>
????<pattern>你有*嗎</pattern>
????<template>
????????<think><set name="star"><star/></set></think>
????????<condition name="star">
????????????<li value="錢"><srai>你有錢嗎?</srai></li>
????????????<li value="money"><srai>你有錢嗎?</srai></li>
????????????<li value="女朋友"><srai>你親愛的是誰?</srai></li>
????????????<li value="老婆"><srai>你親愛的是誰?</srai></li>
????????????<li>你是在問我有沒有<star />嗎?</li>
??????????</condition>
??????</template>
</category>
????這里你肯能注意到了,"你有*嗎"其實是可以匹配“你有錢嗎?”的,那么這里怎么處理,AIML中精確匹配優先模糊匹配。
響應繼續輸入:
<category>
????<pattern>現在幾點鐘</pattern>
????<template>
????????<date format="hh點mm"></date>
????</template>
</category>
<category>
????<pattern>#現在的時間|#幾點了|#現在幾點鐘了|#現在幾點鐘#</pattern>
????<template>
????????<srai>現在幾點鐘</srai>
????</template>
</category>
<category>
????<pattern>#現在的時間|#幾點了|#現在幾點鐘了|#現在幾點鐘#</pattern>
????<that>現在幾點鐘</that>
????<template>現在<date format="hh點mm"></date>,你剛問過的。</template>
</category>
? ? 以下貼我測試AIML文件內容,因為現在還在優化解析,所有知識庫都是隨便寫的,大家見諒:
test.aiml
<?xml version="1.0" encoding="UTF-8"?>
<aiml>
????<category>
????????<pattern>我叫*</pattern>
????????<template>你好,<star />!</template>
????</category>
????<category>
????????<pattern>#騙你的</pattern>
????????<template>
????????????<random>
????????????????<li>你真不是個好人。</li>
????????????????<li>你是個壞人。</li>
????????????</random>
????????</template>
????</category>
????<category>
????????<pattern>我叫*</pattern>
????????<that>#騙你的</that>
????????<template>以后都不敢相信你了</template>
????</category>
????<category>
????????<pattern>#你叫什么名字</pattern>
????????<template>我叫<bot name="name"/></template>
????</category>
????<category>
????????<pattern>透漏點#</pattern>
????????<that>你有*嗎</that>
????????<template>
????????????<random>
????????????????<li>打死不說!</li>
????????????????<li>無聊吧,你!</li>
????????????????<li>聊點別的吧!</li>
????????????</random>
????</template>
</category>
<category>
????????<pattern>你有*嗎</pattern>
????????<template>
????????????<think><set name="star"><star/></set></think>
????????????<condition name="star">
????????????????<li value="錢"><srai>你有錢嗎?</srai></li>
????????????????<li value="money"><srai>你有錢嗎?</srai></li>
????????????????<li value="女朋友"><srai>你親愛的是誰?</srai></li>
????????????????<li value="老婆"><srai>你親愛的是誰?</srai></li>
????????????????<li>你是在問我有沒有<star />嗎?</li>
????????????</condition>
????????</template>
????</category>
????<category>
????????<pattern>你有錢嗎?</pattern>
????????<template>
????????????<random>
????????????????<li>談錢傷感情好嗎!</li>
????????????????<li>作為一個碼農,我真心是窮!</li>
????????????????<li>你猜!</li>
????????????</random>
????????</template>
????</category>
????<category>
????????<pattern>你親愛的是誰?</pattern>
????????<template>
????????????<think>
????????????????????<set name="lover"><bot name="lover"/></set>
????????????</think>
????????????<condition name="lover">
????????????????<li value="無">?
????????????????????<random>
????????????????????????<li>我是一只單身狗!</li>
????????????????????????<li>單身狗只愛自己!</li>
????????????????????????<li>沒有女朋友,求介紹!</li>
????????????????????</random>
?????????????</li>
????????????<li><bot name="lover"/>,是我最最親愛的她!</li>
????????</condition>
????</template>
</category>
<category>
????????<pattern>你個混蛋!</pattern>
????????<template>
????????????<srai>你好瘋!</srai>
????????</template>
</category>
<category>
????????<pattern>導航去*</pattern>
????????<template>不好意思,我還不會!你用百度地圖吧,聽說很好用?</template>
</category>
<category>
????????<pattern>從*導航去*</pattern>
????????<template><star index="1"/>去<star index="2"/>,你用百度地圖吧,聽說很好用?</template>
</category>
<category>
????????<pattern>你好#</pattern>
????????<template>
????????????<think>
????????????????<set name="star"><star /></set>
????????????</think>
????????????<condition name="star">
????????????????<li>你好<star/>!</li>
????????????????<li value="美">
????????????????????<random>
????????????????????????<li>謝謝,你也很美哦!</li>
????????????????????????<li>是嗎?很美嗎?</li>
????????????????????????<li>來給我拍張照。</li>
????????????????????????<li>說得人家都不好意思了~</li>
????????????????</random>
????????????</li>
????????????<li value="無恥">信你才怪!</li>
????????????<li value="帥">知道就可以了,不要說出來。</li>
????????????<li value="厲害">哈哈,被你發現啦!</li>
????????</condition>
????</template>
</category>
<category>
????????<pattern>賣萌</pattern>
????????<template>
????????????<random>
????????????????<li>喵喵~</li>
????????????????<li>么么噠~!!</li>
????????????????<li>人家才不要賣萌~!</li>
????????????????<li>給我滾蛋~!</li>
????????????????</random>
????????????</template>
</category>
<category>
<pattern>你是不是傻</pattern>
<template>你才傻!</template>
</category>
<category>
<pattern>傻不傻*</pattern>
<template>不傻!</template>
</category>
<category>
<pattern>#傻不傻</pattern>
<template>你才傻!</template>
</category>
<category>
<pattern>*</pattern><template>聽不懂你說什么!</template> </ category >
< category >
<pattern>你好</pattern>
<template>你好!</template>
</category>
</aiml>
name.aiml
<?xml version="1.0" encoding="UTF-8"?>
<aiml>
<category>
<pattern>我叫什么名字?</pattern>
<template>
<random>
<li>我能猜的著才怪呢?</li>
<li>我們認識嗎?</li>
<li>對不起,我不認識你。</li>
</random>
</template>
</category>
<category>
<pattern>我叫什么名字?</pattern>
<that>我的名字叫*</that>
<template>
<random>
<li>你在考我嗎?你叫<thatstar/>。</li>
<li><thatstar/>你別鬧了!</li>
<li><thatstar/>你改名字了嗎?!</li>
</random>
</template>
</category>
<category>
<pattern>#我叫*</pattern>
<template>
<srai>我的名字叫<star index="2"/></srai>
</template>
</category>
<category>
<pattern>我的名字叫*</pattern>
<template>
<!-- <think><set name="clientName"><star /></set></think> -->
很高興認識你,<set name="clientName"><star /></set>。
</template>
</category>
</aiml>
time.aiml
<?xml version="1.0" encoding="UTF-8"?>
<aiml>
<!-- 時間 -->
<category>
<pattern>現在幾點鐘</pattern>
<template>
<date format="hh點mm"></date>
</template>
</category>
<category>
<pattern>#現在的時間|#幾點了|#現在幾點鐘了|#現在幾點鐘#</pattern>
<template>
<srai>現在幾點鐘</srai>
</template>
</category>
<category>
<pattern>#現在的時間|#幾點了|#現在幾點鐘了|#現在幾點鐘#</pattern>
<that>現在幾點鐘</that>
<template>現在<date format="hh點mm"></date>,你剛問過的。</template>
</category>
<!-- 日期 -->
<category>
<pattern>今天幾號</pattern>
<template>今天<date/></template>
</category>
<category>
<pattern>#今天的日期|#今天幾月幾號|#今天幾月幾日|今天幾號#</pattern>
<template><srai>今天幾號</srai></template>
</category>
<category>
<pattern>#今天的日期|#今天幾月幾號|#今天幾月幾日|今天幾號#</pattern>
<that>今天幾號</that>
<template>今天<date/>,今天是不是對你很重要啊?</template>
</category>
</aiml>
? ? 以下是運行的結果:
目前完成的進度感覺已經可以做做一些智能客服了,后續想定義一些自定義標簽做意圖識別。今天就先這樣吧。
總結
以上是生活随笔為你收集整理的基于AIML2.0写一个机器人的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 归并排序(MergeSort)
- 下一篇: AIML框架标签详解