前言:ltp4j是语言技术平台(Language Technology Platform, LTP)接口的一个Java封装。官网给出了C++源码,要想用java调用,必须编译成java本地接口。 官网给的文档太笼统,遇到错误根本不知道怎么处理。在网上搜的博客,一步一步来还是编译不成功。这里给出在windows环境下编译详细过程,也是自己一点一点解决问题,最终在摸索中编译成功。
准备工作
- 源码下载:
- 环境:
- 操作系统:
windows 7/8/10
-
JDK版本:
1.8+ 32
位(低于1.8
版本的话,无法运行) -
IDE
:eclipse
-
Ant:这个一般集成在
eclipse
中,如果没有请先安装 -
cmake
:下载链接 -
Visual studio Express 2012
:其他版本不知道行不行,最好不要低于这个版本
- 操作系统:
2. 生成jar文件
-
打开
eclipse
,点击File -> New -> Project -> Java Project from Existing Ant Buildfile
,然后next -
project name填写ltp4j,build file那里选择刚才解压的itp4j-master 中的build.xml,点击Finish。
-
选中build.xml,右键->
Run As -> 2 Ant Build
,在 弹出的窗口的导航栏中选择main
,第二项的Base Directory
点击下方的Browse File System
,然后选择LTP4J
根目录。最后点击右下角的Run
运行。 -
控制台显示如下,说明build成功.可以打开根目录下面
ltp4j-master\output\jar
中查看生成的jar文件Buildfile: C:\Users\shixu\Documents\work space\ltp4j\build.xml
clean:
[delete] Deleting directory C:\Users\shixu\Documents\LTP\ltp4j-master\output
compile:[mkdir] Created dir: C:\Users\shixu\Documents\LTP\ltp4j-master\output\classes
[javac] C:\Users\shixu\Documents\work space\ltp4j\build.xml:17: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
[javac] Compiling 7 source files to C:\Users\shixu\Documents\LTP\ltp4j-master\output\classesjar:
[mkdir] Created dir: C:\Users\shixu\Documents\LTP\ltp4j-master\output\jar
[jar] Building jar: C:\Users\shixu\Documents\LTP\ltp4j-master\output\jar\ltp4j.jarmain:
BUILD SUCCESSFUL
Total time: 2 seconds
编译LTP
-
构建VC project:
在
ltp-master
项目文件夹下新建一个名为build
的文件夹,使用CMake Gui
,在source code
中填入项目文件夹,在binaries
中填入build
文件夹。然后Configure
选择vs 11 2012
,点击finish
。稍等几秒钟,点击Generate
查看日志,如果出现如下,说明成功。
Configuring done
Generating done
-
编译:
进入
build
文件夹,用vs 2012
打开ALL_BUILD.vcxproj
在vs的菜单栏中,点击生成->生成解决方法,可以在控制台看到,正在生成。注意要选择Debug
模式。(网上很多帖子说的选择Release
模式,我开始这么尝试,后来发现在编译ltp4j的时候失败,一直报error link 1181:--.lib输入文件无法打开。后来读了一下ltp4j
的配置文件,发现里面默认的路径是到ltp
的lib\Debug
中加载lib文件,如下 ```
if(WIN32) link_directories (${LTP_HOME}/lib/Debug) else(WIN32) link_directories (${LTP_HOME}/lib) endif(WIN32)
如果选择
Release
,那么生成的库只会在Release
中,这也难怪会报上述错误了。) -
编译生成比较耗时。生成完成之后,可以到
ltp-master\lib\Debug
看到已经生成库文件。至此LTP
的编译已经完成,接下来进行LTP4J
的编译。
编译 LTP4J
-
配置ltp的安装路径:
因为jni依赖于ltp编译产生的动态库,所以在编译过程中需要给出ltp的路径。 请修改
/path/to/your/ltp4j-project/CMakeLists.txt
中的LTP_HOME
的值为您的LTP项目的路径(/path/to/your/ltp-project
), 对应修改的代码为:set (LTP_HOME "/path/to/your/ltp-project/")
-
构建VC project。 在项目文件夹下新建一个名为build的文件夹,使用CMake Gui,在source code中填入项目文件夹,在binaries中填入build文件夹。然后Configure -> Generate。(同上)
-
编译:(同上)
-
生成完成之后,同样可以到
ltp-master\libs\Debug
看到已经生成库文件。至此所有编译工作已经完成,是不是觉得很简单呀,哈哈。反正我是试了好多次。接下来重头戏,开始在java 代码中调用。
3. 实战-- java中调用
-
打开eclipse,新建java project。
-
根目录创建lib文件夹,将ltp4j.jar拷贝至此,然后build path。
-
将ltp4j中的libs文件夹中生成的所有动态库、以及原ltp lib文件夹下的splitsnt、segmentor、postagger、ner、parser、srl 6个动态库拷贝到项目根目录
-
根目录下面创建model文件夹,拷贝model文件至此,需要下载3.3.1版本的model文件,下载链接 。
-
创建一个类文件:这里测试一下分词的接口调用。其他的自行测试。
package ltp; import java.util.ArrayList; import java.util.List; import edu.hit.ir.ltp4j.*; public class Test { public static void main(String[] args) { if(Segmentor.create("model\\cws.model")<0){ System.err.println("load failed"); return; } String sent = "我是中国人"; List<String> words = new ArrayList<String>(); int size = Segmentor.segment(sent,words); for(int i = 0; i<size; i++) { System.out.print(words.get(i)); if(i==size-1) { System.out.println(); } else{ System.out.print("\t"); } } Segmentor.release(); } }
-
工程目录结构如图:
-
运行,完美分词结果:
-
看到这儿 ,可能伸手党表示已经扛不住了。没事儿,我这儿有传送门。打包好的,下载就能用哦
用了一个午休的时间来写,脖子都疼了。
如果能给你带来一些帮助的话,那我也觉得值啦。
该休息了。下次见。---
想起我的阿里简历还没完善,,马上该面试了,神助我!
网友评论