NLPIR中文分詞的java接口使用方法

Java接口使用步驟

不理解NLPIR中文分詞的原理,沒什麼可說的,這裏僅記錄一下其Java接口的使用步驟,留以後用。

1、準備資源

在官網下載頁面中下載“NLPIR漢語分詞系統(又名ICTCLAS2013版)下載包(u0416)”,該下載包包括以下內容:

NLPIR漢語分詞Windows下的演示系統、點擊bin下面的exe即可;
數據文件: data文件夾
windows下的庫文件,lib/NLPIR.lib;bin/NLPIR.dll
示例程序: example下
頭文件說明:include/NLPIR.h
該分詞系統是用C/C++編寫的,所以我們要在Java環境中使用還需要下載其提供的Java接口,我下載的是“NLPIR-ICTCLAS2013-Win-32-JNI(u0416)下載包”,如果用的JDK是64位的,需要下載對應的64位下載包。
這樣我們得到了20130416090617_nlpir_ictclas2013_release.zip和20130416090224_Win-32bit-JNI-lib.zip兩個zip壓縮文件,將它們解壓開以備使用。



2、創建Java項目

創建一個Java項目,開始向其中添加dll庫和JNI接口。
首先在項目下創建一個文件夾file(隨便你命名)並將20130416090617_nlpir_ictclas2013_release目錄(由20130416090617_nlpir_ictclas2013_release.zip解壓所得)中的Data目錄拷貝到file目錄;再將bin目錄中的NLPIR.dll動態鏈接庫放到項目目錄下,與file目錄同級。
然後將Win-32bit-JNI-lib目錄(由20130416090224_Win-32bit-JNI-lib.zip解壓所得)中的NLPIR_JNI.dll動態鏈接庫拷貝到項目中,與NLPIR.dll平級;再將其中的kevin目錄拷貝到項目的src中(這裏就是NLPIR提供的Java接口,通過JNI來調用dll中的c/c++代碼)。
最後將20130416090617_nlpir_ictclas2013_release目錄中的test目錄(存放的是一些測試文本文件,我們也可以自行準備測試文本文件)拷貝到項目中與file目錄平級。
最終形成的項目結構如下所示:



3、寫例子測試

寫個簡單的例子測試一下,這裏處理的是採用UTF8編碼的測試文件(需要注意測試文本文件的編碼也要是UTF-8),GBK編碼類似,只要程序與文本編碼統一即可。

package com.zyh.nlpir;import kevin.zhang.NLPIR;public class TestUTF8 {public static void main(String[] args) {try {testUTF8();} catch (Exception e) {e.printStackTrace();}}static void testUTF8() throws Exception {// 創建接口實例NLPIR nlpir = new NLPIR();// NLPIR_Init方法第二個參數設置0表示編碼爲GBK, 1表示UTF8編碼(此處結論不夠權威)if (!NLPIR.NLPIR_Init("./file/".getBytes("utf-8"), 1)) {System.out.println("NLPIR初始化失敗...");return;}String temp = "每天的日報都記得要發送, 以配合經理掌握項目的進度情況.";// 要統一編碼, 否則分詞結果會產生亂碼byte [] resBytes = nlpir.NLPIR_ParagraphProcess(temp.getBytes("UTF-8"), 1);System.out.println("分詞結果: " + new String(resBytes, "UTF-8"));String utf8File = "./test/test-utf8.TXT";String utf8FileResult = "./test/test-utf8_result.TXT";nlpir.NLPIR_FileProcess(utf8File.getBytes("utf-8"), utf8FileResult.getBytes("utf-8"), 1);// 退出, 釋放資源NLPIR.NLPIR_Exit();}}
測試輸出(關於輸出內容的詞性含義,可以參考前面下載包中的參考文檔):

分詞結果: 每天/r 的/ude1 日報/n 都/d 記得/v 要/v 發送/v ,/wd 以/p 配合/v 經理/n 掌握/v 項目/n 的/ude1 進度/n 情況/n ./wj

文件輸出test-utf8_result.TXT也正常;另外前面的下載包中也提供了一個示例程序,可以將其複製到項目中,加以修改後運行,該測試中有NLPIR新特性--提取新詞、關鍵詞識別等測試內容。

其它知識點

1、輸出不帶詞性的分詞結果

上面例子中不論輸出到控制檯還是文本文件中的分詞結果都帶有詞性,如果我想輸出不帶詞性的分詞結果,需要將NLPIR_ParagraphProcess方法和NLPIR_FileProcess方法中的第二個參數設置爲0:

byte [] resBytes = nlpir.NLPIR_ParagraphProcess(temp.getBytes("UTF-8"), 0);System.out.println("分詞結果: " + new String(resBytes, "UTF-8"));String utf8File = "./test/test-utf8.TXT";String utf8FileResult = "./test/test-utf8_result.TXT";nlpir.NLPIR_FileProcess(utf8File.getBytes("utf-8"), utf8FileResult.getBytes("utf-8"), 0);
這樣輸出結果會如下所示:

分詞結果: 每天 的 日報 都 記得 要 發送 , 以 配合 經理 掌握 項目 的 進度 情況 .

可以看到輸出的詞語之間僅用空格分隔並不帶有詞性。

2、添加用戶詞典

NLPIR支持用戶詞典,將上面的代碼第23至26行部分改爲如下代碼:

String temp = "每天的日報都記得要發送, 以配合經理掌握項目的進度情況.";// 要統一編碼, 否則分詞結果會產生亂碼nlpir.NLPIR_AddUserWord("進度情況 nl".getBytes("utf-8"));byte [] resBytes = nlpir.NLPIR_ParagraphProcess(temp.getBytes("UTF-8"), 1);System.out.println("分詞結果: " + new String(resBytes, "UTF-8"));
這樣我們將“進度情況”作爲用戶詞典添加到NLPIR中,分詞結果爲:

分詞結果: 每天/r 的/ude1 日報/n 都/d 記得/v 要/v 發送/v ,/wd 以/p 配合/v 經理/n 掌握/v 項目/n 的/ude1 進度情況/nl ./wj
很明顯,NLPIR將“進度情況”作爲一個詞語來分析,詞性爲我們設置的“nl”;添加用戶詞典時詞語和詞性需要用空格分隔開,這樣添加的詞語是臨時添加的,只在這個程序中有效,程序關閉之後就無效了。如果在使用了上面的函數之後,再調用NLPIR_SaveTheUsrDic()方法,上面添加的詞就完全的保存了,下次運行程序即使不導入這個詞,NLPIR仍然會將這個詞分出來;NLPIR_DelUsrWord方法與NLPIR_AddUserWord方法相反,是將用戶添加的詞語刪除掉,改變同樣是臨時的,需要調用NLPIR_SaveTheUsrDic()方法來保存;如果用戶詞語比較多可以定義在文本文件中,然後調用NLPIR_ImportUserDict方法來將其一次性導入。
其它的接口請參照下載包中提供的接口說明文檔中的JNI接口部分。

發現的問題(針對JNI接口)
其一、調用NLPIR_AddUserWord方法添加用戶詞典後,NLPIR_DelUsrWord方法將添加的詞刪掉,然後再不能添加該詞了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章