欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java/Python调用百度LAC进行词法分析实现

程序员文章站 2022-03-26 21:21:25
LAC功能在于中文分词、词性标注、NER,对于基本的词法分析效果还是蛮不错的,如下为其对应词性和ner标签:写这篇博客的目的也是在于进一步梳理思路和过程,毕竟当时还是踩了一些坑的,写下来,于人于己都方便!话不多说,开始啦~其实吧,LAC如果通过python调用,十分便捷,如LAC githubhttps://github.com/baidu/lac所示:pip安装:pip install lac -i https://mirror.baidu.com/pypi/simple然后就可....

LAC功能在于中文分词、词性标注、NER,对于基本的词法分析效果还是蛮不错的,如下为其对应词性和ner标签:

Java/Python调用百度LAC进行词法分析实现

写这篇博客的目的也是在于进一步梳理思路和过程,毕竟当时还是踩了一些坑的,写下来,于人于己都方便!

话不多说,开始啦~

其实吧,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为模型文件

Java/Python调用百度LAC进行词法分析实现

运行代码,其中<model_dir>为lac_model的路径

javac LacDemo.java
java LacDemo <model_dir>

结果如图

Java/Python调用百度LAC进行词法分析实现

如此大功告成,后续可在此基础上进一步用于其它任务或功能!

本文地址:https://blog.csdn.net/qq_40794377/article/details/107355528