基于Python+AIML+Tornado的智能聊天机器人(NLP+深度学习)含全部工程源码+语料库 适合个人二次开发

news2024/10/7 20:25:07

目录

  • 前言
  • 总体设计
    • 系统整体结构图
    • 系统流程图
  • 运行环境
    • Python 环境
    • Tornado 环境
  • 模块实现
    • 1. 前端
    • 2. 后端
    • 3. 语料库
    • 4. 系统测试
  • 其它资料下载

在这里插入图片描述

前言

本项目旨在利用AIML技术构建一个聊天机器人,实现用户通过聊天界面与机器人交互的功能。通过提供的工程源代码,用户可以轻松地进行二次开发,例如使用网页与机器人进行交互,实现智能问答等。通过网页与机器人的交互,您可以实现智能问答、情感分析等多种功能,为您的应用场景带来更多可能性。快来一起探索AI技术的无限魅力吧!

当然针对现在最火爆的ChatGPT等通用大语言模型,伙伴们可以直接将其应用在模块实现第2部分,其它详细的接口使用操作,大家可以关注我博客的其它关于ChatGPT接口使用的说明。

总体设计

本部分主要包括系统整体结构图和系统流程图。

系统整体结构图

系统整体结构如图所示。

在这里插入图片描述

系统流程图

AIML系统流程如下:

第一步:系统初始化
AIML系统在启动时,首先根据配置文件进行系统的初始化操作,把需要替换的词串(如把it’s替换为itis)、自身的相关信息(如名字、性别等)、人称转换信息以及此前的对话情景变量读入系统,并把AIML文件内容(即知识库)以树的结构形式加载到内存当中,形成内存知识树,这样当系统在响应用户输入的问句时,可直接在内存树中进行推理,提高了响应速度。加载完毕之后,等待用户输入问句。

第二步:接收用户输入,进行问句规范化处理
当AIML解析器接收到一行用户的输入后,首先把输入的文字分成单独的句子,进行问句规范化处理,分析当前句子中是否包含需要替换的字符串,如果有,则替换之。例如把问句中出现的“you’ve”替换为“youhave”,“I’m”替换为“Iam”等等。问句规范化处理完以后,以规范问句到内存知识树中查询推理答案。

第三步:问句查询推理
这一过程是AIML的核心部分,将规范化处理后的问句与内存知识树中的模式进行匹配,寻找最佳匹配结果,找到之后,读出该匹配模式对应的模板信息,进行下一步处理。

第四步:模板处理
也就是答案的后处理,模板中可能包含一些特殊标记需要处理,如读出机器人名字标记所代表的实际名称,还原星号部分所代表的内容,如果包含跳转标记,还需要在内存知识树中以跳转部分的内容做进一步的推理。模板处理完后返回用户结果,等待用户输入新问句。

系统流程如图所示:

在这里插入图片描述

运行环境

本部分包括 Python 环境、Tornado 环境。

Python 环境

需要 Python 2.7,下载地址:https://www.python.org/downloads/windows/。

Tornado 环境

Tornado 是使用 Python 编写的一个强大的、可扩展的 Web 服务器。

模块实现

本项目主要包括 3 个模块,前端、后端、语料库,下面分别给出各模块的功能介绍及相关代码。

1. 前端

前端框架地是采用 Bootstrap 框架。Bootstrap,来自 Twitter,是目前最受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JavaScript 的,它在 jQuery 的基础上进行了更为个性化和人性化的完善,形成一套自己独有的网站风格,并兼容大部分 jQuery 插件。Bootstrap 简洁灵活,使得 Web 开发更加快捷。其最大的优势是响应式布局,使得开发者
可以方便的让网页无论在台式机、平板设备、手机上都获得最佳的体验。

