AI人工智能 Python实现人机对话


Posted in Python onNovember 13, 2017

在人工智能进展的如火如荼的今天,我们如果不尝试去接触新鲜事物,马上就要被世界淘汰啦~

本文拟使用Python开发语言实现类似于WIndows平台的“小娜”,或者是IOS下的“Siri”。最终达到人机对话的效果。

【实现功能】

这篇文章将要介绍的主要内容如下:

1、搭建人工智能--人机对话服务端平台

2、实现调用服务端平台进行人机对话交互

【实现思路】

AIML

AIML由Richard Wallace发明。他设计了一个名为 A.L.I.C.E. (Artificial Linguistics Internet Computer Entity 人工语言网计算机实体) 的机器人,并获得了多项人工智能大奖。有趣的是,图灵测试的其中一项就在寻找这样的人工智能:人与机器人通过文本界面展开数分钟的交流,以此查看机器人是否会被当作人类。

本文就使用了Python语言调用AIML库进行智能机器人的开发。

本系统的运作方式是使用Python搭建服务端后台接口,供各平台可以直接调用。然后客户端进行对智能对话api接口的调用,服务端分析参数数据,进行语句的分析,最终返回应答结果。

当前系统前端使用HTML进行简单地聊天室的设计与编写,使用异步请求的方式渲染数据。

【开发及部署环境】

开发环境:Windows 7 ×64 英文版

 JetBrains PyCharm 2017.1.3 x64

测试环境:Windows 7 ×64 英文版

【所需技术】

1、Python语言的熟练掌握,Python版本2.7

2、Python服务端开发框架tornado的使用

3、aiml库接口的简单使用

4、HTML+CSS+Javascript(jquery)的熟练使用

5、Ajax技术的掌握

【实现过程】

1、安装Python aiml库

pip install aiml

2、获取alice资源

Python aiml安装完成后在Python安装目录下的 Lib/site-packages/aiml下会有alice子目录,将此目录复制到工作区。
或者在Google code上下载alice brain: aiml-en-us-foundation-alice.v1-9.zip

3、Python下加载alice

取得alice资源之后就可以直接利用Python aiml库加载alice brain了:

import aiml
os.chdir('./src/alice') # 将工作区目录切换到刚才复制的alice文件夹
alice = aiml.Kernel()
alice.learn("startup.xml")
alice.respond('LOAD ALICE')

注意加载时需要切换工作目录到alice(刚才复制的文件夹)下。

4、 与alice聊天

加载之后就可以与alice聊天了,每次只需要调用respond接口:

alice.respond('hello') #这里的hello即为发给机器人的信息 

5. 用Tornado搭建聊天机器人网站

Tornado可以很方便地搭建一个web网站的服务端,并且接口风格是Rest风格,可以很方便搭建一个通用的服务端接口。

这里写两个方法:

get:渲染界面

post:获取请求参数,并分析,返回聊天结果

Class类的代码如下:

class ChatHandler(tornado.web.RequestHandler):
 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(alice.respond(message))
  }

  print(str(result))

  respon_json = tornado.escape.json_encode(result)

  self.write(respon_json)

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

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

  self.write(str(result))

6. 简单搭建一个聊天界面

AI人工智能 Python实现人机对话

该界面是基于BootStrap的,我们简单搭建这么一个聊天的界面用于展示我们的接口结果。同时进行简单的聊天。

7. 接口调用

我们异步请求服务端接口,并将结果渲染到界面 

$.ajax({
 type: 'post',
  url: AppDomain+'chat',
  async: true,//异步
  dataType: 'json',
  data: (
  {
  "msg":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));
 }
 });//end Ajax

这里我附上系统的完整目录结构以及完整代码->

8、目录结构

AI人工智能 Python实现人机对话

9、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('./src/alice')
alice = aiml.Kernel()
alice.learn("startup.xml")
alice.respond('LOAD ALICE')


define('port', default=3999, help='run on the given port', type=int)


class Application(tornado.web.Application):
 def __init__(self):
 handlers = [
  (r'/', MainHandler),
  (r'/chat', ChatHandler),
 ]

 settings = dict(
  template_path=os.path.join(os.path.dirname(__file__), 'templates'),
  static_path=os.path.join(os.path.dirname(__file__), 'static'),
  debug=True,
 )

 # conn = pymongo.Connection('localhost', 12345)
 # self.db = conn['demo']
 tornado.web.Application.__init__(self, handlers, **settings)


class MainHandler(tornado.web.RequestHandler):
 def get(self):
 self.render('index.html')

 def post(self):

 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':'qixiao','age':123}")
 self.write(respon_json)


class ChatHandler(tornado.web.RequestHandler):
 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(alice.respond(message))
  }

  print(str(result))

  respon_json = tornado.escape.json_encode(result)

  self.write(respon_json)

 except Exception, 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()

9、Html前端代码

