
AIML,全稱Artificial Intelligence Markup Language,是一種XML模式,用做自然語言聊天機器人的規(guī)則庫。
最簡單的AIML規(guī)則如下:
<?xml version="1.0" encoding="GB2312"?>
<aiml>
<category>
<pattern>* bye</pattern>
<template>byebye</template>
</category>
</aiml>
<pattern>中的“* bye”為模式。比如輸入“mike,bye”就可以匹配該模式(*表示任意字符),然后AIML解釋器就會根據(jù)規(guī)則庫返回“byebye”作為回復。
更復雜的aiml規(guī)則可參考:Alicebot 或 AIML介紹
應用實例可參考:基于Python如何使用AIML搭建聊天機器人
Aiml可以用來實現(xiàn)對話機器人,但是用于中文有以下問題:
- 中文規(guī)則庫較少。規(guī)則庫相當于對話機器人的“大腦”,一般來說,規(guī)則庫越豐富,對話機器人的應對就更像人。目前英文的規(guī)則庫已經(jīng)很豐富,涵蓋面很廣,而且是公開可獲取的。但公開的中文規(guī)則庫就基本沒有。
- AIML解釋器對中文支持不好。實際上,Python下的Pyaiml模塊(解析器)已經(jīng)能比較好的支持中文,但是也存在以下問題:
英文單詞間一般都有空格或標點區(qū)分,因此具備一種“自然分詞”特性,
比如模式“* BYE”很自然的就和“mike,bye”匹配,而且一般也不會寫成無空格的"BYE";
但是中文的“再見”(無空格),與“* 再見”(有空格)匹配的就是不同的模式,
分別匹配"邁克,再見”和“邁克, 再見”(再見前必須有空格)。
由于中文輸入沒有以空格分隔的習慣,以上會在實踐中造成一些不便。比如要實現(xiàn)有/無空格的輸入匹配,就需要在規(guī)則庫中同時包含這兩種模式。
這種情況下,很多中文aiml規(guī)則庫在實現(xiàn)時,就采取了在每個單字間人為增加空格的方法;同樣,進行輸入匹配的時候,也需要對輸入添加空格來進行匹配。
針對上述問題,提出兩種曲線救國的思路:
1.通過翻譯工具解決AIML對中文的處理,比如輸入內(nèi)容先經(jīng)過翻譯處理后變成英文內(nèi)容,英文內(nèi)容經(jīng)AIML處理后輸出,輸出再翻譯成中文顯示。
輸入中文->翻譯為英文->AIML處理->英文結(jié)果->翻譯成中文
好處是可以直接利用現(xiàn)有的英文規(guī)則庫
經(jīng)測,可實現(xiàn)。
但因為要用到翻譯api,實現(xiàn)效果跟翻譯api的質(zhì)量有關(guān),另外在沒有網(wǎng)絡(luò)的情況下,較難實現(xiàn)。
參考代碼如下:
import aiml
from translate import Translator
# 創(chuàng)建Kernel()和 AIML 學習文件
kernel = aiml.Kernel()
kernel.learn("std-startup.xml")
kernel.respond("load aiml b")
# 按組合鍵 CTRL-C 停止循環(huán)
while True:
translator = Translator(to_lang='en', from_lang='zh')
backtranslator = Translator(to_lang='zh',from_lang='en')
original = raw_input(u"請輸入信息 >> ")
print original
message = translator.translate(original)
print message
response = kernel.respond(message)
print backtranslator.translate(response)
2.利用中文分詞工具(如jieba)進行分詞,而不是每個單字間添加空格。
為了實現(xiàn)中文輸入與模式的對應關(guān)系。建立規(guī)則庫時,用分詞工具對匹配模式進行預處理;在處理輸入信息時,使用相同的分詞工具進行處理。
基本思路和逐字添加空格類似。但是分詞工具能同時兼顧中文的語義表達性。
本文采用ulysses寫作。
寫作耗時:50分鐘
發(fā)布到簡書耗時:20分鐘