用AIML开发人工智能聊天机器人
admin
2023-07-30 22:41:43
0

借助 Python 的 AIML 包,我们很容易实现人工智能聊天机器人。AIML 指的是 Artificial Intelligence Markup Language (人工智能标记语言),它不过是简单的可 XML (扩展标记语言)形式。本文的示例代码将带你初步领略如何借助 Python 创建属于你的人工智能聊天机器人。

AIML 是什么?

AIML由Richard Wallace发明。他设计了一个名为 A.L.I.C.E.  (Artificial Linguistics Internet Computer Entity 人工语言网计算机实体) 的机器人,并获得了多项人工智能大奖。有趣的是,图灵测试的其中一项就在寻找这样的人工智能:人与机器人通过文本界面展开数分钟的交流,以此查看机器人是否会被当作人类。AIML是一种为了匹配模式和确定响应而进行规则定义的 XML 格式。

关于 AIML 详细的初级读物,可翻阅 Alice Bot’s AIML Primer。你同样可以在 AIML Wikipedia page了解更多 AIML 的内容以及它能够做什么。我们首先将创建 AIML 文件,并用 Python 赋予它生命。

创建标准的启动文件

创建一个启动文件 std-startup.xml 作为读取AIML文件的主入口点是标准做法。在这里,将创建了一个初始文件用来匹配一种模式和进行一个动作。我们想匹配模式 load aiml b ,并且使它载入我们的 aiml 大脑作为响应。我们将即时创建 basic_chat.aiml 文件。

123456789101112131415161718192021 <aiml version=\”1.0.1\” encoding=\”UTF-8\”>    <! stdstartup.xml >     <! <category> 作为AIML的原子级单元 >    <category>         <! 匹配用户输入的模式 >        <! 如果用户输入 \”LOAD AIML B\” >        <pattern>LOAD AIML B</pattern>         <! <Template> 用来响应模式 >        <! <learn>是一个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 文件可以加入什么。我们将匹配两种基础的模式和响应。

123456789101112131415161718 <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>

随机响应

你同样可以像下面的示例代码一样添加随机响应。当接收到“One time I”开头的信息(message),通配符“*”可以进行模糊匹配。

12345678910111213141516 <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 可浏览这些文件。有一种说法是 std-65-percent.xml 包含了 65% 最常用的短语。还有一种说法是它可以让你和机器人玩二十一点。

运用 Python

目前为止,所有 XML 格式的 AIML 文件都准备好了。作为机器人大脑的组成部分,它们都很重要,不过目前它们只是信息(information)而已。机器人需要活过来。你可以借助任何语言定制 AIML,但某些好心人已经用 Python 这么做了。

首先用 pip 安装 aiml 包。

1 pip install aiml

注意,aiml 包只能在 Python2 环境下运行。也可以选择 Py3kAiml on GitHub 

最简单的 Python 程序

我们可以用如下最简单程序入门。它创建了 aiml 类,学习启动文件,然后读取其余 aiml 文件。接下来,它已经准备好聊天了,我们也进入了一个不断提示用户输入信息的死循环。你需要输入一个机器人能识别的模式。模式的识别取决于你载入的 AIML 文件。

因为我们建立启动文件作为独立实体,所以我们稍后可以对机器人添加更多 aiml 文件而不需要调试任何程序的源代码。只有在 xml 格式的 starup 下,我们才能添加更多文件。

12345678910 import aiml # 创建Kernel()和 AIML 学习文件kernel = aiml.Kernel()kernel.learn(\”std-startup.xml\”)kernel.respond(\”load aiml b\”) # 按组合键 CTRL-C 停止循环while True:    print kernel.respond(raw_input(\”Enter your message >> \”))

加速大脑载入

当你渐渐有了许多 AIML 文件,机器人就需要很多时间去学习。这就需要大脑文件的介入了。在机器人学习完所有 AIML 文件后,它可以直接以文件形式存储大脑,再次运行时可以大大提升载入时间。

1234567891011121314 import aimlimport os kernel = aiml.Kernel() if os.path.isfile(\”bot_brain.brn\”):    kernel.bootstrap(brainFile = \”bot_brain.brn\”)else:    kernel.bootstrap(learnFiles = \”std-startup.xml\”, commands = \”load aiml b\”)    kernel.saveBrain(\”bot_brain.brn\”) # kernel()已经等待使用了while True:    print kernel.respond(raw_input(\”Enter your message >> \”))

运行时重载 AIML

运行时,你可以发送载入信息给机器人,接着将会重载 AIML 文件。注意你是否像上文那样使用了大脑方式,飞速重载不会造成大脑有新的变化。你要么删除大脑文件,以便下次启动时重建;要么修改代码,以便重载后的某一时刻能够储存大脑。下一节将利用新建 Python 命令来让机器人执行这些操作。

1 load aiml b

添加 Python 命令

如果你想通过运行 Python 函数来为机器人添加一些特别的命令,那么你应该在发送 kernel.respond() 函数前截取输入信息并处理。在上述的例子中,我们借助 raw_input 函数获取用户的输入。由此我们无论如何都能获取我们的输入信息。可能好似一个 TCP 套接字(socket),或者使声源转换成文本源。你也许不想 AIML 处理对于某些信息。因此在它们传递给 AIML 时处理。

123456789 while True:    message = raw_input(\”Enter your message to the bot: \”)    if message == \”quit\”:        exit()    elif message == \”save\”:        kernel.saveBrain(\”bot_brain.brn\”)    else:        bot_response = kernel.respond(message)        # bot_response() 回复某些信息

会话和谓词(Predicates)

通过指定会话,AIML 能根据不同对话者随机应变。举个例子,如果某人告诉机器人他们叫 Alice,另一个人则告诉机器人它叫 Bob,机器人可以分清他们。指定你需要的会话,将它作为第二个参数传递给 respond()

12 sessionId = 12345kernel.respond(raw_input(\”>>>\”), sessionId)

和每个客户都能有个性化的对话——这棒极了。你不得不生成你特有的会话ID并追踪。记住保存大脑文件不要保存所有的会话值。

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...