NLPIR是張華平博士及其團隊研發的,是由ICTCLAS中科院漢語詞法分析(分詞)系統發展而來的。http://ictclas.nlpir.org/
現在更名爲NLPIR,集合了更多的漢語詞法分析功能,最新的2016版包括主要功能包括中文分詞;英文分詞;詞性標註;命名實體識別;新詞識別;關鍵詞提取;支持用戶專業詞典與微博分析。
並且在此基礎上,開發了NLPIR大數據搜索與挖掘平臺,平臺展示界面 http://ictclas.nlpir.org/nlpir/#box-8,其顯示可以實現:分詞標註、實體抽取、詞頻統計、關鍵詞提取、Word2vec、文本分類、情感分析、依存文法、繁簡編碼轉換、自動注音、摘要提取等。並將功能代碼同步到GitHub上 https://github.com/NLPIR-team/NLPIR 供開發者下載和二次開發。
本文就對其部分功能的java實現進行說明:
1.中文分詞、提取關鍵詞
準備文件:系統核心詞庫Data文件、jna-4.0.0包、Win 64bit操作系統下的支持庫NLPIR.dll和NLPIR.lib(其他操作系統選擇對應的支持庫),這些文件在下載包裏都有,集成到自己的項目中即可!
代碼:注意更改代碼的文件路徑!!!
import java.io.UnsupportedEncodingException;
import com.sun.jna.Library;
import com.sun.jna.Native;
public class test {
// 定義接口CLibrary,繼承自com.sun.jna.Library
public interface CLibrary extends Library {
// 定義並初始化接口的靜態變量這一個語句是來加載dll 的,注意dll 文件的路徑可以是絕對路徑也可以是相對路徑,只需要填寫dll 的文件名,不能加後綴。
test.CLibrary Instance = (test.CLibrary)Native.loadLibrary("D:\\projects\\NLPIR\\libs\\win64\\NLPIR", test.CLibrary.class);
// 初始化函數聲明,sDataPath是初始化路徑地址包括核心詞庫和配置文件的路徑,encoding爲輸入字符的編碼格式
<span style="white-space:pre"> </span>public int NLPIR_Init(String sDataPath, int encoding, String sLicenceCode);
//執行分詞函數聲明,bPOSTagged爲0表示不進行詞性標註,爲1表示進行詞性標註
public String NLPIR_ParagraphProcess(String sSrc, int bPOSTagged);
//提取關鍵詞函數聲明,nMaxKeyLimie表示最多選取的關鍵詞個數,bWeigheOut表示是否顯示關鍵詞的權重值
public String NLPIR_GetKeyWords(String sLine, int nMaxKeyLimit, boolean bWeightOut);
//從文件中提取關鍵詞函數聲明,filePath表示待處理文件路徑
String NLPIR_GetFileKeyWords(String filePath, int nMaxKeyLimit, boolean bWeightOut);
//獲取最後一個錯誤信息函數聲明
String NLPIR_GetLastErrorMsg();
//退出函數聲明
public void NLPIR_Exit();
}
public static void main(String[] args) throws Exception {
String argu = "D:\\projects\\NLPIR"; //核心詞庫的上一級的路徑
byte charset_type = 1;
int init_flag = test.CLibrary.Instance.NLPIR_Init(argu, charset_type, "0");
String nativeBytes = null;
if(init_flag == 0) {<span style="white-space:pre"> </span>//如果初始化失敗
nativeBytes = test.CLibrary.Instance.NLPIR_GetLastErrorMsg();
System.err.println("初始化失敗!fail reason is " + nativeBytes);
} else {
String sInput = "據悉,質檢總局已將最新有關情況再次通報美方,要求美方加強對輸華玉米的產地來源、" +
"運輸及倉儲等環節的管控措施,有效避免輸華玉米被未經我國農業部安全評估並批准的轉基因品系污染。";
try {
nativeBytes = test.CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);
System.out.println("分詞結果爲: " + nativeBytes);
String nativeByte = test.CLibrary.Instance.NLPIR_GetKeyWords(sInput, 10, false);
System.out.print("關鍵詞提取結果是:" + nativeByte);
test.CLibrary.Instance.NLPIR_Exit();
} catch (Exception var9) {
var9.printStackTrace();
}
}
}
}
分詞結果爲: 據悉/v ,/wd 質檢/vn 總局/n 已/d 將/d 最新/a 有關/vn 情況/n 再次/d 通報/v 美方/n ,/wd 要求/v 美方/n 加強/v 對/p 輸/v 華/b 玉米/n 的/ude1 產地/n 來源/n 、/wn 運輸/vn 及/cc 倉儲/vn 等/udeng 環節/n 的/ude1 管/v 控/v 措施/n ,/wd 有效/ad 避免/v 輸/v 華/b 玉米/n 被/pbei 未經/d 我國/n 農業部/nt 安全/an 評估/vn 並/cc 批准/v 的/ude1 轉基因/n 品系/n 污染/vn 。/wj
關鍵詞提取結果是:農業部#評估#倉儲#污染#
2.添加自定義詞典
分爲添加單個自定義單詞、刪除單個自定義單詞、添加自定義詞典文件;
其中添加自定義詞典文件需要確保配置文件(Data/Configure.xml)中的UserDict設置爲“on”(一般默認爲on)。
代碼:
import com.sun.jna.Library;
import com.sun.jna.Native;
public class ImportUserDict {
public interface CLibrary extends Library {
ImportUserDict.CLibrary Instance = (ImportUserDict.CLibrary) Native.loadLibrary("D:\\projects\\NLPIR\\libs\\win64\\NLPIR", ImportUserDict.CLibrary.class);
public int NLPIR_Init(String sDataPath, int encoding, String sLicenceCode);
public String NLPIR_ParagraphProcess(String sSrc, int bPOSTagged);
//添加用戶自定義單詞函數聲明
int NLPIR_AddUserWord(String var1);
//刪除用戶自定義單詞函數聲明
int NLPIR_DelUsrWord(String var1);
//導入用戶自定義詞典文件聲明,sFilename爲自定義詞典路徑,bOverwrite默認爲true表示替代當前詞典,false表示添加到當前詞典後
int NLPIR_ImportUserDict(String sFilename, boolean bOverwrite);
String NLPIR_GetLastErrorMsg();
public void NLPIR_Exit();
}
public static void main(String[] args) {
String argu = "D:\\projects\\NLPIR";
byte charset_type = 1;
int init_flag = ImportUserDict.CLibrary.Instance.NLPIR_Init(argu, charset_type, "0");
String nativeBytes = null;
if (init_flag == 0) {
nativeBytes = ImportUserDict.CLibrary.Instance.NLPIR_GetLastErrorMsg();
System.err.println("初始化失敗!fail reason is " + nativeBytes);
} else {
String sInput = "南京大學地海學院在第12屆“南大杯”排球賽中奪冠。";
try {
nativeBytes = ImportUserDict.CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);
System.out.println("分詞結果爲: " + nativeBytes);
ImportUserDict.CLibrary.Instance.NLPIR_AddUserWord("地海學院 n"); //添加一個自定義單詞
nativeBytes = ImportUserDict.CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);
System.out.println("增加一個用戶單詞後分詞結果爲: " + nativeBytes);
ImportUserDict.CLibrary.Instance.NLPIR_DelUsrWord("地海學院"); //刪除一個自定義單詞
nativeBytes = ImportUserDict.CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);
System.out.println("刪除一個用戶單詞後分詞結果爲: " + nativeBytes);
int nCount = ImportUserDict.CLibrary.Instance.NLPIR_ImportUserDict("D:\\projects\\NLPIR\\userdicts.txt",false); //添加用戶詞典文件
System.out.println(String.format("導入%d個用戶詞典", nCount));
nativeBytes = ImportUserDict.CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);
System.out.println("增加用戶詞典文件後分詞結果爲: " + nativeBytes);
ImportUserDict.CLibrary.Instance.NLPIR_Exit();
} catch (Exception var9) {
var9.printStackTrace();
}
}
}
}
<pre name="code" class="plain">用戶詞典爲:
地海學院 nr
南大杯 n
分詞結果爲: 南京/ns 大學/n 地/ude2 海/n 學院/n 在/p 第12/m 屆/q “/wyz 南/b 大/a 杯/ng ”/wyy 排球賽/n 中/f 奪冠/vi 。/wj
增加一個用戶單詞後分詞結果爲: 南京/ns 大學/n 地海學院/n 在/p 第12/m 屆/q “/wyz 南/b 大/a 杯/ng ”/wyy 排球賽/n 中/f 奪冠/vi 。/wj
刪除一個用戶單詞後分詞結果爲: 南京/ns 大學/n 地/ude2 海/n 學院/n 在/p 第12/m 屆/q “/wyz 南/b 大/a 杯/ng ”/wyy 排球賽/n 中/f 奪冠/vi 。/wj
導入2個用戶單詞
增加用戶詞典文件後分詞結果爲: 南京/ns 大學/n 地海學院/nr 在/p 第12/m 屆/q “/wyz 南大杯/n ”/wyy 排球賽/n 中/f 奪冠/vi 。/wj
3.總結:NLPIR/ICTCLAS 2016 分詞系統開發文檔 點擊可以下載最新的分詞開發文檔,其中“分詞功能C/C++”下面的方法基本都可以通過以上方法轉換爲java代碼實現,因爲C/C++/Java使用的是同一個系統支持庫NLPIR.dll。其他功能如:NLPIR_FileProcess、NLPIR_SaveTheUsrDic、NLPIR_GetNewWords、NLPIR_WordFreqStat等,使用java實現的方法如下:
(1)先去“分詞功能C/C++”章節下了解清楚方法的名稱、參數、返回類型等;比如NLPIR_WordFreqStat方法功能是獲取輸入文本的詞、詞性、頻統計結果,按照詞頻大小排序,參數有一個:sText表示輸入待處理的文本。返回的是詞頻統計結果形式如:張華平/nr/10#博士/n/9#分詞/n/8
(2)在CLibrary 接口中實現函數聲明,如
public interface CLibrary extends Library {
CLibrary Instance = (CLibrary) Native.loadLibrary("D:\\projects\\NLPIR\\libs\\win64\\NLPIR", CLibrary.class);
public int NLPIR_Init(String sDataPath, int encoding, String sLicenceCode);
public String NLPIR_ParagraphProcess(String sSrc, int bPOSTagged);
<span style="color:#ff0000;">//詞頻排序函數說明
public String NLPIR_WordFreqStat(String sText);</span>
String NLPIR_GetLastErrorMsg();
public void NLPIR_Exit();
}
(3)在主函數中使用該方法進行新詞發現,如
public static void main(String[] args) {
String argu = "D:\\projects\\NLPIR";
byte charset_type = 1;
int init_flag = CLibrary.Instance.NLPIR_Init(argu, charset_type, "0");
String nativeBytes = null;
if (init_flag == 0) {
nativeBytes = CLibrary.Instance.NLPIR_GetLastErrorMsg();
System.err.println("初始化失敗!fail reason is " + nativeBytes);
} else {
String sInput = "南京大學深圳研究院獲深圳市科技創新委多項表彰,南京大學校長出席表彰大會";
try {
<span style="color:#ff0000;">nativeBytes = CLibrary.Instance.NLPIR_WordFreqStat(sInput);</span>
System.out.println("詞頻排序結果: " + nativeBytes);
}catch (Exception var9) {
var9.printStackTrace();
}
}
}
詞頻排序結果: 南京/ns/2#大學/n/2#表彰/vn/2#深圳/ns/1#研究院/n/1#獲/v/1#深圳市/ns/1#科技/n/1#創新/vi/1#委/ng/1#多/m/1#項/q/1#,/wd/1#校長/n/1#出席/v/1#大會/n/1#