机器人之人工智能初体验(二):开发简单的图灵智能聊天工具
小标 2018-09-28 来源 : 阅读 914 评论 0

摘要:本文主要向大家介绍机器人之人工智能初体验(二):开发简单的图灵智能聊天工具了,通过具体的内容向大家展现,希望对大家学习机器人有所帮助。

本文主要向大家介绍机器人之人工智能初体验(二):开发简单的图灵智能聊天工具了,通过具体的内容向大家展现,希望对大家学习机器人有所帮助。

前言:这里为了有更好的个性化设置,因此我选择了图灵机器人(//www.tuling123.com/)的接口,使用方法跟上一篇中使用百度的接口是差不多的。注:文末有打包好的小软件和完整源代码的下载链接一 API Key申请申请地址://www.tuling123.com/中间的注册登录过程不说,最后把API Key值记录下来二 核心功能开发这个小项目的目录结构:核心功能文件TuringRobot.java,代码很简单,一看就明白,代码如下:package action;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TuringRobot {
 /**
  * 使用图灵机器人接口获取回答
  * 
  * @param apikey API认证
  * @param info 想要请求的问题
  * @return 获取的回复
  * */
 public static String getResponse(String apikey,String info){
  String httpUrl;
  try {
   httpUrl = "//www.tuling123.com/openapi/api?key=" + apikey + "&info=" + URLEncoder.encode(info,"UTF-8");
   URL url = new URL(httpUrl);
   HttpURLConnection connection = (HttpURLConnection) url.openConnection();
   connection.setRequestMethod("GET");
   connection.setReadTimeout(5000);
   connection.setConnectTimeout(5000);
   
   InputStream inputStream = connection.getInputStream();
   BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
   String line = "";
   String reg = "\"text\":\"(.*)?\"}";
   Pattern pattern = Pattern.compile(reg);
   Matcher matcher;
   while((line = reader.readLine()) != null){
    matcher = pattern.matcher(line);
    if(matcher.find()){
     connection.disconnect();
     return matcher.group(1);
    }
   }
   connection.disconnect(); 
  } catch (UnsupportedEncodingException e1) {
   e1.printStackTrace();
  } catch (MalformedURLException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  return "";
 }
 
 /**
  * 使用百度接口获取回答
  * 
  * @param key 默认值:879a6cb3afb84dbf4fc84a1df2ab7319
  * @param ApiKey 在APIStore调用服务所需要的API密钥,申请地址://apistore.baidu.com
  * @param info 想要请求的问题
  * @param userid 用户id 默认值:eb2edb736
  * 
  * @return 获取的回复
  * */
 public static String getResponse(String key,String ApiKey,String info,String userid){
  String httpUrl = "//apis.baidu.com/turing/turing/turing?";
  try {
   info = URLEncoder.encode(info,"UTF-8");  
  } catch (UnsupportedEncodingException e1) {
   e1.printStackTrace();
  }
  String httpArg = "key=" + key + "&info=" + info + "&userid=" + userid;
  try {
   URL url = new URL(httpUrl + httpArg);
   HttpURLConnection connection = (HttpURLConnection) url.openConnection();
   connection.setRequestMethod("GET");
   connection.setRequestProperty("apikey", ApiKey);
   
   InputStream inputStream = connection.getInputStream();
   BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
   String line = "";
   String reg = "\"text\":\"(.*)?\",\"code\"";
   Pattern pattern = Pattern.compile(reg);
   Matcher matcher;
   while((line = reader.readLine()) != null){
    matcher = pattern.matcher(line);
    if(matcher.find()){
     connection.disconnect();
     return matcher.group(1);
    }
   } 
   connection.disconnect();
  } catch (MalformedURLException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  return "";
  
 }

}三 前台界面开发在界面开发中有几个关键点需要注意:(1)使用了新的线程来执行数据获取过程,并且通过SwingUtilities.invokeLater()来通知EDT更新界面。具体技术可以参考我写的这篇文章://www.zifangsky.cn/2015/12/java中事件分发线程(edt)与swingutilities-invokelater相关总结/(2)本来最开始是使用了JTextArea来显示聊天记录,后来发现不能对聊天双方的记录分别左对齐和右对齐,而且也不能对聊天记录中的文字颜色和字体进行个性化设置,因此后来将聊天界面的JTextArea改成了JTextPane。这是一个强大的控件,我这里仅仅只是进行了简单使用,看代码就明白了(3)API Key保存在配置文件config/config.txt中了界面代码如下:package view;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;

import action.TuringRobot;

public class MainView extends JFrame implements ActionListener, WindowListener, KeyListener{
 /**
  * @author zifangsky
  * @blog www.zifangsky.cn
  * @date 2015-12-21
  * @version v1.0.0
  * 
  * */
 private static final long serialVersionUID = 1L;
 private JPanel mainJPanel,tipJPanel;
 private JScrollPane message_JScrollPane,edit_JScrollPane;
 private JTextArea edit_JTextArea;
 private JButton close,submit;
 private JTextPane messageJTextPane;
 private DefaultStyledDocument doc;
 
 private JMenuBar jMenuBar;
 private JMenu help;
 private JMenuItem author,contact,version,readme;

 private Font contentFont = new Font("宋体", Font.LAYOUT_NO_LIMIT_CONTEXT, 16);  //正文字体
 private Font menuFont = new Font("宋体", Font.LAYOUT_NO_LIMIT_CONTEXT, 14);  //菜单字体
 private Color buttonColor = new Color(85,76,177);  //按钮背景色
 Color inputColor1 = new Color(31,157,255);  //输入相关颜色
 Color inputColor2 = new Color(51,51,51);  //输入相关颜色
 Color outputColor1 = new Color(0,186,4);  //返回相关颜色
 Color outputColor2 = new Color(51,51,51);  //返回相关颜色
 

 private DataOperating dataOperating = null;  //数据操作线程
 private Runnable updateInputInterface,updateResponseInterface;  //更新界面线程
 
 private String inputString = "",responseString = ""; 
 private String key = "";  
 
 public MainView(){
  super("图灵智能聊天");
  Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
  screenSize = Toolkit.getDefaultToolkit().getScreenSize();  //屏幕大小
  setPreferredSize(new Dimension(350, 600));
  int frameWidth = this.getPreferredSize().width;  //界面宽度
  int frameHeight = this.getPreferredSize().height;  //界面高度
  setSize(frameWidth,frameHeight);
  setLocation((screenSize.width - frameWidth) / 2,(screenSize.height - frameHeight) / 2);
  //初始化
  mainJPanel = new JPanel();
  tipJPanel = new JPanel();
  message_JScrollPane = new JScrollPane();
  edit_JScrollPane = new JScrollPane();
  messageJTextPane = new JTextPane();
  doc = new DefaultStyledDocument();
  edit_JTextArea = new JTextArea(5, 10);
  close = new JButton("关闭");
  submit = new JButton("发送");  
  jMenuBar = new JMenuBar();
  help = new JMenu("帮助");
  author = new JMenuItem("作者");
  contact = new JMenuItem("联系方式");
  version = new JMenuItem("版本");
  readme = new JMenuItem("说明");
  
  //设置字体
  messageJTextPane.setFont(contentFont);
  edit_JTextArea.setFont(contentFont);
  close.setFont(contentFont);
  submit.setFont(contentFont);
  help.setFont(menuFont);
  author.setFont(menuFont);
  contact.setFont(menuFont);
  version.setFont(menuFont);
  readme.setFont(menuFont);
  //布局
  mainJPanel.setLayout(new BorderLayout());
  mainJPanel.add(message_JScrollPane,BorderLayout.NORTH);
  mainJPanel.add(edit_JScrollPane,BorderLayout.CENTER);
  mainJPanel.add(tipJPanel,BorderLayout.SOUTH);
  messageJTextPane.setPreferredSize(new Dimension(350, 350));
  messageJTextPane.setBackground(new Color(204,232,207));
  message_JScrollPane.getViewport().add(messageJTextPane);
  edit_JScrollPane.getViewport().add(edit_JTextArea);
  edit_JTextArea.setBackground(new Color(204,232,207));
  edit_JTextArea.requestFocus();
  tipJPanel.setLayout(new FlowLayout(FlowLayout.RIGHT, 10, 10));
  tipJPanel.add(close);
  tipJPanel.add(submit);
  close.setBackground(buttonColor);
  close.setForeground(Color.WHITE);
  submit.setBackground(buttonColor);
  submit.setForeground(Color.WHITE);
  
  messageJTextPane.setEditable(false);
  edit_JTextArea.setLineWrap(true);
  edit_JTextArea.setWrapStyleWord(true);
  
  jMenuBar.add(help);
  help.add(author);
  help.add(contact);
  help.add(version);
  help.add(readme);

  add(mainJPanel);
  setJMenuBar(jMenuBar);
  setVisible(true);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  addWindowListener(this);
  //获取配置文件中的配置信息
  try {
   BufferedReader reader = new BufferedReader(new FileReader(new File("config/config.txt")));
   String line = reader.readLine();  //第一行不要
   Pattern pattern = Pattern.compile("key=(.*)?");
   Matcher matcher;
   while((line = reader.readLine()) != null){
    matcher = pattern.matcher(line);
    if(matcher.find())
     key = matcher.group(1);
    break; 
   } 
   reader.close();
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  
  //点击事件
  close.addActionListener(this);
  submit.addActionListener(this);
  author.addActionListener(this);
  contact.addActionListener(this);
  version.addActionListener(this);
  readme.addActionListener(this);
  //键盘时间
  edit_JTextArea.addKeyListener(this);
  //输入对话,提交后触发,更新界面
  updateInputInterface = new Runnable() {
   public void run() {
    messageJTextPane.setEditable(true);
    
    setInputString("我[" + getDateString() + "]:", inputColor1, true, contentFont);
    setInputString(inputString + "\n", inputColor2, false, menuFont);
    messageJTextPane.selectAll();
    messageJTextPane.setCaretPosition(messageJTextPane.getSelectionEnd());
    messageJTextPane.setEditable(false);
   }
  };
  //获取到回答后触发,更新界面
  updateResponseInterface = new Runnable() {
   public void run() {
    messageJTextPane.setEditable(true);

    setResponseString("智子[" + getDateString() + "]:", outputColor1, true, contentFont);
    setResponseString(responseString + "\n", outputColor2, false, menuFont);
    messageJTextPane.selectAll();
    messageJTextPane.setCaretPosition(messageJTextPane.getSelectionEnd());
    messageJTextPane.setEditable(false);
    
    inputString = "";
    responseString = "";
    edit_JTextArea.setText("");
    edit_JTextArea.requestFocus();
    dataOperating = null;
   }
  };
 }
 
 
 public static void main(String[] args) {
  SwingUtilities.invokeLater(new Runnable() {
   public void run() {
    new MainView();
   }
  });
 }

 /**
  * 输入的信息在界面显示出来
  * */
 private void setInputString(String str,Color color,boolean bold,Font font){
  MutableAttributeSet attributeSet = new SimpleAttributeSet();
  StyleConstants.setForeground(attributeSet, color);  //设置文字颜色
  if(bold)
   StyleConstants.setBold(attributeSet, true);  //设置加粗
  StyleConstants.setFontFamily(attributeSet, "Consolas");  //设置字体
  StyleConstants.setFontSize(attributeSet, font.getSize());  //设置字体大小
  StyleConstants.setAlignment(attributeSet, StyleConstants.ALIGN_RIGHT);  //左对齐
  insertText(str,attributeSet);
 }
 /**
  * 返回的信息在界面显示出来
  * */
 private void setResponseString(String str,Color color,boolean bold,Font font){
  MutableAttributeSet attributeSet = new SimpleAttributeSet();
  StyleConstants.setForeground(attributeSet, color);
  if(bold)
   StyleConstants.setBold(attributeSet, true);
  StyleConstants.setFontFamily(attributeSet, "Consolas");
  StyleConstants.setFontSize(attributeSet, font.getSize());
  StyleConstants.setAlignment(attributeSet, StyleConstants.ALIGN_LEFT);
  insertText(str,attributeSet);
 }

 /**
  * 在JTextPane中插入文字
  * */
 private void insertText(String str, MutableAttributeSet attributeSet) {
  messageJTextPane.setStyledDocument(doc);
  str += "\n";
  doc.setParagraphAttributes(doc.getLength(), str.length(), attributeSet, false);
  try {
   doc.insertString(doc.getLength(), str, attributeSet);
  } catch (BadLocationException e) {
   e.printStackTrace();
  }
 }

 /**
  * 点击事件
  * */
 public void actionPerformed(ActionEvent e) {
  if(e.getSource() == close){
   System.exit(0);
  }
  else if(e.getSource() == submit){
   if(dataOperating == null){
    dataOperating = new DataOperating();
    new Thread(dataOperating).start();
   }
  }
  else if(e.getSource() == author){
   JOptionPane.showMessageDialog(this, "zifangsky","作者:",JOptionPane.INFORMATION_MESSAGE);
  }
  else if(e.getSource() == contact){
   JOptionPane.showMessageDialog(this, "邮箱:admin@zifangsky.cn\n" +
     "博客:www.zifangsky.cn","联系方式:",JOptionPane.INFORMATION_MESSAGE);
  }
  else if(e.getSource() == version){
   JOptionPane.showMessageDialog(this, "v1.0.0","版本号:",JOptionPane.INFORMATION_MESSAGE);
  }
  else if(e.getSource() == readme){
   JOptionPane.showMessageDialog(this, "本程序只是简单的智能聊天,没有多余的功能。源码已经在我博客进行开源,\n" +
     "有需求的可以在此基础上进行APP开发,移植到Android平台上去。","说明:",JOptionPane.INFORMATION_MESSAGE);
  }
  
 }
 
 /**
  * 具体的数据处理内部类
  * */
 private class DataOperating implements Runnable{
  public void run() {
   //获取输入
   inputString = edit_JTextArea.getText().trim();
   if(inputString == null || "".equals(inputString))
    return;
   SwingUtilities.invokeLater(updateInputInterface);
   //获取回复
   responseString = TuringRobot.getResponse(key, inputString);
   SwingUtilities.invokeLater(updateResponseInterface);
  }
  
 }
 
 /**
  * 获取当前时间的字符串
  * @return 当前时间的字符串
  * */
 private String getDateString(){
  Date date = new Date();
  Format format = new SimpleDateFormat("HH:mm:ss");
  return format.format(date);    
 }

 public void windowOpened(WindowEvent e) {
  
 }

 public void windowClosing(WindowEvent e) {
  System.exit(0);
 }

 public void windowClosed(WindowEvent e) {

 }

 public void windowIconified(WindowEvent e) {

 }

 public void windowDeiconified(WindowEvent e) {

 }

 public void windowActivated(WindowEvent e) {
  
 }

 public void windowDeactivated(WindowEvent e) {
  
 }

 public void keyTyped(KeyEvent e) {
  
 }
 /**
  * 键盘事件,键盘按下ENTER键触发
  * */
 public void keyPressed(KeyEvent e) {
  if(e.getKeyCode() == KeyEvent.VK_ENTER){
   if(dataOperating == null){
    dataOperating = new DataOperating();
    new Thread(dataOperating).start();
   }
  }
  
 }

 public void keyReleased(KeyEvent e) {
  
 }

}

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标人工智能智能机器人频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程