背景
有些时候,项目中已经有现场功能的包,但是相关的包使用Java开发的。为了能够减少Java转Python的时间,我们可以选择用Python调用Java。
Python是比较著名的胶水语言,他的特性就这么地显现出来了。本文就以Java使用Jieba分词构建一个jar包,供Python调用来做一个demo。
当然为了能够使用Python调用Jar当然少不了这个“胶水”,本文使用的是Jpype。Github地址:https://github.com/jpype-project/jpype。安装方式:pip install jpype1
.
除此之外,因为需要运行jar包,当然我们运行环境中是需要有Java运行环境的。
Java
程序书写
为了从0开始,这里书写一个java程序如下:
package com.aiasbcyd;
import com.huaban.analysis.jieba.JiebaSegmenter;
import java.util.ArrayList;
import java.util.List;
public class jiebaSeg {
private static JiebaSegmenter segmenter = new JiebaSegmenter();
public static List<List<String>> seg(List<String> sentences){
List<List<String>> result = new ArrayList<>();
for (String sentence : sentences) {
List<String> strings = segmenter.sentenceProcess(sentence);
result.add(strings);
}
return result;
}
public static void main(String[] args) {
String test = "自然语言处理爱好者用NLP技术改变未来";
List<String> inputStrings = new ArrayList<>();
inputStrings.add(test);
List<List<String>> lists = jiebaSeg.seg(inputStrings);
System.out.println(lists);
}
}
该Java程序是一个maven项目,引用了jieba对应的包,如下:
<dependencies>
<!-- https://mvnrepository.com/artifact/com.huaban/jieba-analysis -->
<dependency>
<groupId>com.huaban</groupId>
<artifactId>jieba-analysis</artifactId>
<version>1.0.2</version>
</dependency>
</dependencies>
打包
程序书写调试完之后就是将其打包,打的包就是python要调用的jar包了,所以此时还需要将其以来全部打进来,具体操作如不,
先做以下配置:
然后就是ok,apply了。然后就是打包了,
然后得到的jar包就供Python调用了。
有了jar包之后就是准备中使用Python进行调用了。
python
在安装jpype
包后,使用如下代码就可以进行调用了。不过更多的操作需要查看jpype官方文档了。
import os
import jpype
from jpype.types import *
class SDKUse(object):
def __init__(self, jar_path="./jar/jiebaSeg.jar"):
if not os.path.exists(jar_path):
raise FileNotFoundError
self.jar_path = jar_path
self._prepare_env()
self.main_class = jpype.JClass("com.aiasbcyd.jiebaSeg")
def _prepare_env(self):
jpype.startJVM(classpath=[self.jar_path], convertStrings=False)
def seg(self, content):
j_list = jpype.java.util.ArrayList()
j_list.append(JString(content))
res = self.main_class.seg(j_list)
print(res)
if __name__ == '__main__':
sdk_use = SDKUse()
sdk_use.seg("自然语言处理爱好者用NLP技术改变未来")
程序运行结果如下:
总结
跨语言调用还是挺有意思的,主要是有前人把包写好了。当然,由于Java是强类型语言,在python中需要根据接口需要的参数类型传入。