1---------java調用NLPIR(ICTCLAS2016)實現分詞功能


  備注:win7 64位系統,netbeans編程

    NLPIR分詞系統,前身是2000年發布的ICTCLAS,2009年更為現名。張華平博士打造。

 

實現步驟

    1、在Netbeans中,文件→新建項目→java→java應用程序;項目名稱:CWordSeg;
    2、將NLPIR文件下…\sample\JnaTest_NLPIR\src\code中NlpirTest.java里的代碼拷貝到CWordSeg.java里面;

    初步修改代碼為下圖所示:

    

    (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文件夾下。
    導完之后工程目錄如下:

    

    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位的文件將會報錯。

    

    (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步中修改了類名,需要用正確的方法修改,或者通過重構修正。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM