- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章使用Python AIML搭建聊天机器人的方法示例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
AIML全名为Artificial Intelligence Markup Language(人工智能标记语言),是一种创建自然语言软件代理的XML语言,是由RichardS. Wallace 博士和Alicebot开源软件组织于1995-2000年间发明创造的。AIML是一种为了匹配模式和确定响应而进行规则定义的 XML 格式.
AIML的设计目标如下:
关于AIML详细的初级读物,可翻阅Alice Bot's AIML Primer。你同样可以在AIML Wikipedia page了解更多 AIML 的内容以及它能够做什么。借助 Python 的 AIML 包,我们很容易实现人工智能聊天机器人.
1、安装Python aiml库 。
1
|
pip install aiml
|
2、获取alice资源 。
Python aiml安装完成后在Python安装目录下的 Lib/site-packages/aiml下会有alice子目录,这个是系统自带的一个简单的语料库.
3、Python下加载alice 。
取得alice资源之后就可以直接利用Python aiml库加载alice brain了.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# -*- coding: utf-8 -*-
import
aiml
import
sys
import
os
def
get_module_dir(name):
path
=
getattr
(sys.modules[name],
'__file__'
,
None
)
if
not
path:
raise
AttributeError(
'module %s has not attribute __file__'
%
name)
return
os.path.dirname(os.path.abspath(path))
alice_path
=
get_module_dir(
'aiml'
)
+
'/alice'
#切换到语料库所在工作目录
os.chdir(alice_path)
alice
=
aiml.Kernel()
alice.learn(
"startup.xml"
)
alice.respond(
'LOAD ALICE'
)
while
True
:
print
alice.respond(
raw_input
(
"Enter your message >> "
))
|
上述流程非常的简单,接下来我们要自己从0开始创建自己的机器人.
创建标准启动文件 。
标准的做法是,创建一个名为std-startup.xml的启动文件,作为加载AIML文件的主入口点。在这个例子中,我们将创建一个基础的文件,它匹配一个模式,并且返回一个相应。我们想要匹配模式load aiml b,然后让它加载我们的aiml大脑作为响应。我们将在一步内创建basic_chat.aiml文件.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<
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的内容。我们将匹配两个基本的模式和响应.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<
aiml
version
=
"1.0.1"
encoding
=
"UTF-8"
>
<!-- basic_chat.aiml -->
<
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
>
|
随机响应 。
你也可以像下面这样添加随机响应。它将在接受到一个以”One time I”开头的消息的时候随机响应。*是一个匹配任何东西的通配符.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<
category
>
<
pattern
>ONE TIME I *</
pattern
>
<
template
>
<
random
>
<
li
>Go on.</
li
>
<
li
>How old are you?</
li
>
<
li
>Be more specific.</
li
>
<
li
>I did not know that.</
li
>
<
li
>Are you telling the truth?</
li
>
<
li
>I don't know what that means.</
li
>
<
li
>Try to tell me that another way.</
li
>
<
li
>Are you talking about an animal, vegetable or mineral?</
li
>
<
li
>What is it?</
li
>
</
random
>
</
template
>
</
category
>
|
使用已存在的AIML文件 。
编写你自己的AIML文件是一个很有趣的事,但是它将花费很大的功夫。我觉得它需要大概10,000个模式才会开始变得真实起来。幸运的是,ALICE基金会提供了大量免费的AIML文件。在Alice Bot website上浏览AIML文件.
测试新建的机器人 。
目前为止,所有 XML 格式的 AIML 文件都准备好了。作为机器人大脑的组成部分,它们都很重要,不过目前它们只是信息(information)而已。机器人需要活过来。你可以借助任何语言定制 AIML。这里还是使用Python.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# -*- 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(
raw_input
(
"Enter your message >> "
))
|
这是我们可以开始的最简单的程序。它创建了一个aiml对象,学习启动文件,然后加载剩余的aiml文件。然后,它已经准备好聊天了,而我们进入了一个不断提示用户消息的无限循环。你将需要输入一个机器人认识的模式。这个模式取决于你加载了哪些AIML文件。我们将启动文件作为一个单独的实体创建,这样,我们之后可以向机器人添加更多的aiml文件,而不需要修改任何程序源码。我们可以在启动xml文件中添加更多的可供学习的文件.
加速Brain加载 。
当你开始拥有很多AIML文件时,它将花费很长的时间来学习。这就是brain文件从何而来。在机器人学习所有的AIML文件后,它可以直接将它的大脑保存到一个文件中,这个文件将会在后续的运行中动态加速加载时间.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# -*- coding: utf-8 -*-
import
aiml
import
os
mybot_path
=
'./mybot'
#切换到语料库所在工作目录
os.chdir(mybot_path)
mybot
=
aiml.Kernel()
if
os.path.isfile(
"mybot_brain.brn"
):
mybot.bootstrap(brainFile
=
"mybot_brain.brn"
)
else
:
mybot.bootstrap(learnFiles
=
"std-startup.xml"
, commands
=
"load aiml b"
)
mybot.saveBrain(
"mybot_brain.brn"
)
while
True
:
print
mybot.respond(
raw_input
(
"Enter your message >> "
))
|
记住,如果你使用了上面写的brain方法,在运行的时候加载并不会将新增改变保存到brain中。你将需要删除brain文件以便于它在下一次启动的时候重建,或者需要修改代码,使得它在重新加载后的某个时间点保存brain.
增加Python命令 。
如果你想要为你的机器人提供一些特殊的运行Python函数的命令,那么,你应该为机器人捕获输入消息,然后在将它发送给mybot.respond()之前处理它。在上面的例子中,我们从raw_input中获得了用户的输入。然而,我们可以从任何地方获取输入。可能是一个TCP socket,或者是一个语音识别源码。在它进入到AIML之前处理这个消息。你可能想要在某些特定的消息上跳过AIML处理.
1
2
3
4
5
6
7
8
9
|
while
True
:
message
=
raw_input
(
"Enter your message >> "
)
if
message
=
=
"quit"
:
exit()
elif
message
=
=
"save"
:
mybot.saveBrain(
"bot_brain.brn"
)
else
:
bot_response
=
mybot.respond(message)
# Do something with bot_response
|
会话与断言 。
通过指定一个会话,AIML可以为不同的人剪裁不同的会话。例如,如果某个人告诉机器人,他的名字是Alice,而另一个人告诉机器人他的名字是Bob,机器人可以区分不同的人。为了指定你所使用的会话,将其作为第二个参数传给respond() 。
1
2
|
sessionId
=
12345
mybot.respond(
raw_input
(
">>>"
), sessionId)
|
这对于为每一个客户端定制个性化的对话是很有帮助的。你将必须以某种形式生成自己的会话ID,并且跟踪它。注意,保存brain文件不会保存所有的会话值.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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"
)
|
在AIML中,我们可以使用模板中的set响应来设置断言 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<
aiml
version
=
"1.0.1"
encoding
=
"UTF-8"
>
<
category
>
<
pattern
>MY DOGS NAME IS *</
pattern
>
<
template
>
That is interesting that you have a dog named <
set
name
=
"dog"
><
star
/></
set
>
</
template
>
</
category
>
<
category
>
<
pattern
>WHAT IS MY DOGS NAME</
pattern
>
<
template
>
Your dog's name is <
get
name
=
"dog"
/>.
</
template
>
</
category
>
</
aiml
>
|
使用上面的AIML,你可以告诉机器人:
My dogs name is Max 。
而机器人会回答你:
That is interesting that you have a dog named Max 。
然后,如果你问机器人:
What is my dogs name?
机器人将会回答:
Your dog's name is Max. 。
aiml可以用来实现对话机器人,但是用于中文有以下问题:
解决方案:
相关开源项目:
https://github.com/leo108/aliceCN https://github.com/messense/wechat-bot https://github.com/Program-O/Program-O 。
参考资料:
http://www.w3ii.com/aiml/aiml_introduction.html http://www.devdungeon.com/content/ai-chat-bot-python-aiml http://www.alicebot.org/documentation/aiml-reference.html 。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://www.biaodianfu.com/python-aiml.html 。
最后此篇关于使用Python AIML搭建聊天机器人的方法示例的文章就讲到这里了,如果你想了解更多关于使用Python AIML搭建聊天机器人的方法示例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!