java nlpir_1———java调用NLPIR(ICTCLAS2016)实现分词功能

  • Post author:
  • Post category:java


备注:win7 64位系统,netbeans编程

NLPIR分词系统,前身是2000年发布的ICTCLAS,2009年更为现名。张华平博士打造。

实现步骤:

1、在Netbeans中,文件→新建项目→java→java应用程序;项目名称:CWordSeg;

2、将NLPIR文件下…\sample\JnaTest_NLPIR\src\code中NlpirTest.java里的代码拷贝到CWordSeg.java里面;

初步修改代码为下图所示:

b885616420bc740d9401df77ba4fae37.png

(1)将package包声明修改为cwordseg;

(2)将类名NlpirTest重命名重构为CWordSeg;

方法:右键CwordSeg.java→重构→重命名,改名为CWordSeg→重构;

如果只是直接修改代码里的类名,则仍然需要进行重构,否则运行时会报错:找不到主类CWordSeg。

(3)import utils.SystemParas; 未用到,暂时注释掉。

3、将NLPIR文件下…\sample\JnaTest_NLPIR\src下的utils文件夹直接拷贝到项目CWordSeg的src文件夹中;

4、将NLPIR文件下…\sample\JnaTest_NLPIR\lib下的jna-4.0.0.jar导入到工程库中;

方法(1):右键库→添加JAR→选择jna-4.0.0.jar导入;

方法(2):直接复制jna-4.0.0.jar文件到工程…\CWordSeg\lib文件夹下。

导完之后工程目录如下:

51fc86a6cac50c485b79ffa72a56aa4e.png

5、在工程CWordSeg文件夹中新建文件夹file:

(1)将NLPIR中的Data文件夹全部拷贝到file文件夹中;

(2)将…\lib\win64文件夹也全部拷贝到file文件夹(注意:如果是win32或linux请选择对应的文件夹)。

6、修改部分代码2:

(1)修改文件NLPIR.dll所在的路径,它在第5步中拷入的win64文件夹中,例如:

D:\\NetBeansProjects\\CWordSeg\\file\win64\\NLPIR

注意:最后的NLPIR是文件名,不要加后缀.dll。

附:已经试验过,如果是64位操作系统,使用32位的文件将会报错。

d11ea0f279b0e6f7740530319565d4e0.png

(2)修Data文件夹所在的路径(即第5步中的Data文件夹),如下图所示:

D:\\NetBeansProjects\\CWordSeg\\file

ea80f1fbe107c5646a0a46e837aafef0.png

(3)其他可以更改的地方:

编码格式:int charset_type = 1; 改为其它值。

其中:GBK对应0,UTF-8对应1,BIG5对应2,含繁体字的GBK对应3。

简化后代码如下:

1 packagecwordseg;2

3 importjava.io.UnsupportedEncodingException;4 //import utils.SystemParas;

5 importcom.sun.jna.Library;6 importcom.sun.jna.Native;7

8 /**

9 *10 * 功能:基本的分词功能11 * 最后更新时间:2016年3月14日 21:01:2112 */

13

14 public classCWordSeg {15 //定义接口CLibrary,继承自com.sun.jna.Library

16 public interface CLibrary extendsLibrary {17 //定义并初始化接口的静态变量,用于加载NLPIR.dll,路径指向文件NLPIR.dll,但不加后缀dll

18 CLibrary Instance = (CLibrary) Native.loadLibrary(“D:\\NetBeansProjects\\CWordSeg\\file\\win64\\NLPIR”,CLibrary.class);19 //初始化函数声明:sDataPath是初始化路径地址,包括核心词库和配置文件的路径,encoding为输入字符的编码格式

20 public int NLPIR_Init(String sDataPath,intencoding,String sLicenceCode);21 //分词函数声明:sSrc为待分字符串,bPOSTagged=0表示不进行词性标注,bPOSTagged=1表示进行词性标注

22 public String NLPIR_ParagraphProcess(String sSrc,intbPOSTagged);23 //获取最后一个错误信息的函数声明

24 publicString NLPIR_GetLastErrorMsg();25 //退出函数声明

26 public voidNLPIR_Exit();27 }28

29 public staticString transString(String aidString,String ori_encoding,String new_encoding) {30 try{31 return newString(aidString.getBytes(ori_encoding),new_encoding);32 } catch(UnsupportedEncodingException e) {33 e.printStackTrace();34 }35 return null;36 }37

38 public static void main(String[] args) throwsException {39 String argu = “D:\\NetBeansProjects\\CWordSeg\\file”; //该路径指向Data文件夹(系统核心词库)40 //String system_charset = “UTF-8”;

41 int charset_type = 1; //UTF-8编码模式,其它的GBK对应0,BIG5对应2,含繁体字的GBK对应3

42 int init_flag = CLibrary.Instance.NLPIR_Init(argu, charset_type, “0”); //运行初始化函数,成功则返回1,失败返回0

43 String nativeBytes;44

45 //初始化失败提示

46 if (0 ==init_flag) {47 nativeBytes = CLibrary.Instance.NLPIR_GetLastErrorMsg(); //获取错误信息

48 System.err.println(“初始化失败!原因:”+nativeBytes);49 return;50 }51

52 String sInput = “这是一本关于信息检索的书。”; //手工输入的字符串sInput

53 try{54 nativeBytes = CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1); //运行分词函数

55 System.out.println(“分词结果为: ” + nativeBytes); //输出分词结果

56 CLibrary.Instance.NLPIR_Exit(); //退出

57 } catch(Exception ex) {58 //TODO Auto-generated catch block

59 ex.printStackTrace();60 }61 }62 }

运行结果:

08a92925ab5c6291edd1c92eeeddd477.png

出错解决:找不到主类CWordSeg

在第2步中修改了类名,需要用正确的方法修改,或者通过重构修正。

18a10165ed2a407c30e0148f11596a4f.png



版权声明:本文为weixin_42397925原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。