<!DOCTYPE html>
<html>
<head>
 <link rel="icon" href="qixiao.ico" type="image/x-icon"/> 
 <title>qixiao tools</title>
 <link rel="stylesheet" type="text/css" href="../static/css/bootstrap.min.css">

 <script type="text/javascript" src="../static/js/jquery-3.2.0.min.js"></script>
 <script type="text/javascript" src="../static/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">


 </script>
 <script type="text/javascript">
 var AppDomain = 'http://localhost:3999/'
 $(document).ready(function(){
  $("#btn_sub").click(function(){
  var user = 'qixiao(10011)';
  var resUser = 'alice (3333)';

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

  setView(user,request_txt);

  $.ajax({
   type: 'post',
   url: AppDomain+'chat',
   async: true,//异步
   dataType: 'json',
   data: (
   {
   "msg":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));
   }
  });//end Ajax

  
  });

 });
 function setView(user,text)
 {
  var subTxt = user + " "+new Date().toLocaleTimeString() +'\n·'+ 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;">
  <a href="/tools" style="cursor: pointer;">QiXiao - Chat</a>
  </font>
 </header>
 <hr>

 <article class="row">

  <section class="col-md-10 col-md-offset-1" style="border:border:solid #4B5288 1px;padding:0">Admin : QiXiao </section>
  <section class="col-md-10 col-md-offset-1 row" style="border:solid #4B5288 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;" readonly="true" id="txt_view"></textarea>
   </section>
   <section class="row" style="height: 130px;border-top:solid #4B5288 1px; ">
   <textarea class="form-control" style="overflow-y: scroll;overflow-x: none;resize: none;width: 100%;height:70%;border: #fff" id="txt_sub"></textarea>
   <button class="btn btn-primary" style="float: right;margin: 0 5px 0 0" id="btn_sub">Submit</button>
   </section>
  </section>
  <section class="col-md-3" style="height: 400px;border-left: solid #4B5288 1px;"></section>
  </section>
 </article>
 </body>
 </html>

【系统测试】

1、首先我们将我们的服务运行起来

AI人工智能 Python实现人机对话

2、调用测试

然后我们进行前台界面的调用

AI人工智能 Python实现人机对话

AI人工智能 Python实现人机对话

这里我们可以看到,我们的项目完美运行,并且达到预期效果。

【可能遇到问题】

中文乱码

【系统展望】

经过测试,中文目前不能进行对话,只能使用英文进行对话操作,有待改善。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 多进程通信模块的简单实现
Feb 20 Python
python实现的文件夹清理程序分享
Nov 22 Python
详解Python中find()方法的使用
May 18 Python
在Django的URLconf中使用多个视图前缀的方法
Jul 18 Python
详解Django框架中用户的登录和退出的实现
Jul 23 Python
Windows下Anaconda2安装NLTK教程
Sep 19 Python
django开发post接口简单案例,获取参数值的方法
Dec 11 Python
Python 保存矩阵为Excel的实现方法
Jan 28 Python
Pandas分组与排序的实现
Jul 23 Python
TFRecord文件查看包含的所有Features代码
Feb 17 Python
matplotlib对象拾取事件处理的实现
Jan 14 Python
Python绘画好看的星空图
Mar 17 Python
Python编程实现蚁群算法详解
Nov 13 #Python
Python编程实现粒子群算法(PSO)详解
Nov 13 #Python
人工智能最火编程语言 Python大战Java!
Nov 13 #Python
Python随机生成均匀分布在单位圆内的点代码示例
Nov 13 #Python
python、java等哪一门编程语言适合人工智能?
Nov 13 #Python
K-means聚类算法介绍与利用python实现的代码示例
Nov 13 #Python
python通过opencv实现批量剪切图片
Nov 13 #Python
You might like
PHP 图像尺寸调整代码
2010/05/26 PHP
基于PHP实现商品成交时发送短信功能
2016/05/11 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
PHP中isset、empty的用法与区别示例详解
2020/11/05 PHP
javascript下过滤数组重复值的代码
2007/09/10 Javascript
JS 自定义带默认值的函数
2011/07/21 Javascript
基于jQuery实现的水平和垂直居中的div窗口
2011/08/08 Javascript
JS 添加千分位与去掉千分位的示例
2013/07/11 Javascript
Javascript setInterval的两种调用方法(实例讲解)
2013/11/29 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
2014/05/04 Javascript
JSON+HTML实现国家省市联动选择效果
2014/05/18 Javascript
浅析基于WEB前端页面的页面内容搜索的实现思路
2014/06/10 Javascript
Javascript实现的SHA-256加密算法完整实例
2016/02/02 Javascript
Javascript中级语法快速入手
2016/07/30 Javascript
Bootstrap如何创建表单
2016/10/21 Javascript
jquery mobile移动端幻灯片滑动切换效果
2020/04/15 Javascript
vue-cli+webpack记事本项目创建
2017/04/01 Javascript
深入理解与使用keep-alive(配合router-view缓存整个路由页面)
2018/09/25 Javascript
JavaScript 几种循环方式以及模块化的总结
2020/09/03 Javascript
解决iView Table组件宽度只变大不变小的问题
2020/11/13 Javascript
Python如何抓取天猫商品详细信息及交易记录
2018/02/23 Python
python实现两张图片的像素融合
2019/02/23 Python
Python如何使用PIL Image制作GIF图片
2020/05/16 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
2020/08/17 Python
详解Python yaml模块
2020/09/23 Python
利用python进行文件操作
2020/12/04 Python
新加坡最受追捧的体验平台:Hapz
2018/01/01 全球购物
prAna官网:瑜伽、旅行和冒险服装
2019/03/10 全球购物
Java面试题:Java类的Main方法如果是Private将会怎么样
2016/08/18 面试题
2014年护士长工作总结
2014/11/11 职场文书
2014年社团工作总结范文
2014/11/27 职场文书
工程技术员岗位职责
2015/04/11 职场文书
会计稽核岗位职责
2015/04/13 职场文书
用python删除文件夹中的重复图片(图片去重)
2021/05/12 Python
教你如何使用Python Tkinter库制作记事本
2021/06/10 Python
码云(gitee)通过git自动同步到阿里云服务器
2022/12/24 Servers