zoukankan      html  css  js  c++  java
  • 1---------java调用NLPIR(ICTCLAS2016)实现分词功能

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

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

    实现步骤

        1、在Netbeans中,文件→新建项目→java→java应用程序;项目名称:CWordSeg;
        2、将NLPIR文件下…sampleJnaTest_NLPIRsrccode中NlpirTest.java里的代码拷贝到CWordSeg.java里面;

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

        

        (1)将package包声明修改为cwordseg;
        (2)将类名NlpirTest重命名重构为CWordSeg;
        方法:右键CwordSeg.java→重构→重命名,改名为CWordSeg→重构;

        如果只是直接修改代码里的类名,则仍然需要进行重构,否则运行时会报错:找不到主类CWordSeg。
        (3)import utils.SystemParas; 未用到,暂时注释掉。

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

        4、将NLPIR文件下…sampleJnaTest_NLPIRlib下的jna-4.0.0.jar导入到工程库中;
        方法(1):右键库→添加JAR→选择jna-4.0.0.jar导入;
        方法(2):直接复制jna-4.0.0.jar文件到工程…CWordSeglib文件夹下。
        导完之后工程目录如下:

        

        5、在工程CWordSeg文件夹中新建文件夹file:
        (1)将NLPIR中的Data文件夹全部拷贝到file文件夹中;
        (2)将…libwin64文件夹也全部拷贝到file文件夹(注意:如果是win32或linux请选择对应的文件夹)。

        6、修改部分代码2:
        (1)修改文件NLPIR.dll所在的路径,它在第5步中拷入的win64文件夹中,例如:
        D:\NetBeansProjects\CWordSeg\filewin64\NLPIR
        注意:最后的NLPIR是文件名,不要加后缀.dll。
        附:已经试验过,如果是64位操作系统,使用32位的文件将会报错。

        

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

        

        (3)其他可以更改的地方:
        编码格式:int charset_type = 1; 改为其它值。
        其中:GBK对应0,UTF-8对应1,BIG5对应2,含繁体字的GBK对应3。

    简化后代码如下

    1.  1 package cwordseg;  
       2   
       3 import java.io.UnsupportedEncodingException;  
       4 // import utils.SystemParas;  
       5 import com.sun.jna.Library;  
       6 import com.sun.jna.Native;  
       7   
       8 /** 
       9  *  
      10  * 功能:基本的分词功能 
      11  * 最后更新时间:2016年3月14日 21:01:21 
      12  */  
      13   
      14 public class CWordSeg {  
      15     // 定义接口CLibrary,继承自com.sun.jna.Library  
      16     public interface CLibrary extends Library {  
      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,int encoding,String sLicenceCode);  
      21         // 分词函数声明:sSrc为待分字符串,bPOSTagged=0表示不进行词性标注,bPOSTagged=1表示进行词性标注  
      22         public String NLPIR_ParagraphProcess(String sSrc,int bPOSTagged);  
      23         // 获取最后一个错误信息的函数声明  
      24         public String NLPIR_GetLastErrorMsg();  
      25         // 退出函数声明  
      26         public void NLPIR_Exit();  
      27     }  
      28       
      29     public static String transString(String aidString,String ori_encoding,String new_encoding) {  
      30         try {  
      31             return new String(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) throws Exception {  
      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 }  

    运行结果

        

    出错解决:找不到主类CWordSeg

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

  • 相关阅读:
    Java实现 LeetCode 400 第N个数字
    Java实现 LeetCode 400 第N个数字
    Java实现 LeetCode 399 除法求值
    Java实现 LeetCode 399 除法求值
    Java实现 LeetCode 399 除法求值
    Java实现 LeetCode 398 随机数索引
    Java实现 LeetCode 398 随机数索引
    Java实现 LeetCode 398 随机数索引
    linux中的cd ..和cd -命令有什么区别?
    GCC使用
  • 原文地址:https://www.cnblogs.com/liuchaogege/p/5405659.html
Copyright © 2011-2022 走看看