智能机器人(18):人工智能

人工智能AI,可以简单用模式匹配和全文检索来实现,前面说的爱丽丝Alice比较简洁,它有多种语言实现:programD是Java版本,programE是PHP版本,programQ是Cpp版本,programV是Perl,programY是Python等等,作网站应用Java和PHP不错,做智能终端C++和Python不错。

  • 1、语言选择

既然论及人工智能AI,使用 C/C++就有点不合时宜,这需要感谢肉丝ROS的语言独立性,从而可以用C作机器人的底盘控制,用C++作机器人视觉导航,用Python作机器人的人工智能,混搭,挺好。选择python还有考虑是这个program-Y版本是纯粹用python实现的,不依赖于第三方。不像C++版本的 programD还要依赖与Qt的库,比较干净一些。

Alice的Python版叫pyAIML,这个术语,如果颗粒度小一些:前面的py表示是python脚本语言实现的,中间的ai表明说用于人工智能的xml,最后的ml表示这是标记语言,标志语言常见的有xml和yaml;如果颗粒度大些:前面的py表明前端的解释器用pytthon实现,后面的aiml表明模式匹配使用标记语言实现。

  • 2、大体结构

ALICE主要包括三块内容:programx内核、AIML标记语言、解释器接口。Kernel核心有源代码,解释器接口主要是Mysql数据库导入aiml文件。复杂些的是AIML,也就是XML,扩展标记语言。

AIML主要用来实现模式匹配,pattern matching。在好多文献里,例如半导体行业计算机视觉行业等等,都会提到pattern这个词不好翻译。感觉就是规律,例如一个人总是七点二十出门六点四十回家,这个就是强模式。再比如一个人走路总是向左侧着身子,那么也就具有了模式性,好像这个可以用于刑事侦查。再比如种植行业怎么分拣梨子和苹果,圆度,这个也是用模式匹配。至于具有模式性是好事坏,很难讲,模式太强说明熵比较大,也不算是好事。自然界本来是浑沌的,现在弄的铁是铁硅是硅山是山水是水,熵一增大就不稳定了,看来三峡大坝不怎么好。
回到Alice,在它的后缀.aiml文件(有时也用.xml)里,常见标签有category,主要包含输入模式pattern和响应模板template两个节。

  • 3、AIML安装

首先确保python正确
$ python -V
检查源
$ sudo gedit /etc/apt/sources.list
需要的话修改
$ deb http://us.archive.ubuntu.com/ubuntu precise main universe
更新
$ sudo apt-get update
安装软件
$ sudo apt-get install python-aiml
测试,如果正确导入则安装okay
$ python
>>>import aiml #导入
如果未提示异常说明安装正确。

  • 4、HelloWorld

1、一般流程
AIML最重要的一个类是Kernel(),用来学习AIML数据文件,并从AIML数据集获取用户响应,常规流程是:
myBot = aiml.Kernel() #建立Kernel类的对象实例
mybot.setBotPredicate(“name”,”myBot”) #给机器人命名
mybot.learn(‘myaiml.aiml’) #学习一个或多个AIML文件(载入内存)
//mybot.learn(“myStartup.xml”) #如果导入多个文件用这种xml的方法
mybot.respond(” load aiml b”) #触发myStartup.xml中的load aiml b模式
while True: print k.respond( raw_input(“> “)) #通过命令行接口CLI的方式交互用户

2、建个最简单的hello.aiml,中英文混搭,注意要大写
<aiml version =”1.0.1″ encoding =”UTF-8”>
<category>
<pattern>你好</pattern>
<template>不错</template>
</category>
<category>
<pattern>天</pattern>
<template>地</template>
</category>
<category>
<pattern>HOW ARE YOU</pattern>
<template>I am fine</template>
</category>
</aiml>

3、建立这个最简单的脚本hello.py,注意Python2和3的版本区别,以及unicode和UTF-8的区别

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import aiml
import sys
mybot = aiml.Kernel()
mybot.learn(sys.argv[1])
while True:
print mybot.respond( raw_input(‘访客说: ‘)), ‘n’

4、给脚本加上可执行,测试
$ chmod + x hello.py
$ ./hello.py hello.aiml
对话如下:

当访客输入“天”的时候,mybot检索数据库,给出“地”的回答,这个很简单。然而就在如此简单的结构上,加入诸多辅助标签,就可以理解复杂难懂的问题。

  • 5、其他标签

1、在aiml文件加入以下内容,试验<that>辅助标签作用
<category>
<pattern>你 问 我 吧</pattern>
<template>平时 喜欢 喝酒 吗?</template>
</category>
<category>
<pattern>是 的</pattern>
<that>平时 喜欢 喝酒 吗?</that>
<template>一般 喝 哪种 酒?</template>
</category>
<category>
<pattern>是 的</pattern>
<that>平时 喜欢 喝茶 吗?</that>
<template>一般 喝 哪种 茶?</template>
</category>

对话如下:

从上面aiml可以看出,that就是上句的意思,也就是访客说是的,后台可以匹配出一大堆的pattern/template对,在上面的例子里面至少有A和B两条,访客都是回答是的,那么机器人具体要用哪个,得看上一句。

2、再例如在aiml文件加入以下内容,试验<srai>这个辅助标签:

<category>
<pattern>下雪 了</pattern>
<template>真 好 啊</template>
</category>
<category>
<pattern>有 啥 好 的</pattern>
<that>真 好 啊</that>
<template>
<srai>好 个 大头 鬼</srai>
</template>
</category>
<category>
<pattern>好 个 大头 鬼</pattern>
<template>呵呵,瑞雪 兆 丰年 么 </template>
</category>

对话如下:

通过上一句的真好啊,后台匹配到A,而A却并没有明确给出结果只是提供了一个srai,说明理解尚未结束匹配还得继续,于是后台继续检索数据库终于从B的pattern/template对匹配到呵呵瑞雪兆丰年,最终输出。

0 回复

发表评论

Want to join the discussion?
Feel free to contribute!

发表评论