什么是AIML?

AIML是Richard Wallace开发的。 他开发了一个叫A.L.I.C.E(Artificial Linguistics Internet Computer Entity)的机器人并且赢了几个人工智能的奖项。 有趣的是, 其中一个图灵测试是让一个人在文本界面跟一个机器人聊几分钟,看看人们是否认为它是个人类。 AIML是一种定义了匹配模式和决定响应的规则的一种XML。

安装Python aiml库

Python 2:pip install aiml
Python 3:pip install python-aiml

主文件

# -*- coding: utf-8 -*-
import aiml
import os
mybot_path = './mybot'
#切换到语料库所在工作目录
os.chdir(mybot_path)
mybot = aiml.Kernel()
mybot.learn("std-startup.xml")
mybot.respond('load aiml b')
while True:
    print(mybot.respond(input("Enter your message >> ")))

创建标准启动文件

标准的做法是,创建一个名为std-startup.xml的启动文件,作为加载AIML文件的主入口点。在这个例子中,我们将创建一个基础的文件,它匹配一个模式,并且返回一个相应。我们想要匹配模式load aiml b,然后让它加载我们的aiml大脑作为响应。我们将在一步内创建basic_chat.aiml文件。

<aiml version="1.0.1" encoding="UTF-8">
    <!-- std-startup.xml -->
    <!-- Category是一个自动的AIML单元 -->
    <category>
        <!-- Pattern用来匹配用户输入 -->
        <!-- 如果用户输入 "LOAD AIML B" -->
        <pattern>LOAD AIML B</pattern>
        <!-- Template是模式的响应 -->
        <!-- 这里学习一个aiml文件 -->
        <template>
            <learn>basic_chat.aiml</learn>
            <!-- 你可以在这里添加更多的aiml文件 -->
            <!--<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>

标签

1、基本标签

<aiml>:定义在AIML文件的开头和结尾。 它包含在版本和编码属性的版本和编码信息。

<category>:定义unit of knowledge中Alicebot的知识库。每个类别包含在一个句子的形式,用户输入可以是一个断言,问题和感叹号等用户的输入可以包含通配符的字符,如*和_。
用<category>标签必须有<pattern>和<template>标记。

<pattern>:定义图案什么用户可输入匹配到Alicebot。

<template> :定义一个Alicebot的用户的输入的响应。<template>标签可以保存数据,可以调用另一个程序,能够给条件答案或委托给其他类别。

2、< * >:用于匹配通配符*character(s)在标签。

<category>
 
        <pattern> A * is a *.</pattern>
 
        <template>When a <star index="1"/> is not a <star index="2"/>?</template>
 
</category>

3、<random> :用于获取随机响应。

4、<li> :用来表示多个响应。

<aiml version="1.0.1" encoding="UTF-8">
    <category>
    <pattern>HI</pattern>
        <template>
                <random>
                   <li> Hello! </li>
                   <li> Hi! Nice to meet you! </li>
                </random>
        </template> 
    </category>
</aiml>

5、<set> :使用在AIML变量设定值。

6、<get>:用于获取存储在AIML变量的值。

<aiml version="1.0.1" encoding="UTF-8">
    <category><pattern>I am*</pattern>
            <template>Hello <set name="username"><star/>! </set></template> 
    </category> 
    <category> <pattern>GoodNight</pattern>
            <template>Hi <get name="username"/> Thanks for the conversation!</template> 
    </category> 
</aiml>

7、<that> :在AIML用于应对基于上下文。表示先前机器人说的话。

<aiml version="1.0.1" encoding="UTF-8">
    <category><pattern>WHAT ABOUTMOVIES</pattern>
        <template>Do you like comedymovies</template> 
    </category>
    <category><pattern>YES</pattern>
        <that>Do you like comedymovies</that>
        <template>Nice, I like comedy moviestoo.</template>
    </category>
    <category><pattern>NO</pattern>
         <that>Do you like comedymovies</that>
         <template>Ok! But I like comedymovies.</template>
    </category>  
</aiml>
Human: What about movies?

Robot: Do you like comedy movies?

Human: No

Robot: Ok! But I like comedy movies.

8、<topic> :用于AIML存储上下文,这样以后可以谈话基于这一背景下进行。

<aiml version="1.0.1" encoding="UTF-8">
    <category>
        <pattern>LET DISCUSSMOVIES</pattern>
        <template>Yes <set name="topic">movies</set></template> 
    </category>
    <topic name="movies">
        <category>
            <pattern>*</pattern>
            <template>Watching good movierefreshes our minds.</template>
        </category>
        <category>
            <pattern> I LIKE WATCHING COMEDY!</pattern>
            <template>I like comedy moviestoo.</template>
        </category>
    </topic>
</aiml>
Human: let discuss movies

Robot: Yes movies

Human: Comedy movies are nice to watch

Robot: Watching good movie refreshes ourminds.

Human: I like watching comedy

Robot: I too like watching comedy.

9、<think>:用于AIML存储变量不通知用户。

<aiml version="1.0.1" encoding="UTF-8">
    <category><pattern>My name is*</pattern>
            <template>Hello!<think><set name="username"> <star/></set></think></template> 
    </category> 
    
    <category><pattern>Byeee</pattern>
            <template>Hi <get name="username"/> Thanks for the conversation!</template> 
    </category> 
 
 </aiml>
