欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 人工智能 > ChatGpt >内容正文

ChatGpt

AIML学习(一)

发布时间:2023/12/31 ChatGpt 52 豆豆
生活随笔 收集整理的这篇文章主要介绍了 AIML学习(一) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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 文件。

<aiml version="1.0.1" encoding="UTF-8"><!-- std-startup.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 文件可以加入什么。我们将匹配两种基础的模式和响应。

<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),通配符“*”可以进行模糊匹配。

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

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

sudo apt-get install python-aiml

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

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

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 文件后,它可以直接以文件形式存储大脑,再次运行时可以大大提升载入时间。

import aiml import oskernel = 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 命令来让机器人执行这些操作。

load aiml b

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

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()。

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

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

sessionId = 12345# 将会话信息作为字典 # 包含输入输出的历史像已知谓词那样 sessionData = kernel.getSessionData(sessionId)# 每个会话ID需要一个唯一的值 # 用会话中机器人已知的人或事给谓词命名 # 机器人已经知道你叫"Billy"而你的狗叫"Brandy" kernel.setPredicate("dog", "Brandy", sessionId) clients_dogs_name = kernel.getPredicate("dog", sessionId)kernel.setBotPredicate("hometown", "127.0.0.1") bot_hometown = kernel.getBotPredicate("hometown")

在AIML中,我们可以在 项中设置谓词。

<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可以用来实现对话机器人,但是用于中文有以下问题:

  • 中文规则库较少。规则库相当于对话机器人的“大脑”,一般来说,规则库越丰富,对话机器人的应对就更像人。目前英文的规则库已经很丰富,涵盖面很广,而且是公开可获取的。但公开的中文规则库就基本没有。
  • AIML解释器对中文支持不好。实际上,Python下的Pyaiml模块(解析器)已经能比较好的支持中文,但是也存在以下问题:英文单词间一般都有空格或标点区分,因此具备一种“自然分词”特性,由于中文输入没有以空格分隔的习惯,以上会在实践中造成一些不便。比如要实现有/无空格的输入匹配,就需要在规则库中同时包含这两种模式。
    解决方案:

  • 自己搭建语料库(比如从字幕文件中获取训练)

  • 自己中文分词工具(如jieba)
    相关开源项目:

  • 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

总结

以上是生活随笔为你收集整理的AIML学习(一)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。