LTP4J简介
LTP4J是对LTP的Java接口封装,众所周知LTP底层均是C++实现,所以对于需要Java接口的开发人员来说要通过调用LTP4J的接口实现调用LTP的目的,但是该项目仅仅封装了几个独立的方法,分别是NER/Parser/Postagger/Segmentor/SRL与之对应的实现功能是命名实体识别/依存句法分析/词性标注/分词/语义角色标注,LTP4J中封装的都是native方法,无法查看源代码。
Java之native关键字
Java native Interface简称JNI,即Java本地接口,JNI是一个编程框架,可以使得运行在Java虚拟机上的Java程序调用与平台相关的其它语言实现的程序,比如C/C++/汇编等。
换言之,JNI允许用本地代码来解决纯粹用Java编程不能解决的平台相关的特性。对于Windows平台上的C++程序而言,在Java中将某个方法声明为native的,然后用C++程序实现该方法的具体功能,之后将C++程序编译为DLL文件即可。在Java虚拟机执行到该native方法的时候,会由操作系统去寻找对应的DLL文件进而调用该方法的C++实现。
所以使用LTP4J的前提是需要编译LTP源码及LTP4J的源码,在Windows X64平台上编译LTP源码及LTP4J源码请参见:
在Windows平台上使用LTP4J需要处理BOM问题,解决办法请参见:
LTML简介
有关LTML的详细信息参见LTML数据表示
LTML 标准要求如下:结点标签分别为 xml4nlp, note, doc, para, sent, word, arg 共七种结点标签:
- xml4nlp 为根结点,无任何属性值;
- note 为标记结点,具有的属性分别为:sent, word, pos, ne, parser, srl;分别代表分句,分词,词性标注,命名实体识别,依存句法分析,词义消歧,语义角色标注;值为”n”,表明未做,值为”y”则表示完成,如pos=”y”,表示已经完成了词性标注;
- doc 为篇章结点,以段落为单位包含文本内容;无任何属性值;
- para 为段落结点,需含id 属性,其值从0 开始;
- sent 为句子结点,需含属性为id,cont;id 为段落中句子序号,其值从0 开始;cont 为句子内容;
- word 为分词结点,需含属性为id, cont;id 为句子中的词的序号,其值从0 开始,cont为分词内容;可选属性为 pos, ne, parent, relate;pos 的内容为词性标注内容;ne 为命名实体内容;parent 与relate 成对出现,parent 为依存句法分析的父亲结点id 号,relate 为相对应的关系;
- arg 为语义角色信息结点,任何一个谓词都会带有若干个该结点;其属性为id, type, beg,end;id 为序号,从0 开始;type 代表角色名称;beg 为开始的词序号,end 为结束的序号;
LTP的在线版提供LTML格式的返回数据(亦即XML格式),地址在这里,但是本地版不提供,需要自己封装。
封装本地版LTML的Java调用接口
对外提供了两个接口,其一是根据文件内容获取完整的LTML标注结果,文件编码默认UTF-8,代码如下:
|
|
本地分析输出结果:
|
|
其二根据一个完整的句子获取到完整的LTML标注结果,完整的句子意思是使用“。|?|!|;”进行切分的结果,代码如下:
|
|
本地分析输出结果:
|
|
整个项目的源代码已经上传到Github仓库,欢迎下载使用!