<!DOCTYPE html>
<html>
<head>
    <!-- <meta charset="utf-8"> -->
    <title>ChatBotx</title>
    <!-- 新 Bootstrap 核心 CSS 文件 -->
    <link href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
    
    <!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
    <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
    
    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
    <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
    
    <style type="text/css">
        .top-margin-20{
            margin-top: 20px;  //设置上边距
        }
        #result_table,#result_table thead th{
            text-align: center;
        }
        #result_table .td-width-40{
            width: 40%;
        }
    </style>

    
    <script type="text/javascript">
        var AppDomain = 'http://localhost:8000/'
        $(document).ready(function(){
            $("#btn_sub").click(function(){
                var user = 'XXX';
                var resUser = 'Bot';

                var request_txt = $("#txt_sub").val();

                setView(user,request_txt);

                $.ajax({
                    type: 'post',
                    url: AppDomain+'chat',
                    async: true,//异步
                    dataType: 'json',
                    // contentType: "application/x-www-form-urlencoded; charset=utf-8", 
                    data: (
                    {
                        "msg":encodeURI(request_txt)
                    }),
                    success: function (data)
                    {
                        console.log(JSON.stringify(data));
                        if (data.is_success == true) {
                            setView(resUser,data.message);
                        }
                    },
                    error: function (data)
                    {
                        console.log(JSON.stringify(data));
                    }
                });

                
            });

        });
        function setView(user,text)
        {
            var subTxt = user + "   "+new Date().toLocaleTimeString() +'\n·'+ decodeURI(text);
            $("#txt_view").val($("#txt_view").val()+'\n\n'+subTxt);

            var scrollTop = $("#txt_view")[0].scrollHeight;  
            $("#txt_view").scrollTop(scrollTop);  
        }
    </script>
</head>
<body class="container">
    <header class="row">
        <header class="row">
            <a href="/" class="col-md-2" style="font-family: SimHei;font-size: 20px;text-align:center;margin-top: 30px;">
                <span class="glyphicon glyphicon-home"></span>Home
            </a>
            <font class="col-md-4 col-md-offset-2" style="font-family: SimHei;font-size: 30px;text-align:center;margin-top: 30px;">
                ChatBot
            </font>
        </header>
    </header>
        <hr>

        <article class="row">

            <section class="col-md-10 col-md-offset-1" style="border:border:solid #7FFFD4 1px;padding: 0; background-color: #FFDEAD;">
                <span class="glyphicon glyphicon-user"></span> User: XXX 
            </section>
            <section class="col-md-10 col-md-offset-1 row" style="border:solid #7FFFD4 1px;padding:0">
                <section class="col-md-9" style="height: 400px;">
                    <section class="row" style="height: 270px;">
                        <textarea class="form-control" style="width:100%;height: 100%;resize: none;overflow-x: none;overflow-y: scroll;background-color:antiquewhite" readonly="true" id="txt_view"></textarea>
                    </section>
                    <section class="row" style="height: 130px;border-top:solid #7FFFD4 1px; ">
                        <textarea class="form-control" style="overflow-y: scroll;overflow-x: none;resize: none;width: 100%;height:70%;border: #fff;background-color:rgb(107, 170, 189)" id="txt_sub"></textarea>
                        <button class="btn btn-primary" style="float: right;margin: 0 5px 0 0;background-color:gray" id="btn_sub">Submit</button>
                    </section>
                </section>
                <section class="col-md-3" style="height: 400px;border-left: solid #7FFFD4 1px;">
                   
                </section>
            </section>
        </article>
</body>
</html>

2. 后端

后端我们采用的是 tornado 架构,之所以使用 tornado 是因为 Tornado 是使用 Python编写的一个强大的、可扩展的 Web 服务器。它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和工具中。Tornado 和主流 Web服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。

#!/usr/bin/env python
 
# -*- coding: utf-8 -*-
 
import os.path
import tornado.auth
import tornado.escape
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options
 
import os
import aiml
 
os.chdir(r'C:\Users\clys\Desktop\AIML\example1')
k = aiml.Kernel()
k.learn("cn-startup.xml")
k.respond("load aiml cn")
 
 
define('port', default=8000, help='run on the given port', type=int)
 
 
class Application(tornado.web.Application):
  def __init__(self):
    handlers = [    #handlers,它告诉 Tornado 应该用哪个类来响应请求。
      (r'/', MainHandler),
      (r'/chat', ChatHandler),
    ]

    settings = dict(
      template_path=os.path.join(os.path.dirname(__file__), 'templates'), #该句作是告诉 tornado 在哪里找模板文件
      static_path=os.path.join(os.path.dirname(__file__), 'static'),
      debug=True,   #设置调制模式,默认为 false
    )


    tornado.web.Application.__init__(self, handlers, **settings)


