哈工大LTP: http://ltp.ai/
LTP编译使用译文提到了LTP自然语言处理平台的编译使用,设计C++、Python和Java方式,相信可以参见其在GitHub主页中提到的具体编译方式和使用。这里主要是关于在Java项目中调用C++。
Java调用C++(编译得到DLL文件),主要用JNI和JNA,其中JNA是基于JNI的。LTP的Java移植版本ltp4j是采用JNI的方式。Java调用C++编译后的DLL文件,对于DLL文件的方式位置有一定的要求,需要在java.library.path
中,有如下几种方式:
-
DLL文件放在项目目录下,即与
src
目录同一级别
可以直接调用ltp4j中诸如Segmentor类及相关方法。 -
DLL文件放在自定义文件中
在使用中需要自己显示地调用库,比如:
System.loadLibrary("segmentor"); // 分词
- 方式一: 配置Java Build Path中选择【Libraris】->【Native library location】,添加DLL文件所在目录。
- 方式二:配置虚拟机参数,【Run Configurations】->【Arguments】,在【VM arguments】中添加:
-Djava.library.path=DLL文件所在目录
- 方式三:动态配置(代码)
private void addDirToLiraryPath(String dirpath) {
try {
Field field = ClassLoader.class.getDeclaredField("sys_paths");
field.setAccessible(true);
String[] oldpath = (String[]) field.get(null);
String[] newPath = new String[oldpath.length + 1];
System.arraycopy(oldpath, 0, newPath, 0, oldpath.length);
tem[oldpath.length] = dirpath;
field.set(null, newPath);
} catch (Exception e) {
e.printStackTrace();
}
}
完整的测试代码
package test.hitltp;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import