Human: My name is Mahesh

Robot: Hello!

Human: Byeee

Robot: Hi Mahesh Thanks for theconversation!

10、<condition>:类似的切换在编程语言语句。 它有助于ALICE来匹配输入作出响应。

<aiml version="1.0.1" encoding="UTF-8">
    <category><pattern> HOW ARE YOUFEELING TODAY </pattern>
        <template><think><set name="state"> happy</set></think>
        <condition name="state" value="happy">I am happy!</condition>
        <condition name="state" value="sad">I am sad!</condition></template>
        </category>
</aiml>
Human: How are you feeling today

Robot: I am happy!

11、<srai>:多用途标签,用来调用其它/匹配的类别。(符号缩减、分而治之、同义词分辨率、关键词检测)

<aiml version="1.0.1"encoding="UTF-8"?>
    <category><pattern> WHO ISALBERT EINSTEIN </pattern>
            <template>Albert Einstein was agerman physicist.</template>
    </category>
    <category><pattern> WHO ISIsaac NEWTON </pattern>
            <template>Isaac Newton was a englishphysicist and mathematician.</template>
    </category>
    <category><pattern>DO YOU KNOWWHO * IS</pattern>
            <template><srai>WHO IS<star/></srai></template>
    </category>
 
    <category><pattern>BYE</pattern>
        <template>Good Bye!</template>
    </category>
 
    <category><pattern>BYE*</pattern>
        <template><srai>BYE</srai></template>
    </category>
    <category><pattern>FACTORY</pattern>
            <template>DevelopmentCenter!</template>
    </category>
 
    <category><pattern>INDUSTRY</pattern>
            <template><srai>FACTORY</srai></template>
    </category>
 
    <category><pattern>SCHOOL</pattern>
            <template>School is an importantinstitution in a child's life.</template>
    </category> 
    <category><pattern>_SCHOOL</pattern>
            <template><srai>SCHOOL</srai></template>
    </category>
    <category><pattern>_SCHOOL</pattern>
            <template><srai>SCHOOL</srai></template>
    </category>
    <category><pattern>SCHOOL*</pattern>
            <template><srai>SCHOOL</srai></template>
    </category>
    <category><pattern>_ SCHOOL*</pattern>
            <template><srai>SCHOOL</srai></template>
    </category>
</aiml>
Human: I love going to school daily.

Robot: School is an important institutionin a child's life.

Human: I like my school.

Robot: School is an important institutionin a child's life.

12、<upcase>xiaoxie</upcase>元素用来把xiaoxie转换成大写形式:XIAOXIE

13、<system><system>元素表示调用系统函数,例如:

<system>date</system>

表示取系统当前日期。

14、<sentence>元素用来格式化句子,比如:

<sentence>this is some kind ofsentence test.</sentence>

可以格式化成:This is some kind of sentence test.即把句子首字母大写。

15、<pattern>表示匹配模式,里面的内容必须大写,可以有星号* 或下划线_,但必须空格隔开,星号表示匹配所有,任意情况;下划线的意义跟星号一样,除了不能匹配字典里面Z后面的字母。

16、<lowcase></lowcase>表示把中间的内容变成小写,对应的是把内容变成大写
中文无效。
17、<learen filename=”xxx.aiml”>元素表示让机器人学习某个aiml文件。

18、<if>元素,判断元素,有以下形式:

    <if name="topic" value="cars"></if> 
    <if name="topic" contains="cars"></if> 
    <if name="topic" exists="true"></if>

19、<formal>元素,用来格式化输出,例如:<formal>jon baer</formal>那么回复将被格式化成首字母大写输出:Jon Baer,对中文无效。

20、<NUM/>元素,匹配数字

21、约束匹配模式

<category>
    <pattern that="你好">你好啊</pattern>
        <template>
            <random>
                <li>你好,我们刚刚说过一遍了。</li>
                <li>你好,客气啥!</li>
            </random>
        </template>
</category>

上述示例中,并不会直接命中”你好啊“,而是在上一次是匹配的”你好“,当又匹配了”你好啊“才会命中上述category,即上次和当前次的连续匹配

会话与断言

通过指定一个会话,AIML可以为不同的人剪裁不同的会话。例如,如果某个人告诉机器人,他的名字是Alice,而另一个人告诉机器人他的名字是Bob,机器人可以区分不同的人。为了指定你所使用的会话,将其作为第二个参数传给respond()

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

这对于为每一个客户端定制个性化的对话是很有帮助的。你将必须以某种形式生成自己的会话ID,并且跟踪它。注意,保存brain文件不会保存所有的会话值。

sessionId = 12345
# 会话信息作为字典获取. 包含输入输出历史,
# 以及任何已知断言
sessionData = mybot.getSessionData(sessionId)
# 每一个会话ID需要时一个唯一值。
# 断言名是机器人在与你的会话中了解到的某些/某个名字 
# 机器人可能知道,你是"Billy",而你的狗的名字是"Brandy"
mybot.setPredicate("dog", "Brandy", sessionId)
clients_dogs_name = mybot.getPredicate("dog", sessionId)
mybot.setBotPredicate("hometown", "127.0.0.1")
bot_hometown = mybot.getBotPredicate("hometown")