Skip to content

Latest commit

 

History

History
 
 

java

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 

LAC的Java调用

JAVA的接口是通过jni的形式调用C++的接口,除了我们预先提供的模型之外,还可直接调用Python进行增量训练后保存的模型。因为使用的是C++的接口的jni调用,故而在使用前需要准备Paddle依赖库,并产出lacjni的动态库

代码示例

// 选择不同的模型进行装载
LAC lac = new LAC("lac_model");

// 可选,装载干预词典
lac.loadCustomization("custom.txt")

// 声明返回结果的变量
ArrayList<String> words = new ArrayList<>();
ArrayList<String> tags = new ArrayList<>();

// 执行并返回结果
lac.run("百度是一家高科技公司", words, tags);
System.out.println(words);
System.out.println(tags);

编译与运行

1. 依赖库准备

LAC是基于Paddle训练所得的模型,需依赖Paddle的预测库,可通过下载预编译好的库或进行源码编译两种形式获取

直接下载
  • Windows:可于Paddle官网下载已经编译好的Windows预测库fluid_inference.tgz),选择合适版本进行下载并解压

  • Linux:可于Paddle官网下载已经编译好的Linux预测库fluid_inference.tgz),选择合适版本进行下载并解压

  • MacOS: 可于release界面下载已经编译好的Mac预测库(paddle_library_mac.zip),下载并解压

    因官网未提供预编译好的MacOS预测库,为了方便开发者使用,我们自行编译并上传该库。如有需要亦可参考源码编译的内容进行自行编译。

源码编译

对于上述预编译库无法适配的系统,可基于源码进行编译。

下面提供了编译预测库的脚本,需要安装cmake,并修改脚本中的PADDLE_ROOT变量为保存路径后可直接运行。如果有什么问题,可参照Paddle官网中关于此部分内容的介绍。

# 下载源码
git clone https://github.com/PaddlePaddle/Paddle.git

# 选择其中一个稳定的分支
cd Paddle
git checkout v1.6.2

# 创建并进入build目录
mkdir build
cd build

# 编译结果保存路径,需要需改
PADDLE_ROOT=/path/of/paddle

# 编译运行
cmake -DFLUID_INFERENCE_INSTALL_DIR=$PADDLE_ROOT \
      -DCMAKE_BUILD_TYPE=Release \
      -DWITH_PYTHON=OFF \
      -DWITH_MKL=OFF \
      -DWITH_GPU=OFF  \
      -DON_INFER=ON \
      ../
      
 make
 make inference_lib_dist

2. jni编译,生成Java调用包

此处介绍主要面向Mac和Linux用户,Windows系统下的编译依赖于Visual Studio【大于或等于2015版本】,可参考Windows编译文档进行编译,我们也在release中提供了一个基于mkldnn编译好的库lac4javawin.zip,以便大家使用。

我们编写了jni调用c++库的接口,需要先编译生成Java可直接调用的包,通过cmake去完成该过程。安装cmake后,修改下列脚本中PADDLE_ROOT变量和JAVA_HMOE变量后,直接运行即可完成该过程:

  • PADDLE_ROOT1.依赖库准备中得到的依赖库文件夹的路径
  • JAVA_HMOE为JAVA安装所在路径,该目录中应有include/jni.h文件
# 代码下载
git clone https://github.com/baidu/lac.git
cd lac

# /path/to/paddle是第1步中获取的Paddle依赖库路径
# 即下载解压后的文件夹路径或编译产出的文件夹路径
PADDLE_ROOT=/path/of/paddle

# JAVA的HOME目录,应存在文件${JAVA_HOME}/include/jni.h
JAVA_HOME=/path/of/java

# 编译
mkdir build 
cd build
cmake -DPADDLE_ROOT=$PADDLE_ROOT \
      -DJAVA_HOME=$JAVA_HOME \
      -DWITH_JNILIB=ON \
      -DWITH_DEMO=OFF \
      ../

make install # 编译产出在 ../output/java 下

3. 运行测试

执行完上述编译后,我们可以在output/java目录下查看到com.baidu.nlp的Java库以及单线程调用示例LacDemo.java及多线程调用示例LacMulti.java,我们可以直接运行这两个示例进行调用测试

  • 下载模型文件:

    release界面下载模型文件models_general.zip,解压文件夹中包含两个模型

    • seg_model:仅实现分词的模型
    • lac_model:实现分词、词性标注、实体识别于一体的词法分析模型
  • 运行Java的demo:

# 运行单线程测试
javac LacDemo.java
java LacDemo <model_dir>

# 运行多线程测试
javac LacMulti.java
java LacMulti <model_dir> <thread_num>
# model_dir: 模型文件路径,即上述下载解压后的路径,如 "./models_general/lac_model"

程序从标准输入逐行读取句子,然后给出句子的分析结果。

示例输入: 百度是一家高科技公司

示例输出: 百度/ORG 是/v 一家/m 高科技/n 公司/n