做项目的时候,尤其是java开发时,经常会遇到调用python算法的情况,本人最近在项目中遇到这样一个问题:网页前端设计了一个与用户聊天的对话窗口(类似qq聊天),主要目的是为用户解答一些常见的问题。我想了一下需要一些自然语言处理的技术,包括问题与答案的分词词性标注与向量化表示等内容。python来设计的话,非常方便,有很多支持机器学习及自然语言处理的工具包。这里就不详细的介绍这个算法流程了。一般这种项目叫做智能问答系统,后续统一称呼。

调用python时,遇到了大量的坑。这里主要做一些总结:

(1)JPython jar包方法。可以在java类中直接执行python语句。这种方法看起来很简单,但问题也会很大不支持import外部包。只有一些简单的python语句才会比较顺利的被调用和执行。so pass!

(2) 使用Runtime.getRuntime()执行脚本文件。这里展示一个自己实测能行的例子:

java代码:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;public class TestThree {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("java控制台输入问题:");String instr = scanner.next();//定义个获取结果的变量String result="";try {//调用python,其中字符串数组对应的是python,python文件路径,向python传递的参数String[] strs=new String[] {"python","E:\\Pythonfile\\FAQrobot.py",instr};//Runtime类封装了运行时的环境。每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。//一般不能实例化一个Runtime对象,应用程序也不能创建自己的 Runtime 类实例,但可以通过 getRuntime 方法获取当前Runtime运行时对象的引用。// exec(String[] cmdarray) 在单独的进程中执行指定命令和变量。 Process pr = Runtime.getRuntime().exec(strs);//使用缓冲流接受程序返回的结果BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream(),"GBK"));//注意格式//定义一个接受python程序处理的返回结果String line=" ";while((line=in.readLine())!=null) {//循环打印出运行的结果result+=line+"\n";}//关闭in资源in.close();pr.waitFor();}catch (Exception e) {e.printStackTrace();}System.out.println("\npython传来的结果:");//打印返回结果System.out.println(result);}}p

python部分:

import sys
import jieba#定义个函数式用于分词
def jiebaclearText(text):#定义一个空的列表,将去除的停用词的分词保存mywordList=[]#进行分词seg_list=jieba.cut(text,cut_all=False)#将一个generator的内容用/连接listStr='/'.join(seg_list)#对默认模式分词的进行遍历,去除停用词for myword in listStr.split('/'):mywordList.append(myword)return '/ '.join(mywordList)if __name__=="__main__":text=sys.argv[1]#获取系统传来的参数text1=jiebaclearText(text)print(text1)

该例子实现了java控制台输入文本句子,python算法接收传入并进行分词,返回给java控制器。此处python算法调用外部jieba中文处理工具。

(3)标准输入输出来调用python。这种方法是之前在做C# Windows Form程序时调用python的方法。就是开一个cmd 黑框来执行python算法。当时是那么做的,现在把这方法拿过来试了一下也可以用。具体情况可以搜索一下java cmd命令。下面是一个demo。

java部分:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;public class Main {public static void main(String args[]) throws InterruptedException {Runtime runtime = Runtime.getRuntime();String classPath=Main.class.getResource("").getPath().substring(1);try {Process cmd = runtime.exec("python "+classPath+"temp.py");BufferedWriter cmdInstream = new BufferedWriter(new OutputStreamWriter(cmd.getOutputStream(),"GBK"));BufferedReader cmdShowStream = new BufferedReader(new InputStreamReader(cmd.getInputStream(), "GBK"));BufferedReader cmdErrStream=new BufferedReader(new InputStreamReader(cmd.getErrorStream(),"GBK"));Scanner scanner = new Scanner(System.in);String instr = scanner.next();cmdInstream.write(instr+"aaaa\n");cmdInstream.flush();    String cmdOutStr;Thread.sleep(100);while(cmdShowStream.ready()){ System.out.println(cmdShowStream.readLine());              }while ((cmdOutStr = cmdErrStream.readLine()) != null) {System.out.println(cmdOutStr);                }//         String cmdOutStr = cmdShowStream.readLine();
//          System.out.println(cmdOutStr);cmdInstream.write("exit\n");cmdInstream.flush();scanner.close();} catch (IOException e) {e.printStackTrace();}}
}

python部分:

import sys
while True:str = input("");if str=='exit':sys.exit()else:print("你输入了:",str)

这个demo实现了java控制台通过scanner输入到python,处理返回的过程。实测过程中坑还是比较多的。基本原理就是java与控制台交互,输入命令和读入cmd的输出信息(包括报错信息)。cmd方法需要注意的是,你要提前安好python配好环境变量,确保python在cmd中可执行。

java调用python算法相关推荐

  1. Spark Scala/Java调用Python算法文件

    1.Windows本地调用 1.1python算法库环境安装 python算法中会调用许多额外的其它第三方库,使用pip install xxx安装时会经常因为一些原因(如网络延迟)导致安装失败,这时 ...

  2. 如何在Java程序中调用Python算法脚本,重点讲Demo,不墨迹理论

    原创博文,欢迎转载,转载时请务必附上博文链接,感谢您的尊重. 前言 通过本篇,你将初步认识在Java程序中简单调用.py脚本文件的方法,附带入门的Demo实例讲解,更深入的理解还需要进一步学习. 最近 ...

  3. .net core 引用jar_Python一键转Jar包,Java调用Python新姿势!

    粉丝朋友们,不知道大家看故事看腻了没(要是没腻可一定留言告诉我^_^),今天这篇文章换换口味,正经的来写写技术文.言归正传,咱们开始吧! 今天的这篇文章,聊一个轩辕君之前工作中遇到的需求:如何在Jav ...

  4. Java 调用 Python 方法学习笔记

    文章转载自: 作者:IT_xiao_bai                         来源:CSDN                         原文:https://blog.csdn.n ...

  5. python文件转换成jar包_Python一键转Jar包,Java调用Python新姿势!

    粉丝朋友们,不知道大家看故事看腻了没(要是没腻可一定留言告诉我^_^),今天这篇文章换换口味,正经的来写写技术文.言归正传,咱们开始吧! 今天的这篇文章,聊一个轩辕君之前工作中遇到的需求:如何在Jav ...

  6. java调用python文件的几种方式【超细讲解!】

    java调用python的契机来自于一个项目需要用到算法,但是算法工程师们写的python,于是就有了java后端调用python脚本的需求,中间遇到了许多问题,特此记录整理了一次. 1.java调用 ...

  7. Java调用python脚本

    Java调用python脚本 最近也是刚开始学python,所以这里写了一个简单的小方法用Java来调用python脚本.后期再进行更新. 1.Java启动程序的方法 在Java中提供了两种方法来启动 ...

  8. Java调用Python遇到的一系列问题与解决方案

    Java调用Python遇到的一系列问题与解决方案 参考文章: (1)Java调用Python遇到的一系列问题与解决方案 (2)https://www.cnblogs.com/CQUTWH/p/593 ...

  9. java和python可以在一个项目中同时使用么-java调用python的几种用法(看这篇就够了)...

    java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐 ...

最新文章

  1. MySQL基础:数据类型
  2. C/C++从源代码到生成可执行程序的过程详解!
  3. Linux编辑器vi使用方法详细介绍
  4. python sizeof函数_C++ sizeof 运算符 | 菜鸟教程
  5. 谈谈对搜索技术Elastic SearchLucene的理解
  6. DL之FastR-CNN:Fast R-CNN算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  7. [MEGA DEAL]完整的Java编程训练营(94%折扣)
  8. nginx文件系统大小_Nginx 了解一下?
  9. Java游戏有易筋经_易筋经- JavaWeb-1
  10. http协议中的响应代码从 1xx ~ 5xx,一共有41种
  11. 怎样才能办理信用卡成功?
  12. 每天一个linux命令(55)--at命令
  13. poj1113 凸包
  14. Atitit.mysql 5.0 5.5  5.6 5.7  新特性 新功能
  15. top res mysql_Java应用Top命令RES内存占用高分析
  16. 局域网部署文档协同办公系统:Windows + onlyoffice + dzzoffice
  17. keil5 下载器配置
  18. 计算机硬件系统实验教程代码,计算机硬件系统实验教程
  19. pip安装第三方库 报错:You should consider upgrading
  20. 交互设计|抖音为什么是上滑查看下一个视频

热门文章

  1. 自主式模块化无人机设计
  2. ResultType和ResultMap的区别
  3. 金山毒霸占用80端口
  4. IPVS(LVS)负载均衡简介及实验测试
  5. mpvue 注意事项
  6. R-CNN网络结构详解
  7. @JsonIgnore
  8. 机器学习入门 —— 超级详细的KNN算法学习笔记、KNN算法的三要素、KNN算法的优缺点
  9. iOS 打包,及企业账号的使用
  10. win10资源管理器右键没有映射网络驱动器