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