class MainHandler(tornado.web.RequestHandler):
  def get(self):   #get 的作用是渲染界面
    self.render('index.html')   #发送 index.HTML 文件给浏览器

  def post(self):  #post 的作用是获取参数,并分析,返回结果

    result = {
      'is_success': True,
      'message': '123'
    }

    respon_json = tornado.escape.json_encode(result)
    self.write(str(respon_json))

  def put(self):
    respon_json = tornado.escape.json_encode("{'name':'XXX','age':123}")
    #tornado.escape.json_encode(result)的作用是:json 对指定的 python 对象进行编码
    self.write(respon_json)


class ChatHandler(tornado.web.RequestHandler):  # 定 义 一 个tornado.web.RequestHandler 的子类为 ChatHandler
  def get(self):
    self.render('chat.html')

  def post(self):
    try:
      message = self.get_argument('msg', None)

      print(str(message))

      result = {
      'is_success': True,
      'message': str(k.respond(message))
      }

      print(str(result))

      respon_json = tornado.escape.json_encode(result)

      self.write(respon_json)

    except Exception as ex:
      repr(ex)
      print(str(ex))

      result = {
      'is_success': False,
      'message': ''
      }

    self.write(str(result))
 

def main():
  tornado.options.parse_command_line()
  http_server = tornado.httpserver.HTTPServer(Application())
  http_server.listen(options.port)
  tornado.ioloop.IOLoop.instance().start()
 
 
if __name__ == '__main__':
  print('HTTP server starting ...')
  main()



3. 语料库

1)标签解释:

<aiml>:定义一个 aiml 文件的开始与结束
<category>:定义一个知识的单元
<pattern>:定义一个模板,来匹配用户可能的输入
<template>:定义根据用户的输入需要返回的回答

因此表现在聊天界面的效果就是:

user:你好
bot:嗨,好久不见
user:你是谁
bot:我是灰太狼 1234

但是光是以上如此简单的模式,要适应大量的人类语言与句式,显得异常笨重,aiml 提供了许多其他 tag 来帮助人们构建更有效更灵活的问答模式。

代码示例:

<?xml version="1.0" encoding="UTF-8"?>

<aiml version="1.0">

<meta name="author" content="Andelf"/>
<meta name="language" content="zh"/>

<category>
<pattern>登录</pattern>
<template>
你的用户名是?
</template>
</category>

<category>
<pattern>*</pattern>
<template>
  <condition>
    <li name="password" value="123456">密码正确, <get name="username" />已通过验证.</li>
    <li name="password" value="">请登陆.</li>
  </condition>
</template>
</category>


<category>
<pattern>*</pattern>
<that>你的用户名是</that>
<template>
<think><set name="username"><star/></set></think>
你的密码是?
</template>
</category>

<category>
<pattern>*</pattern>
<that>你的密码是</that>
<template>
<think><set name="password"><formal><star/></formal></set></think>
谢谢.
</template>
</category>


</aiml>

2)在正式构建聊天机器人之前,需要创建一个名为后缀为.xml 的启动文件,用于作为加载AIML 文件的主入口点。

代码示例:

<aiml version="1.0">

<category>
<pattern>LOAD AIML CN</pattern>
<template>

	<!-- Template是模式的响应 -->
        <!-- 这里学习一个aiml文件 -->n

	<learn>zhoudk.aiml</learn>
	<learn>corpus1000.aiml</learn>
	<learn>maimeng.aiml</learn>
	<learn>rude.aiml</learn>
	<learn>sex.aiml</learn>

	<learn>shengji.aiml</learn>


	<!-- 你可以在这里添加更多的aiml文件 -->
	<!--<learn>chat.aiml</learn>-->
</template>
</category>

</aiml>

4. 系统测试

1) 运行后端服务器

运行后端服务器界面如图所示:

在这里插入图片描述

2) 后台运行结果

在浏览器中输入以下地址

http://localhost:8000/

聊天界面如图所示:

在这里插入图片描述

后台运行结果如图所示:

在这里插入图片描述

其它资料下载

如果大家想继续了解人工智能相关学习路线和知识体系,欢迎大家翻阅我的另外一篇博客《重磅 | 完备的人工智能AI 学习——基础知识学习路线,所有资料免关注免套路直接网盘下载》
这篇博客参考了Github知名开源平台,AI技术平台以及相关领域专家:Datawhale,ApacheCN,AI有道和黄海广博士等约有近100G相关资料,希望能帮助到所有小伙伴们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/593013.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【业务功能篇07】Mysql 模糊查询

业务场景&#xff1a;我们对不同的业务逻辑进行数据处理时&#xff0c;多数是离不开需要模糊匹配的时候&#xff0c;比如要获取该表某个字段中&#xff0c;含有某个具体的字符内容&#xff0c;过滤出业务想要的数据。 这里介绍有这么几种&#xff1a; 一、MySQL通配符模糊查询(…

3D模型Web轻量化工具,如何监测矿藏开采安全与效率?

随着科技的进步&#xff0c;各个领地都在不断探索和应用新的技术来提高效率和准确性。HOOPS技术作为一种先进的3D可视化和模拟技术&#xff0c;正在采掘和地质科学领域发挥着重要的作用。本文将探讨HOOPS技术在采掘和地质科学中的具体应用&#xff0c;并分析其对这些领域的影响…

Maven高级1-分模块开发与依赖问题

1. 分模块开发与设计 将原始模块按照功能拆分成若干个子模块&#xff0c;方便模块间的相互调用&#xff0c;接口共享&#xff1b; 言简意赅就是把功能模块放出去&#xff0c;然后通过在pom文件中导入坐标找到&#xff1b; 注意拆出来的功能模块需要通过Maven指令安装模块选择in…

Python Web后端面试常考数据结构与算法(珍藏版)

本文将对Python web后端面试时常考数据结构与算法进行总结&#xff0c;适合即将找工作或面试的你。Python web后端常考数据结构包括: 常见的数据结构链表、队列、栈、二叉树、堆 使用内置的结构实现高级数据结构&#xff0c;比如内置的list/deque实现栈 LeetCode或者剑指Offe…

【配电网重构】高比例清洁能源接入下计及需求响应的配电网重构【IEEE33节点】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

循环冗余计算

题目&#xff1a;若信息码字为111000110&#xff0c;生成多项式 x 5 x^5 x5 x 3 x^3 x3 x x x1&#xff0c;则计算crc校验码为()。 将生成多项式的系数作为除数&#xff08;101011&#xff09;&#xff1b; 获得方法1x50x41x30x21x1生成多项式的最高幂次数&#xff08;5&#…

怎样使用TikTok增加销售额?TikTok选品小tips?

哈喽everybody&#xff01;我又来给大家分享干货了&#xff01;今天为大家带来使用TikTok增加销售额和TikTok选品的小tips&#xff0c;让你运营TikTok Shop不迷茫&#xff0c;快快往下看吧&#xff01; 一、如何使用TikTok吸引客户、增加销售额 1.优化产品目录 与任何线上商店…

Python实现KNN算法(附源码)

本篇我们将讨论一种广泛使用的分类技术&#xff0c;称为k邻近算法&#xff0c;或者说K最近邻(KNN&#xff0c;k-Nearest Neighbor)。所谓K最近邻&#xff0c;是k个最近的邻居的意思&#xff0c;即每个样本都可以用它最接近的k个邻居来代表。 01、KNN算法思想 如果一个样本在特征…

绿色智慧档案顺丰环境一体化平台选型表

盛世宏博八防一体化监控系统选型表 序号 功能选择 1 恒温恒湿系统 温湿度监测 口Y&#xff1a;需要 口N&#xff1a;不需要 空调控制 口Y&#xff1a;需要 口N&#xff1a;不需要 加湿机控制 口Y&#xff1a;需要 口N&#xff1a;不需要 除湿…

KD05丨动量RSI策略

大家好&#xff0c;今天我们来分享魔改RSI策略&#xff0c;RSI即相对强弱指数&#xff0c;本质上就是一个动量指标&#xff0c;用于衡量一定时间内价格变动的速度及其变动的大小。它在0-100的范围内变动&#xff0c;通常以70和30作为过热和过冷的界限。要将RSI指标改为一个趋势…

