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实现ftp客户端示例分享
Feb 17 Python
Python实现的快速排序算法详解
Aug 01 Python
Python3随机漫步生成数据并绘制
Aug 27 Python
Python实现查找字符串数组最长公共前缀示例
Mar 27 Python
python导入坐标点的具体操作
May 10 Python
python调用webservice接口的实现
Jul 12 Python
详解解决Python memory error的问题(四种解决方案)
Aug 08 Python
face++与python实现人脸识别签到(考勤)功能
Aug 28 Python
Python MySQL 日期时间格式化作为参数的操作
Mar 02 Python
基于Python共轭梯度法与最速下降法之间的对比
Apr 02 Python
详解Python中import机制
Sep 11 Python
Python Pygame实现俄罗斯方块
Feb 19 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 进程锁定问题分析研究
2009/11/24 PHP
整理的9个实用的PHP库简介和下载
2010/11/09 PHP
PHP的curl实现get,post和cookie(实例介绍)
2013/06/17 PHP
PHP中绘制图像的一些函数总结
2014/11/19 PHP
php使用sql server验证连接数据库的方法
2014/12/25 PHP
php实现httpRequest的方法
2015/03/13 PHP
PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】
2019/11/04 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
PHP如何使用array_unshift()在数组开头插入元素
2020/09/01 PHP
为调试JavaScript添加输出窗口的代码
2010/02/07 Javascript
jqPlot 基于jquery的画图插件
2011/04/26 Javascript
一个JS的日期格式化算法示例
2013/07/31 Javascript
jQuery教程 $()包装函数来实现数组元素分页效果
2013/08/13 Javascript
JS取request值以及自动执行使用示例
2014/02/24 Javascript
js 获取页面高度和宽度兼容 ie firefox chrome等
2014/05/14 Javascript
js获取json元素数量的方法
2015/01/27 Javascript
Bootstrap选项卡与Masonry插件的完美结合
2016/07/06 Javascript
jQuery fadeOut 异步实例代码详解
2016/08/18 Javascript
JS条形码(一维码)插件JsBarcode用法详解【编码类型、参数、属性】
2017/04/19 Javascript
Angular.js实现动态加载组件详解
2017/05/28 Javascript
简谈创建React Component的几种方式
2019/06/15 Javascript
Vue CLI项目 axios模块前后端交互的使用(类似ajax提交)
2019/09/01 Javascript
layui表格内容溢出的解决方法
2019/09/06 Javascript
微信小程序实现注册登录功能(表单校验、错误提示)
2019/12/10 Javascript
js实现计时器秒表功能
2019/12/16 Javascript
Element InputNumber 计数器的实现示例
2020/08/03 Javascript
[02:28]DOTA2 2017国际邀请赛小组赛回顾
2017/08/09 DOTA
Python Tkinter基础控件用法
2014/09/03 Python
下载官网python并安装的步骤详解
2019/10/12 Python
Django model重写save方法及update踩坑详解
2020/07/27 Python
意大利男装网店:Vrients
2019/05/02 全球购物
sort命令的作用和用法
2012/11/04 面试题
网站开发实习生的自我评价
2013/12/11 职场文书
党旗在我心中演讲稿
2014/09/15 职场文书
个人授权委托书范本格式
2014/10/12 职场文书
继承公证书格式
2015/01/26 职场文书