文章目录
- 1、简介
- 2、ELIZA
- 2.1 Eliza Test(java)
- 2.2 wadetb/eliza(python)
- 2.3 eliza-py(python)
- 2.4 nltk.chat.eliza(python)
- 2.5 ELIZA-ChatterBot(python)
- 3、ALICE/AIML
- 3.1 简介
- 3.2 AIML文件描述
- 3.3 AIML库安装
- 3.4 自带库alice代码测试
- 3.5 写标准启动文件
- 3.6 写AIML文件
- 3.7 随机回复
- 3.8 用现成的AIML文件
- 3.9 自定义库代码测试
- 4、其他
- 4.1 青云客机器人
- 4.2 思知机器人
- 结语
1、简介
聊天机器人可用于实用的目的,如客户服务或资讯获取。有些聊天机器人会搭载自然语言处理系统,但大多简单的系统只会撷取输入的关键字,再从数据库中找寻最合适的应答句。聊天机器人是虚拟助理(如Google智能助理)的一部分,可以与许多组织的应用程序,网站以及即时消息平台(Facebook Messenger)连接。非助理应用程序包括娱乐目的的聊天室,研究和特定产品促销,社交机器人。
聊天机器人(chatterbot)是一个用来模拟人类对话或聊天的程序。“Eliza”和 “Parry”是早期非常著名的聊天机器人。它试图建立这样的程序:至少暂时性地让一个真正的人类认为他们正在和另一个人聊天。
早期经典的聊天机器人是 ELIZA (1966)与 PARRY (1972)。近期值得注意的则包括 A.L.I.C.E.,Jabberwacky,以及 D.U.D.E。虽然 ELIZA 和 PARRY 仅仅用于模拟笔谈,现在许多聊天机器人纳入游戏及网络搜寻的功能。1984年,《警察的胡子造了一半》(The Policeman’s Beard Is Half Constructed)出版,据称作者是聊天机器人“瑞克特”(Racter)。
相关的人工智能领域是自然语言处理。通常“弱人工智能”(Weak AI) 领域使用专门的软件或编程语言以完成特定的功能。例如 A.L.I.C.E.使用一种叫做 AIML 的标记式语言,适用于谈话代理的功能,并且已被各类开发人员采用,他们的产品叫做爱丽丝机器人(Alicebots)。不过 A.L.I.C.E.仍是纯粹运用类型配对的技巧,缺乏思考能力, 跟1966年的 ELIZA 并无不同。“强人工智能”(strong AI) 则不同, 必须有智慧和逻辑推理的能力。
- 基于人工模板的聊天机器人。
- 基于检索的聊天机器人。
- 基于深度学习的聊天机器人。
2、ELIZA
伊莉莎(Eliza)是最早的与人对话程序,是由系统工程师约瑟夫·魏泽堡和精神病学家肯尼斯·科尔比在20 世纪60 年代共同编写的。是世界上第一个真正意义上的聊天机器人。他们将程序命名为伊莉莎,灵感来自于英国著名戏剧家肖伯纳的戏剧《偶像》中的角色,它能够使计算机与人用英语谈话。在自然语言理解技术尚未真正取得突破性进展时,这是一个令人费解的现象。
ELIZA是第一个把英语作为输入和输出的程序,这是他的一大特性。ELIZA最初的开发者,Eliza 的名字源于爱尔兰剧作家萧伯纳的戏剧作品《卖花女》中的角色,剧中出身贫寒的卖花女 Eliza 通过学习与上流社会沟通的方式,变成大使馆舞会上人人艳羡的“匈牙利王家公主”。作为世界上第一个聊天机器人,Eliza 被其作者赋予了充满戏剧性的内涵。
ELIZA是一个被设计为模拟精神治疗医师的程序,由麻省理工大学研究员Joseph Weizenbaum设计。程序实际上提供了一些模拟反应来回答用户提出的问题。它向展示向人们展示了,一个足够厉害的程序应该是智能的。仅用 200 行代码就实现了这一过程,使 Eliza 能够让人产生被机器聆听、理解的错觉。
Weizenbaum编写Eliza使用的是Lisp语言,一种比较难懂和小众的程序设计语言。不过他做了非常详尽的注释 ,这使得将Eliza移植到别的平台和语言成了相当容易的一件事。
>>1966年1月,Joseph Weizenbaum教授,写出了一篇关于Eliza的论文。在 1964 年至 1966 年间,麻省理工学院人工智能实验室的德裔美国计算机科学家约瑟夫·维森鲍姆(Joseph Weizenbaum)开发了历史上第一个聊天机器人 —— Eliza。
>> 通过 Eliza 的实验,Joseph Weizenbaum开始质疑阿兰·图灵(Alan Turing)在1950 年提出的关于人工智能的想法。图灵在他的题为“ 计算机械与智能 ”的论文中提出,如果一台计算机可以通过文本与人类进行令人信服的对话,则可以认为它是智能的。这一思想也就是著名的图灵测试的基础。
>> 1976 年,Joseph Weizenbaum发表了《计算能力与人为原因:从判断到计算》 ,该书对人们为何愿意相信“一台简单的机器也许能够理解复杂的人类情感” 进行了深刻的剖析。尽管ELIZA的实现技术仅为关键词匹配及人工编写的回复规则,但魏泽鲍姆本人对ELIZA的表现感到吃惊,随后撰写了《Computer Power and Human Reason》这本书,表达他对人工智能的特殊情感。
Joseph Weizenbaum: 解释就是掩饰,越抹越黑。
Eliza的计算机对话模拟程序。最为著名的一段对话脚本随后被发布在1966年元月期的ACM通讯杂志上。这段发生在计算机程序与一个年青女病人之间的对话记录如下(程序的回应使用大写):
Men are all alike.
IN WHAT WAY
They’re always bugging us about something or other.
CAN YOU THINK OF A SPECIFIC EXAMPLE
Well, my boyfriend made me come here.
YOU BOYFRIEND MADE YOU COME HERE
He says I’m depressed much of the time.
I AM SORRY TO HEAR YOU ARE DEPRESSED
It’s true. I am unhappy.
DO YOU THINK COMING HERE WILL HELP YOU NOT TO BE UNHAPPY
I need some help, that much seems certain.
WHAT WOULD IT MEAN TO YOU IF YOU GOT SOME HELP
Perhaps I could learn to get along with my mother.
TELL ME MORE ABOUT YOUR FAMILY
My mother takes care of me.
WHO ELSE IN YOU FAMILY TAKES CARE OF YOU
My Father.
YOUR FATHER
You are like my father in some ways.
WHAT RESEMBLANCE DO YOU SEE
You are not very aggressive but I think you don’t want me to notice that.
WHAT MAKES YOU THINK I AM NOT VERY AGGRESSIVE
You don’t argue with me.
WHY DO YOU THINK I DON’T ARGUE WITH YOU
You are afraid of me.
DOES IT PLEASE YOU TO BELIEVE I AM AFRAID OF YOU
My father is afraid of everybody.
WHAT ELSE COMES TO MIND WHEN YOU THINK OF YOUR FATHER
Bullies.
DOES THAT HAVE ANYTHING TO DO WITH THE FACT THAT YOUR BOYFRIEND MADE YOU COME HERE
参考文献: Weizenbaum J. ELIZA—a computer program for the study of natural language communication between man and machine[J]. Communications of the ACM, 1966, 9(1): 36-45.
2.1 Eliza Test(java)
2.2 wadetb/eliza(python)
https://github.com/wadetb/eliza Eliza chatbot in Python:Loosely based on Charles Hayden’s version in Java, at http://chayden.net/eliza/Eliza.html.
import unittest
import eliza
class ElizaTest(unittest.TestCase):
def test_decomp_1(self):
el = eliza.Eliza()
self.assertEqual([], el._match_decomp(['a'], ['a']))
self.assertEqual([], el._match_decomp(['a', 'b'], ['a', 'b']))
def test_response_2(self):
el = eliza.Eliza()
el.load('doctor.txt')
self.assertEqual(el.initial(), 'How do you do. Please tell me your problem.')
self.assertIn(el.respond('Hello'), [
'How do you do. Please state your problem.',
'Hi. What seems to be your problem ?'])
self.assertEqual(el.final(), 'Goodbye. Thank you for talking to me.')
if __name__ == '__main__':
unittest.main()
运行结果如下(增加了部分规则):
2.3 eliza-py(python)
https://github.com/rdimaio/eliza-py
运行结果如下(增加了部分规则):
2.4 nltk.chat.eliza(python)
2.5 ELIZA-ChatterBot(python)
https://github.com/graylu21/ELIZA-ChatterBot
3、ALICE/AIML
3.1 简介
为了将图灵测试付诸实践,美国科学家兼慈善家休·勒布纳(Hugh G. Loebner)于1990年设立了人工智能年度比赛——勒布纳奖(Loebner Prize)(包括10万美金的奖金和一块印有勒布纳与图灵头像的金牌)。勒布纳奖的设立旨在奖励首个与人类回复无差别的计算机程序,即聊天机器人系统,并以此推动图灵测试及人工智能的发展。
在勒布纳奖的推动下,聊天机器人的研究迎来了一个高潮,这里面较为代表性的聊天机器人系统是ALICE(Artificial Linguistic Internet Computer Entity)。
受到ELIZA聊天机器人的启发,理查德·华勒斯(Richard S. Wallace)博士在1995年开发了ALICE系统。ALICE曾经在2000年、2001年和2004年三次问鼎勒布纳奖,并于1998年开始开源,目前全世界有超过500个开发者为ALICE项目贡献代码。值得注意的是,随着ALICE一同发布的AIML(Artificial Intelligence Markup Language)目前被广泛应用在移动端虚拟助手的开发中。尽管ALICE采用的是启发式模板匹配的对话策略,但是它仍然被认为是同类型聊天机器人中性能最好的系统之一。
ALICE采用AIML语言来描述知识库,AIML 语言采用XML 语法来存储数据,下图所示为AIML 规则实例。这种方法的优点是精确,缺点是需要大量的人力,并且缺乏灵活性,可扩展性差。AIML是一种为了匹配模式和确定响应而进行规则定义的 XML 格式。
3.2 AIML文件描述
AIML,全名为Artificial Intelligence Markup Language(人工智能标记语言),是一种创建自然语言软件代理的XML语言,是由Richard Wallace和世界各地的自由软件社区在1995年至2002年发明的。它的雏形是一个名为"A.L.I.C.E." (“Artificial Linguistic Internet Computer Entity”)的高度扩展的Eliza机器人。ALICE总共赢得3次每年度的Loebner奖,并且在2004年获得了Chatterbox Challenge的冠军。由于A.L.I.C.E. 的AIML设置是在GNU GPL协议下发布的,所以已经有许多基于该程序和AIML库的“克隆ALICE”出现。目前AIML已经有了Java,Ruby,Python, C ,C#,Pascal等语言的版本。
- (1)category元素
category是AIML库中的基本单位,每个category元素都至少包含两个子元素:pattern和template元素。下面是个简单的例子:
<category>
<pattern>WHAT IS YOUR NAME</pattern>
<template>My name is Leo.</template>
</category>
当这个AIML库被加载之后,你问机器人“WHAT IS YOUR NAME”,机器人便会回答“My name is Leo.”。
- (2)Pattern元素
Pattern主要用来匹配用户输入,在原生的英文AIML语法中Pattern支持 _ 和 * 的模糊匹配。例如:
<category>
<pattern>WHAT IS YOUR *</pattern>
<template>My name is Leo.</template>
</category>
只要用户的输入是以“WHAT IS YOUR ”开头,机器人就会回复“My name is Leo.”。
- (3)Template元素
很明显Template元素是机器人的对用户提问的回答,当用的户输入和同一个category下的Pattern相匹配是,就会将此category元素下的Template输出。
3.3 AIML库安装
借助 Python 的 AIML 包,我们很容易实现人工智能聊天机器人。 AIML,全名为Artificial Intelligence Markup Language(人工智能标记语言),是一种创建自然语言软件代理的XML语言,是由Richard Wallace和世界各地的自由软件社区在1995年至2002年发明的。
- 安装Python aiml库:
Python 2:pip install aiml
Python 3:pip install python-aiml
- 获取alice资源
Python aiml安装完成后在Python安装目录下的 Lib/site-packages/aiml下会有alice子目录,将此目录复制到工作区。或者在Google code上下载alice brain: aiml-en-us-foundation-alice.v1-9.zip
3.4 自带库alice代码测试
Python aiml安装完成后在Python安装目录下的 Lib/site-packages/aiml下会有alice子目录,这个是系统自带的一个简单的语料库。
# -*- coding: utf-8 -*-
import aiml
import sys
import os
## 获取alice库的安装目录
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') + '/botdata/alice'
os.chdir(alice_path)
print(alice_path)
## 加载语料库文件
alice = aiml.Kernel()
alice.learn("startup.xml")
alice.respond('LOAD ALICE')
## 轮询问答
while True:
print(alice.respond(input("Enter your message >> ")))
- 运行结果如下:
3.5 写标准启动文件
标准是写一个叫std-startup.xml的启动文件作为载入AIML文件的主入口点。 这里我们会写一个可以匹配一个模式并做一个动作的基本文件。 我们想要匹配模式load aiml b, 然后让它载入我们的aiml大脑。后面还会写一个basic_chat aiml文件:std-startup.xml。
<aiml version="1.0.1" encoding="UTF-8">
<!-- std-startup.xml -->
<!-- Category is an atomic AIML unit -->
<category>
<!-- Pattern to match in user input -->
<!-- If user enters "LOAD AIML B" -->
<pattern>LOAD AIML B</pattern>
<!-- Template is the response to the pattern -->
<!-- This learn an aiml file -->
<template>
<learn>xiaomu_chat.aiml</learn>
<learn>xiaomu_chat2.aiml</learn>
<learn>xiaomu_chat3.aiml</learn>
</template>
</category>
</aiml>
3.6 写AIML文件
上面我们写了一个只处理一种模式的AIML文件,LOAD AIML B。当我们输入那条命令给机器人,它会加载xiaomu_chat.aiml。当我们没写这个文件的时候是不会工作的。这里是你可以放到xiaomu_chat.aiml的内容。我们会匹配两个基本模式和响应。
<aiml version="1.0.1" encoding="UTF-8">
<!-- xiaomu_chat.aiml -->
<category>
<pattern>HELLO</pattern>
<template>
Well, hello! 爱看书的小沐!2022!
</template>
</category>
<category>
<pattern>WHO ARE YOU</pattern>
<template>
My name is 爱看书的小沐.
</template>
</category>
<category>
<pattern>XIAOMU</pattern>
<template>
小沐,小沐,小沐,你是最棒的!
</template>
</category>
<category>
<pattern>ABC</pattern>
<template>
跟着小沐一起学英语!
</template>
</category>
</aiml>
- 测试结果如下:
3.7 随机回复
其中 *是一个占位符代表能匹配任何字符。
<category>
<pattern>STUDY*</pattern>
<template>
<random>
<li>跟着小沐一起学英语!</li>
<li>跟着小沐一起学语文!</li>
<li>跟着小沐一起学数学!</li>
<li>小沐今天很忙,没空学习。</li>
<li>需要小沐帮忙吗?</li>
<li>小沐不理解您说的话。</li>
<li>小沐最爱吃汉堡包了。</li>
<li>今天是周末,小沐最开心</li>
</random>
</template>
</category>
- 测试如下:
3.8 用现成的AIML文件
ALICE基金提供很多免费的AIML文件。可以在Alice Bot网站看看AIML文件。那有个叫std-65-percent.xml文件包括了常规65%的场景。
3.9 自定义库代码测试
import aiml
# Create the kernel and learn AIML files
kernel = aiml.Kernel()
kernel.learn("std-startup.xml")
kernel.respond("load aiml b")
# Press CTRL-C to break this loop
while True:
print kernel.respond(raw_input("Enter your message >> "))
- 测试如下:
4、其他
4.1 青云客机器人
青云客智能机器人api是由青云客网络免费提供的一个智能聊天api 接口,技术人员可直接调用接口实现有趣的人机对话。不用注册,不用申请key,拿来就用!哈哈!
- 测试代码如下:
import requests
import urllib
def qingyunke(msg):
url = 'http://api.qingyunke.com/api.php?key=free&appid=0&msg={}'.format(urllib.parse.quote(msg))
html = requests.get(url)
return html.json()["content"]
msg_list = ['小沐好看吗?', '小沐经常做什么?', '爱看书的小沐来了!']
for msg in msg_list:
print("小沐>> ", msg)
res = qingyunke(msg)
print("青云客>> ", res)
- 测试结果如下:
4.2 思知机器人
思知(OwnThink)AI机器人开放平台拥有自定义知识库、语义理解、知识图谱、对话场景等功能,机器人采用了基于知识图谱的语义感知与理解。
- 测试代码1如下:
import json
import requests
ret = requests.get('https://api.ownthink.com/bot?spoken=小沐多高啊?')
answer = ret.text
answer = json.loads(answer)
print(answer)
- 测试结果1如下:
- 测试代码2:
import requests
def kg_view(entity):
# 知识图谱API
url = 'https://api.ownthink.com/kg/knowledge?entity=%s'%entity
sess = requests.get(url)
text = sess.text
response = eval(text)
knowledge = response['data']
nodes = []
for avp in knowledge['avp']:
if avp[1] == knowledge['entity']:
continue
node = {'source': knowledge['entity'], 'target': avp[1], 'type': "resolved", 'rela':avp[0]}
nodes.append(node)
for node in nodes:
node = str(node)
node = node.replace("'type'", 'type').replace("'source'", 'source').replace("'target'", 'target')
print(node+',')
if __name__=='__main__':
kg_view('图灵')
- 测试结果2:
如果您觉得该方法或代码有一点点用处,可以给作者点个赞
╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;
o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;
(✿◡‿◡)
感谢各位大佬童鞋们的支持!
( ´ ▽´ )ノ ( ´ ▽´)っ!!!