Java/Python调用百度LAC进行词法分析实现
LAC功能在于中文分词、词性标注、NER,对于基本的词法分析效果还是蛮不错的,如下为其对应词性和ner标签:
写这篇博客的目的也是在于进一步梳理思路和过程,毕竟当时还是踩了一些坑的,写下来,于人于己都方便!
话不多说,开始啦~
其实吧,LAC如果通过python调用,十分便捷,如LAC github https://github.com/baidu/lac所示:
Python3 pip安装:pip install lac -i https://mirror.baidu.com/pypi/simple
然后就可以import使用啦:
from LAC import LAC
# 装载分词模型
lac = LAC(mode='seg')
text = "LAC是个优秀的分词工具"
seg_result = lac.run(text)
# 批量样本输入, 输入为多个句子组成的list,平均速率会更快
texts = ["LAC是个优秀的分词工具", "百度是一家高科技公司"]
seg_result = lac.run(texts)
但java的调用比较麻烦,所以,正题开始,linux上实现,共分两大步:
1.Paddle依赖库准备:LAC是基于Paddle训练所得的模型,需依赖Paddle的预测库
(1)直接下载
LAC github提供了预编译好的Linux预测库(fluid_inference.tgz),可直接下载,选择合适版本解压使用即可。但它的是在ubuntu上编译的,我自己的linux系统是centos的,所以还是自己进行了编译。
(2)自己编译
首先需要更新cmake版本,我将其升级为cmake 3.3.2
# 下载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调用包
LAC github已经编写了jni调用c++库的接口,我们编译生成Java可直接调用的包即可。
# lac代码下载
git clone https://github.com/baidu/lac.git
cd lac
# PADDLE_ROOT表示第1步中获取的Paddle依赖库路径
# 即下载解压后的文件夹路径或编译产出的文件夹路径
PADDLE_ROOT=/path/of/paddle
# JAVA的HOME目录,应存在文件${JAVA_HOME}/include/jni.h
# 根据自己linux系统安装的JAVA路径设置即可
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 下
最后,即是运行阶段,也有一些坑,请注意下:
在output/java下有com.baidu.nlp
的Java库以及单线程调用示例LacDemo.java,我们以LacDemo.java为例进行lac调用使用。
首先,需要下载模型文件models_general.zip,解压文件夹中包含两个模型,如下:
-
seg_model
:仅实现分词的模型 -
lac_model
:实现分词、词性标注、实体识别于一体的词法分析模型
将解压的模型文件夹放在系统下相应位置。
然后,为了运行顺利,需要更改LacDemo.java代码:
import java.util.ArrayList;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import com.baidu.nlp.LAC;
public class LacDemo {
static {
// 按照绝对路径装载LAC链接库,
// 此外,先加载libpaddle_fluid.so再加载liblacjni.so,前者是后者的依赖库文件
String dir_path = new String();
dir_path = System.getProperty("user.dir");
System.load(dir_path+"/paddle_path/paddle/lib/libpaddle_fluid.so");
System.load(dir_path+"/liblacjni.so");
}
public static void main(String[] args) {
// 默认模型路径
String model_path = new String("./lac_model");
if (args.length > 0) {
model_path = args[0];
}
LAC lac = new LAC(model_path);
// 装载用户词典
if (args.length > 1) {
lac.loadCustomization(args[1]);
}
ArrayList<String> words = new ArrayList<>();
ArrayList<String> tags = new ArrayList<>();
//注释对应行,将输入query设置为默认query
/**BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
String query = null;
try {
while ((query = stdin.readLine()) != null) {
lac.run(query, words, tags);
System.out.println(words);
System.out.println(tags);
}
} catch (Exception e) {
System.out.println(e.getMessage());
}*/
//新添加如下4行
String query = "LAC分词工具是百度公司的产品";
lac.run(query, words, tags);
System.out.println(words);
System.out.println(tags);
}
}
下图为我的java文件夹下的文件内容,其中“liblacjni.so”为第2步编译所得,“paddle_path”为第一步编译所得的paddle依赖库,lac_model为模型文件
运行代码,其中<model_dir>为lac_model的路径
javac LacDemo.java
java LacDemo <model_dir>
结果如图
如此大功告成,后续可在此基础上进一步用于其它任务或功能!
本文地址:https://blog.csdn.net/qq_40794377/article/details/107355528