认识AIML
AIML,全名为Artificial Intelligence Markup Language(人工智能标记语言),是一种创建自然语言软件代理的XML语言,和html,xml文件类似。是聊天机器人回答问题的一个模板,机器人只是根据文档内容回答我们输入的问题。这篇文章着重了解AIML的标签和一个.aiml文件的组成。
和XML文件一样,AIML文件开始也需要定义编码方式,如下:<?xml version=”1.0” encoding=”ISO-8859-1”?> 常用的编码方式有:encoding=”ISO-8859-1”、encoding=”UTF-8”、encoding=”GB2312”等。
1. 基本标签
- <aiml>:一个aiml文件的标志
- <category>:定义unit ofknowledge中Alicebot的知识库。每个类别包含在一个句子的形式,用户输入可以是一个断言,问题和感叹号等用户的输入可以包含通配符的字符,如*和_。用 <category>标签必须有<pattern>和<template>标记。
- <pattern>:定义模式匹配的输入,通俗的讲就是用户输入的内容。你问它答里头的‘问’。里面的内容必须大写,可以有星号* 或下划线_,但必须空格隔开,星号表示匹配所有,任意情况;下划线的意义跟星号一样,除了不能匹配字典里面Z后面的字母。
- <template> :定义一个用户的输入的响应。就是你问它答里头的‘答’。<template>标签可以保存数据,可以调用另一个程序,能够给条件答案或委托给其他类别。
2.其他
<*>:用于匹配通配符*character(s),在<pattern>标签。同正则表达式
例子:1
2
3
4
5<category><pattern> A * is a *.</pattern>
<template>When a <starindex="1"/> is not a <star index="2"/>?</template>
</category>
human:A mango is a fruit.
Robot:When a mango is nota fruit?<random>: 用于获取随机响应,通常内含<li>标签。
<li>: 用来表示多个响应。
例子:1
2
3
4
5
6
7
8
9
10
11
12
13<?xml version="1.0"encoding="UTF-8"?>
<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>
</aiml>
Human: Hi
Robot: Hi! Nice to meet you!
Human: Hi
Robot: Hello!<set> :使用在AIML变量设定值。
<get> :用于获取存储在AIML变量的值。
get,set例子:1
2
3
4
5
6
7
8
9
10
11
12
13<?xml version="1.0"encoding="UTF-8"?>
<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 <getname="username"/> Thanks for the conversation!</template>
</category>
</aiml>
Human: I am Mahesh
Robot: Hello Mahesh
Human: Good Night
Robot: Good Night Mahesh! Thanks for theconversation!<that> :在AIML用于应对基于上下文。表示先前机器人说的话。也就是它的记忆功能。
例子:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18<?xml version="1.0"encoding="UTF-8"?>
<aiml version="1.0.1"encoding="UTF-8"?>
<category><pattern>WHAT ABOUT MOVIES</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.<topic> :用于AIML存储上下文,这样以后可以谈话基于这一背景下进行。
例子:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21<?xml version="1.0"encoding="UTF-8"?>
<aiml version="1.0.1"encoding="UTF-8"?>
<category><pattern>LET DISCUSSMOVIES</pattern>
<template>Yes <setname="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.<think>:用于AIML存储变量,在不通知用户的情况下。
1
2
3
4
5
6
7
8
9<category>
<pattern>I AM FEMALE</pattern>
<template>Thanks for telling me your gender.
<think>
<set name=gender>female</set>
</think>
</template>
</category>
这里把female这个值保存到gender这个变量里,且回复内容不包括female。<condition>:类似其他编程语言的switch case。它有助于ALICE来匹配输入作出响应。
例子:1
2
3
4
5
6
7
8
9
10
11
12<?xml version="1.0"encoding="UTF-8"?>
<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!<srai>:多用途标签,用来调用其它/匹配的类别。(符号缩减、分而治之、同义词分辨率、关键词检测),还不是很懂。有搜到一个解释:刺激回复人工智能,表示<srai>里面的话会被当作是用户输入,从新查找匹配模式,直到找到非<srai>定义的回复。
例子:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43<?xml version="1.0"encoding="UTF-8"?>
<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.<upcase>: 用来把小写字母转换成大写形式。
- <lowcase>用来把大写字母转换成小写形式。
- <system>元素表示调用系统函数,例如:
<system>date</system>
表示取系统当前日期。 - <sentence>元素用来格式化句子,比如:
<sentence>this is some kind ofsentence test.</sentence>
可以格式化成:This is some kind of sentence test.即把句子首字母大写。 - <learenfilename=”xxx.aiml”>元素表示让机器人学习某个aiml文件。
<if>元素,判断元素,有以下形式:
1
2
3<if name="topic"value="cars"></if>
<if name="topic"contains="cars"></if>
<if name="topic"exists="true"></if><formal>元素,用来格式化输出,例如:
<formal>jon baer</formal>
那么回复将被格式化成首字母大写输出:Jon Baer,对中文无效。