Smartbi“三步走”构建智慧经营分析平台,实现国有企业监管报送和数智化转型

01. 现状与痛点 — 一直以来&#xff0c;国资国企都是促进我国经济高速发展的领头羊&#xff0c;但近年来受疫情冲击和国际经济下行影响&#xff0c;国资企业经营面临较大压力&#xff0c;同时为实现国有企业高质量发展&#xff0c;国务院国资委下发一系列政策要求&#xff…

Halcon 表面法向量 pcl

一、Halcon halcon 案例&#xff1a; find_surface_model_noisy_data.hdev 思路步骤&#xff1a; 1、读取图像 2、拆通道 3、通过Z通道选出比较合适做匹配的模板 4、通过Z x y 生成一个模型xyz_to_object_model_3d 5、计算表面法向量并生成表面的模型&#xff0c;这个模型…

Linux:apache网页优化

Linux&#xff1a;apache网页优化 一、Apache 网页优化二、网页压缩2.1 检查是否安装 mod_deflate 模块2.2 如果没有安装mod_deflate 模块&#xff0c;重新编译安装 Apache 添加 mod_deflate 模块2.3 配置 mod_deflate 模块启用2.4 检查安装情况&#xff0c;启动服务2.5 测试 m…

字节跳动测试岗,3面都过了,HR告诉我是这个原因才被刷...

说在前面 面试时最好不要虚报工资。本来字节跳动是很想去的&#xff0c;几轮面试也通过了&#xff0c;最后没offer&#xff0c;自己只想到下面几个原因&#xff1a; 虚报工资&#xff0c;比实际高30%&#xff1b;有更好的人选&#xff0c;这个可能性不大&#xff0c;我看还在…

医院检验科LIS系统的常规检验项目有哪些?

医院检验科LIS系统的常规检验项目包括&#xff1a; 白细胞数目、中性粒细胞数目、淋巴细胞数目、单核细胞数目、嗜酸性粒细胞数目、嗜碱性粒细胞数目、中性粒细胞百分比、 淋巴细胞百分比、单核细胞百分比、嗜酸性粒细胞百分比、嗜碱性粒细胞百分比、红细胞数目、血红蛋白、红…

淘宝太细了:mysql 和 es 的5个一致性方案,你知道吗?

说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如拼多多、极兔、有赞、希音的面试资格&#xff0c;遇到一几个很重要的面试题&#xff1a; 说5种mysql 和 elasticsearch 数据一致性方案 与之类似的、其他小伙伴遇到过的问题还…

电脑怎么隐藏文件夹?这样做,快速搞定!

案例&#xff1a;我想把一些敏感和重要的文件夹隐藏起来&#xff0c;不想别人看到它们。在电脑上如何隐藏电脑文件夹&#xff1f;有没有小伙伴知道如何操作&#xff1f;急需&#xff01; 我们在使用电脑的过程中&#xff0c;会产生大量文件&#xff0c;有些文件可能包含私密信…

4.1 Spark SQL概述、数据帧与数据集

一、数据帧 - DataFrame &#xff08;一&#xff09;准备工作 1、准备数据文件 2、启动Spark Shell &#xff08;二&#xff09;加载数据为Dataset 1、读文件得数据集 2、显示数据集内容 3、显示数据集模式 &#xff08;三&#xff09;给数据集添加元数据信息 1、定…

强!PCB“金手指”从设计到生产全流程

在电脑内存条、显卡上&#xff0c;有一排金黄色导电触片&#xff0c;就是大家俗称的“金手指”。 在PCB设计制作行业中的“金手指”(Gold Finger&#xff0c;或称Edge Connector)&#xff0c;是由connector连接器作为PCB板对外连接网络的出口。 关于“金手指”你知道多少呢&a…

像核战争一样,AI可能灭绝人类:Geoffrey Hinton、Sam Altman等百名专家签署了一封公开信

多位图灵奖得主、顶级 AI 公司 CEO、顶尖高校教授&#xff0c;与数百位在各自领域享有话语权的专家&#xff0c;共同签署了一份公开信&#xff0c;内容简单却有力&#xff1a; 降低 AI 灭绝人类的风险&#xff0c;应该与大流行病、核战争等其他社会规模的风险一样&#xff0c;…