赞
踩
目录
LTP4J简介。LTP底层均是C++实现,而LTP4J是对LTP的Java接口封装。所以对于需要Java接口的开发人员来说要通过调用LTP4J的接口实现调用LTP的目的,LTP4J封装了几个独立的方法,分别是Segmentor / Postagger /NER/Parser /SRL,与之对应的实现功能是分词、词性标注、命名实体识别、句法分析、语义角色标注。
由于官网上没有给编译好的jar包和库文件,所以要根据自身电脑环境进行相应的编译操作。
使用ltp的java编程接口,要做的准备工作主要有二个:1,使用Ant编译ltp4j,生成ltp4j.jar包;2,使用cmake/c++编译环境对ltp工程进行编译生成ltp4j依赖库文件。
本文档依次在ubuntu、win7操作系统下完成了ltp4j的编译工作,并用官网上给的java代码进行了测试。详细如以下二部分。
本部分所用的软件基本上都上官网上下载的最新,当然受限于硬件,所用的ubuntu系统是老了些。
软件 | 版本信息 | 官网 |
系统 | ubuntu12.04 32 | https://www.ubuntu.com/download |
jdk | apache-ant-1.9.7-bin.tar.gz | http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html |
ant | apache-ant-1.9.7-bin.tar.gz | http://ant.apache.org/ |
cmake | cmake-3.7.0-rc1.tar.gz | https://cmake.org/ |
eclipse | eclipse-jee-neon-R-linux-gtk.tar.gz | https://www.eclipse.org/downloads/ |
ltp | ltp-master.zip | https://github.com/HIT-SCIR |
ltp4j | ltp4j-master.zip | https://github.com/HIT-SCIR |
ltp | ltp-data-v3.3.1.zip | http://pan.baidu.com/share/link?shareid=1988562907&uk=2738088569#list/path=%2F |
自行设定jdk安装目录。在安装目录解压,解压:tar -xzvf jdk-8u101-linux-i586.tar.gz
配置环境变量:
exportJAVA_HOME=/usr/local/java/jdk1.8.0_101
export JRE_HOEM=${JAVA_HOME}/jre
exportCLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
检测命令:java -version
自行设定ant安装目录。在安装目录解压、,解压:tar -xzvf jdk-8u101-linux-i586.tar.gz
配置环境变量:
exportANT_HOME=/usr/local/ant/apache-ant-1.9.7
export PATH=${ANT_HOME}/bin:$PATH
自行设定cmake安装目录。如果没有g++,则先行安装:sudo apt-get install g++
在安装目录解压,解压:tar -xzvf cmake-3.7.0-rc1.tar.gz
在解压的目录执行:
./configure
make
make install
自行设定ltp安装目录。在安装目录解压,解压:tar -xzvf ltp-master.zip
在解压后目录,使用./configure检查编译环境,没有问题则执行make进行编译。
自行设定ltp4j安装目录。在安装目录解压,解压:tar -xzvf ltp4j-master.zip
在解压后的目录ltp4j-master下执行ant命令,编译后,可在ltp4j-master/output/jar目录下找到ltp4j.jar包。
在对ltp4j编译前,修改文件...。修改后,执行“cmake .”“make”两个命令进行编译,编译后,则在ltp4j-master/libs下生成动态库:libner_jni.so; libpostagger_jni.so; libsplit_sentence_jni.so; libparser_jni.so;libsegmentor_jni.so;libsrl_jni.so
配置环境变量,将编译的动态库路径加到环境变量:
exportLD_LIBRARY_PATH=/usr/local/LTP/tmpliso
至此完成。
首先需要解压ltp的数据模型文件:ltp-data-v3.3.1.zip,解压目录可以自己设定。
在eclipse里新建一个工程,ltp4j.jar导入到工程,至此,配置完成,下边是ltp的五个功能。
ltp提供的主要功能有:分词,词性标注,命名实体识别,句法分析,语义角色标注。
每个功能基本都是三个步骤:1,create, 读取模型文件,初始化功能实例;2,功能接口,实现相应的功能;3,release,释放模型文件、资源。
以下功能都是官方文档中的,注意的是模型文件是ltp-data-v3.3.1.zip解决所得。
/**
* 1,分词功能测试
*/
publicvoid testSegment() {
if(Segmentor.create("ltp_data/cws.model")< 0) {
System.out.println("加载失败!");
return;
}
Stringsent = "我从事自然语言处理方面的工作!";
System.out.println(sent);
List<String>words = new ArrayList<String>();
System.out.println(sent);
intsize = Segmentor.segment(sent, words);
System.out.println(sent);
for(int i = 0; i < size; i++) {
System.out.println(words.get(i));
}
Segmentor.release();
}
/**
* 2,词性标注工曾测试
*/
publicvoid testPosTag() {
if(Postagger.create("ltp_data//pos.model")< 0) {
System.err.println("加载失败!");
return;
}
List<String>words = new ArrayList<String>();
words.add("我");
words.add("从事");
words.add("自然");
words.add("语言");
words.add("处理");
words.add("方面");
words.add("的");
words.add("工作");
words.add("!");
List<String>postags = new ArrayList<String>();
intsize = Postagger.postag(words, postags);
for(int i = 0; i < size; i++) {
System.out.print(words.get(i)+ "_" + postags.get(i));
if(i == size - 1) {
System.out.println();
}else {
System.out.print("|");
}
}
Postagger.release();
}
/**
*3,命名实体识别功能测试
*/
publicvoid testNer(){
if(NER.create("ltp_data/ner.model")<0){
System.err.println("load failed");
return;
}
List<String> words = newArrayList<String>();
List<String> tags = newArrayList<String>();
List<String> ners = newArrayList<String>();
words.add("中国");tags.add("ns");
words.add("国际");tags.add("n");
words.add("广播");tags.add("n");
words.add("电台");tags.add("n");
words.add("创办");tags.add("v");
words.add("于");tags.add("p");
words.add("1941年");tags.add("m");
words.add("12月");tags.add("m");
words.add("3日");tags.add("m");
words.add("。");tags.add("wp");
NER.recognize(words,tags, ners);
for (int i = 0; i < words.size(); i++) {
System.out.println(ners.get(i));
}
NER.release();
}
/**
* 4,句法分析功能测试
*/
publicvoid testParser(){
if(Parser.create("ltp_data/parser.model")<0){
System.err.println("loadfailed");
return;
}
List<String> words = newArrayList<String>();
List<String> tags = newArrayList<String>();
words.add("一把手");tags.add("n");
words.add("亲自");tags.add("d");
words.add("过问");tags.add("v");
words.add("。");tags.add("wp");
List<Integer> heads = newArrayList<Integer>();
List<String> deprels = newArrayList<String>();
int size =Parser.parse(words,tags,heads,deprels);
for(int i = 0;i<size;i++) {
System.out.print(heads.get(i)+":"+deprels.get(i));
if(i==size-1) {
System.out.println();
}
else{
System.out.print(" ");
}
}
Parser.release();
}
/**
* 5,语义角色标注功能测试
*/
publicvoid testSrl(){
SRL.create("ltp_data/srl");
ArrayList<String> words = newArrayList<String>();
words.add("一把手");
words.add("亲自");
words.add("过问");
words.add("。");
ArrayList<String> tags = newArrayList<String>();
tags.add("n");
tags.add("d");
tags.add("v");
tags.add("wp");
ArrayList<String> ners = newArrayList<String>();
ners.add("O");
ners.add("O");
ners.add("O");
ners.add("O");
ArrayList<Integer> heads = newArrayList<Integer>();
heads.add(2);
heads.add(2);
heads.add(-1);
heads.add(2);
ArrayList<String> deprels = newArrayList<String>();
deprels.add("SBV");
deprels.add("ADV");
deprels.add("HED");
deprels.add("WP");
List<Pair<Integer,List<Pair<String, Pair<Integer, Integer>>>>> srls = newArrayList<Pair<Integer, List<Pair<String, Pair<Integer,Integer>>>>>();
SRL.srl(words, tags, ners, heads, deprels,srls);
for (int i = 0; i < srls.size(); ++i) {
System.out.println(srls.get(i).first +":");
for (int j = 0; j < srls.get(i).second.size();++j) {
System.out.println(" tpye = "+srls.get(i).second.get(j).first + " beg = "+srls.get(i).second.get(j).second.first + " end = "+ srls.get(i).second.get(j).second.second);
}
}
SRL.release();
}
软件 | 软件信息 |
操作系统 | Win7 64 位 |
Jdk | jdk-8u101-windows-x64.exe |
Ant | apache-ant-1.9.7 |
Cmake | cmake-3.6.2-win64-x64.msi |
C++编译环境 | vs2010旗舰 |
eclipse | org.eclipse.platformversion=3.7.0 |
关于ltp相关的和ubuntu下用的是同一套:ltp,ltp4j,ltp数据模型
win7下jdk环境变量设置,略。
ant从官网下载对就电脑的安装包后,到win7下解压即可,解压目录可以设置。
环境变量设置。新建ANT_HOME值为:“自己目录\apache-ant-1.9.7”,编辑PATH,在PATH变量值的末尾添加:“;%ANT_HOME%\bin”
验证是否配置成功,打开cmd,输入ant,如果显示:
Buildfile:build.xml does not exist!
Buildfailed
这样的话,说明配置成功,因为ant默认运行build.xml文件,该文件需要手动创建。
cmake是从官网下载的可执行文件形式的安装包。下载对就系统版本,一键安装即可。(http://www.cmake.org/download/)
首先下载LTP4J源码,下载后,我的本地目录为:F:\LTP。
cmd进行LTP4j的项目根目录下,执行ant命令:
图1
执行成功后,LTP4j在项目下会生成output文件夹,在里边可找到ltp4j.jar 。
在编译LTP4j的C++代理之前,需要先编译LTP。编译LTP主要有二步:使用工具CMake构建项目;在vs2010下编译。
使用工具CMake构建项目。首先下载LTP源码ltp-master.zip,解压后重命名为ltp,我的存放路径为:F:\LTP。在ltp目录下新建一个build文件夹。打开cmakeGUI,相关输入设置如图:
图2
点击configure,在弹出框中选择vs2010的(结合自己电脑选择相应的编辑器)。点击generate,执行完成。会在build下生成相应的项目配置文件。
用vs2010打开build下的ALL_BUILD项目,选择Release(*)方式构建项目。完成以后,则ltp的libs会得到所想要lib库文件。
同编译ltp4j一样,也需要二个步骤:用cmake构建项目;用vs2010进行编译。首先,修改ltp4j目录下的CMakeLists.txt文件,将LTP路径设置为上节的ltp路径,如图:
图3
构建VC项目。用cmake打开ltp4j,同时在ltp4j目录下建立一个build文件夹,如图:
图4
依次点击configure、generate。构建完毕,会在build下生成相应的项目文件。
用vs2010打开build下的项目文件ALL_BUILD.vcxproj,选择Release(*)方式构建项目。完毕后在ltp4j的libs会所得到需要的文件。
3.2节编译中,我们需要以下文件:1,ltp下lib中的ner.dll、parser.dll、postagger.dll、splitsnt.dll、segmentor.dll、srl.dll六个库文件;2,ltp4j下libs中的全部文件;3,ltp4j下out中的ltp4j.jar包。
同时需要下载ltp所用到数据模型ltp-data-v3.3.1.zip ,这个同ubuntu下的数据模型是同一个。下载后解压即可,我是用的时候将其复制到项目文件下。
在eclipse中新建项目,将ltp4j.jar包导入。将ltp下lib中6个库文件和ltp4j下libs中的全部文件复制到项目的根目录下。如图:
图5
至于测试代码,和ubuntu下的代码一样,用同一套测试即可。
本文档简要介绍了LTP的java编程接口的使用方法。如开始的所说,主要LTP核心是C++开发。java接口的话,则需要编译ltp4j和对应的ltp库文件。
主要参考文件如附录,文中完成的测试类文件为:NtpTest.java。
1,LTP官方文档:https://github.com/HIT-SCIR/ltp4j/blob/master/doc/ltp4j-document-1.0.md
2,《LTP随笔——本地调用ltp之ltp4j》http://www.bubuko.com/infodetail-542352.html
3,《封装LTP4J的本地LTML调用接口》http://www.tuicool.com/articles/EFj2EnQ
4,《编译哈工大语言技术平台云LTP(C++)源码及LTP4J(Java)源码》http://www.tuicool.com/articles/jYbqUn
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。