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步中修改了类名,需要用正确的方法修改,或者通过重构修正。

  • 相关阅读:
    stringstream用法
    C# WinForm设置窗口无边框、窗口可移动、窗口显示在屏幕中央、控件去边框
    C# WinForm设置窗口大小不可调,取消最大、最小化按键
    LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal 由前序和中序遍历建立二叉树 C++
    LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal 由中序和后序遍历建立二叉树 C++
    LeetCode 112. Path Sum 二叉树的路径和 C++
    LeetCode 101. Symmetric Tree 判断对称树 C++
    LeetCode 100. Same Tree 判断两棵二叉树是否相等 C++
    C# winform三种方法判断文本框textBox内容是否为空
    LeetCode 145. Binary Tree Postorder Traversal 二叉树的后序遍历 C++
  • 原文地址:https://www.cnblogs.com/liuchaogege/p/5405659.html
Copyright © 2011-2022 走看看