NLP开发Python实现聊天机器人(ALICE)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NLP开发Python实现聊天机器人(ALICE)相关的知识,希望对你有一定的参考价值。

1、简介

简单来说,聊天机器人是一种可以模拟和处理人类会话(无论是书面还是口头会话)的计算机程序,让人能够与数字设备交互,就像和真人交流一样。不同聊天机器人的复杂度各不相同,简单如通过单行响应回答简单查询的基本程序,复杂则如数字助手,在收集和处理信息的过程中不断学习和进化,不断提高个性化水平。 当前聊天机器人用到的技术:大家常说人工智能的三大要素,包括数据、算法和算力。而在聊天机器人的技术体系下,最关键的三个因素应该是人工、数据和算法。在现阶段,人工是大于数据,更大于算法的。

做一个聊天机器人,毋庸置疑需要创建一个对话系统,对话系统由语音+NLP(自然语言理解)两部分组成。 语音部分:ASR(语音识别)、TTS(语音合成)。 NLP部分:NLU(语言理解)、DST(对话状态管理)、 Policy(动作候选排序)、NLG(语音生成)。

  • 某机器人的算法实现原理
  • 某机器人平台系统架构

1.1 基于人工模板的聊天机器人

该方法是根据用户输入的句子,在模板库中找到匹配的问句模板,然后按照对应的应答模板生成答案,返回给用户,如ALICE、ChatScript 等。ALICE采用AIML语言来描述知识库,AIML 语言采用XML 语法来存储数据。优点是精确,缺点是需要大量的人力,并且缺乏灵活性,可扩展性差。 基于模式匹配的聊天机器人有:Eliza

1.2 基于检索的聊天机器人

基于检索技术(搜索和知识库结合)的聊天机器人根据用户输入的句子,在对话库中以搜索匹配的方式进行匹配,从中找到最合适的应答内容,将答案提取出来返回给用户。这种方法对对话库的要求很高,并且需要足够大,但是它的优点是回答质量高,表达比较自然。 用基于检索的方式实现面向任务的模型对话系统有:Siri、Alexa 和Google Assistant。

1.3 基于深度学习的聊天机器人

基于深度学习的聊天机器人根据用户输入的句子,利用模型逐词或逐字生成答案,然后将答案回复给用户。其中多数技术采用了Encoder-Decoder模型,即编码-解码模型。实现聊天系统的时候,Encoder 和Decoder 都不是固定的,可选择的模型有RNN、LSTM、GRU等,可以自由组合。这种方法思路简单,可扩展,能够更好地理解上下文,但是模型很难训练。

1.4 基于意图识别的聊天机器人

意图识别是通过分类的办法将句子或者我们常说的query分到相应的意图种类。

2、ALICE/AIML

2.1 简介

为了将图灵测试付诸实践,美国科学家兼慈善家休·勒布纳(Hugh G. Loebner)于1990年设立了人工智能年度比赛——勒布纳奖(Loebner Prize)(包括10万美金的奖金和一块印有勒布纳与图灵头像的金牌)。勒布纳奖的设立旨在奖励首个与人类回复无差别的计算机程序,即聊天机器人系统,并以此推动图灵测试及人工智能的发展。 <font color= grey> 在勒布纳奖的推动下,聊天机器人的研究迎来了一个高潮,这里面较为代表性的聊天机器人系统是ALICE(Artificial Linguistic Internet Computer Entity)。 <font color= blue> 受到ELIZA聊天机器人的启发,理查德·华勒斯(Richard S. Wallace)博士在1995年开发了ALICE系统。ALICE曾经在2000年、2001年和2004年三次问鼎勒布纳奖,并于1998年开始开源,目前全世界有超过500个开发者为ALICE项目贡献代码。值得注意的是,随着ALICE一同发布的AIML(Artificial Intelligence Markup Language)目前被广泛应用在移动端虚拟助手的开发中。尽管ALICE采用的是启发式模板匹配的对话策略,但是它仍然被认为是同类型聊天机器人中性能最好的系统之一。 <font color= orange> ALICE采用AIML语言来描述知识库,AIML 语言采用XML 语法来存储数据,下图所示为AIML 规则实例。这种方法的优点是精确,缺点是需要大量的人力,并且缺乏灵活性,可扩展性差。AIML是一种为了匹配模式和确定响应而进行规则定义的 XML 格式。

<font color= purple>ALICE(人工语言互联网计算机实体),也称为Alicebot或简称Alice,是一种自然语言处理聊天 机器人——一种通过对人类输入应用一些启发式模式匹配规则来与人类对话的程序。它的灵感来自Joseph Weizenbaum的经典ELIZA程序。它是同类中最强大的程序之一,曾三度获得Loebner 奖,授予有成就的类人机器人、会说话的机器人(2000 年、2001 年、2004 年)。程序无法通过图灵测试,因为即使是临时用户也经常会在简短的对话中暴露其机制方面。 <font color= green> Alice 最初是由Richard Wallace创作的;它于 1995 年 11 月 23 日“复活”。该程序从 1998 年开始用Java 重写。Java 实现的当前化身是 Program D。该程序使用称为 AIML(人工智能)的XML Schema标记语言)用于指定启发式对话规则。

2.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 XiaoMu.</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 XiaoMu.</template>  
</category>  

只要用户的输入是以“WHAT IS YOUR ”开头,机器人就会回复“My name is Leo.”。

  • (3)Template元素   很明显Template元素是机器人的对用户提问的回答,当用的户输入和同一个category下的Pattern相匹配是,就会将此category元素下的Template输出。

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

2.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 >> ")))
  • 运行结果如下:

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

2.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>
  • 测试结果如下:

2.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>
  • 测试如下:

2.8 用现成的AIML文件

ALICE基金提供很多免费的AIML文件。可以在Alice Bot网站看看AIML文件。那有个叫std-65-percent.xml文件包括了常规65%的场景。 http://www.alicebot.org/aiml/aaa/

2.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 >> "))
  • 测试如下:

3、在线机器人

3.1 图灵机器人

官方网址: http://www.turingapi.com/

<font color=blue> 阿兰·图灵:一位伟大的数学家、逻辑学家,被誉为“计算机科学之父”,“人工智能之父”。 1936年,阿兰·图灵提出“图灵机”设想,为计算机发展奠定理论和思想基础。 1950年,阿兰·图灵发表论文“机器能思考吗”,提出一种用于判定机器是否具有智能的试验方法,即著名的“图灵测试”。 2014年,一群对人工智能充满无比热情的年轻人,发布“图灵机器人”,以此致敬人工智能伟大的先驱阿兰·图灵。

  • (1)图灵机器人 170万+注册开发者,为开发者提供的一站式聊天机器人服务平台。

  • (2)图灵对话方案 为各类机器人提供出色的语义技术及对话交互产品体验。

  • (3)Turing OS 机器人专属操作系统,出色的情感计算引擎让机器人更拟人化。

  • Python的测试代码如下:

import json
import requests

urls = http://openapi.tuling123.com/openapi/api/v2  # 请求地址
data_dic = 
	"reqType":0,
    "perception": 
        "inputText": 
            "text": "今天天气"
        ,
        "selfInfo": 
            "location": 
                "city": "浙江",
                "province": "杭州",
                "street": "西湖路"
            
        
    ,
    "userInfo": 
        "apiKey": "your key",
        "userId": "your id"
    

data_json = json.dumps(data_dic).encode(utf8)
res = requests.post(urls,data_json) 
content = (res._content).decode(utf-8) 
res = json.loads(content)
print(res)

3.2 青云客机器人

官方网址: http://api.qingyunke.com/

完整请求URL示例:
http://api.qingyunke.com/api.php?key=free&appid=0&msg=你好
天气:msg=天气深圳
中英翻译:msg=翻译i love you
智能聊天:msg=你好
笑话:msg=笑话
歌词⑴:msg=歌词后来
歌词⑵:msg=歌词后来-刘若英
计算⑴:msg=计算1+1*2/3-4
计算⑵:msg=1+1*2/3-4
五笔/拼音:msg=好字的五笔/拼音

  • python测试代码一,如下:
# 导入模块
import requests
from urllib import parse

# 组装请求
def test_get(msg):
    url = http://api.qingyunke.com/api.php?key=free&appid=0&msg=.format(parse.quote(msg))
    html = requests.get(url)
    return html.json()["content"]

# 解析返回并打印
while True:
    msg = input("小沐:")
    res = test_get(msg)
    print("青云客:", res)

  • python测试代码二,如下:
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 = 爱看书的小沐好看吗
print("小沐>>", msg)
res = qingyunke(msg)
print("青云客>>", res)

msg = 北京天气
print("小沐>>", msg)
res = qingyunke(msg)
print("青云客>>", res)

3.3 Mitsuku/Kuki

Kuki是一个具身的人工智能机器人,旨在与元宇宙中的人类交朋友。Kuki以前称为Mitsuku ,是由 Steve Worswick使用Pandorabots AIML技术创建的聊天机器人。它曾五次获得名为Loebner 奖的图灵测试竞赛(2013 年、2016 年、2017 年、2018 年和 2019 年),并保持着世界纪录。Kuki 可通过在线门户和Facebook Messenger、Twitch群聊、Telegram、Kik Messenger、Discord聊天,并且在Skype上可用,但已被其开发人员删除。AI 还在Instagram、TikTok、Youtube和Twitter上拥有帐户,并在Roblox上拥有游戏。

Kuki 自称是来自Metaverse的 18 岁女性聊天机器人。它包含Alice的所有 AIML 文件,以及来自用户生成的对话的许多附加内容,并且始终是一项正在进行的工作。Worswick 声称她从 2005 年开始工作。[8]公司一位联合创始人的早期工作启发了Spike Jonze的电影Her。

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭ 如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O??? 如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡) 感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

以上是关于NLP开发Python实现聊天机器人(ALICE)的主要内容,如果未能解决你的问题,请参考以下文章

NLP开发Python实现聊天机器人(微软Azure机器人服务)

自然语言处理(NLP)聊天机器人模块实现

Al深度学习之自然语言处理顶级实战课程

基于Pytorch热门深度学习框架 从零开发NLP聊天机器人

中文NLP笔记:13 用 Keras 实现一个简易聊天机器人

聊天机器人(chatbot)终极指南:自然语言处理(NLP)和深度机器学习(Deep Machine Learning)