NLPIR/ICTCLAS 2015 分词系统使用
本文轉(zhuǎn)載以備查閱
自然 言的處理的第一步是分詞。近期使用了中科院分詞系統(tǒng)NLPIR/ICTCLAS 2016。在2014版本以及之前稱為ICTCLAS,之后的版本都更名為NLPIR。?新版簡介如下:
???????詞法分析是自然語言處理的基礎(chǔ)與關(guān)鍵。 張華平博士在多年研究工作積累的基礎(chǔ)上, 研制出了 NLPIR 分詞系統(tǒng), 主要功能包括中文分詞; 英文分詞; 詞性標注; 命名實體識別; 新詞識別; 關(guān)鍵詞提取; 支持用戶專業(yè)詞典與微博分析。 NLPIR系統(tǒng)支持多種編碼(GBK 編碼、 UTF8 編碼、 BIG5 編碼) 、 多種操作系統(tǒng)(Windows,Linux, FreeBSD 等所有主流操作系統(tǒng))、多種開發(fā)語言與平臺(包括:C/C++/C#,Java,Python,Hadoop 等)。
?????? 我的開發(fā)環(huán)境是eclipse,win10 64位操作系統(tǒng)。
????? ?首先下載兩個壓縮包,一個是分詞包一個接口包,ICTCLAS是純C編寫,在java上使用需要JNI也就是c語言加一個java接口,NLPIR有java版本,我使用的是ICTCLAS加一個接口的方法。分詞包下載地址:http://ictclas.nlpir.org/downloads,接口包下載地址(JNI):http://ictclas.nlpir.org/newsdownloads?DocId=384? 。?
分別解壓后待用。?
????????新建一個eclipse項目,將分詞包中Data目錄拷貝到file目錄;解壓開JNI包將NLPIR.dll動態(tài)鏈接庫放到項目目錄下,與file目錄同級。
???????自己修改編寫的測試及使用代碼如下:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import com.sun.jna.Library;
import com.sun.jna.Native;
import nlpir_SplitWord.NlpirTest.CLibrary;
/**
?* @title NlpirTest.java
?* @package nlpir_SplitWord
?* @description
?* @author huanggschn
?* @modifier huanggschn
?* @since:2016年8月17日
?* @version:1.0.0
?*/
public class NlpirTest {
// 定義接口 CLibrary,繼承自 com.sun.jna.Library
public interface CLibrary extends Library {
// 定義并初始化接口的靜態(tài)變量 這一個語句是來加載 dll 的,注意 dll 文件的路徑可以是絕對路徑也可以是相對路徑,只需要填寫 dll 的文件名,不能加后綴。
CLibrary Instance = (CLibrary) Native.loadLibrary("D:\\workspace\\PreProcessWord\\NLPIR", CLibrary.class);
/**
* 初始化函數(shù)聲明
* @param sDataPath
* @param encoding 編碼類型
* @param sLicenceCode
* @return
*/
public int NLPIR_Init(byte[] sDataPath, int encoding, byte[] sLicenceCode);
/**
* 導入用戶詞典函數(shù)聲明
* @param sFilename 用戶詞典文件名
* @param bOverwrite true:覆蓋已存在的詞典;false:補充已存在的詞典。默認為true
* @return ?成功導入的詞條數(shù)目
*/
public int NLPIR_ImportUserDict(String sFilename,boolean bOverwrite);
/**
* 執(zhí)行分詞函數(shù)聲明
* @param sSrc 待分詞的字符串
* @param bPOSTagged 判斷是否需要標注,0沒有標注,1有標簽,默認為1
* @return
*/
public String NLPIR_ParagraphProcess(String sSrc, int bPOSTagged);
/**
* 處理txt文件分詞
* @param sSourceFilename 待處理文件名
* @param sResultFilename 處理結(jié)果
* @param bPOStagged 是否需要POS標簽,0:沒有標簽,1:有標簽。默認為1
* @return
*/
public double NLPIR_FileProcess(String sSourceFilename,String sResultFilename,int bPOStagged) ;
/**
* 獲得分詞數(shù)目
* @param sParagraph 待分詞字符串
* @return
*/
public int NLPIR_GetParagraphProcessAWordCount(String sParagraph) ;
//public result_t ?NLPIR_ParagraphProcessA(String sParagraph,int pResultCount,boolean bUserDict);
/**
* 提取關(guān)鍵詞函數(shù)聲明
* @param sLine 待處理字符串
* @param nMaxKeyLimit ?關(guān)鍵詞個數(shù)最大值,默認50
* @param bWeightOut ?關(guān)鍵詞的權(quán)重是否輸出,默認false
* @return
*/
public String NLPIR_GetKeyWords(String sLine, int nMaxKeyLimit, boolean bWeightOut);
/**
*?
* @param sTextFile 待處理文件名
* @param nMaxKeyLimit 關(guān)鍵詞個數(shù)最大值,默認50
* @param bWeightOut 是否輸出權(quán)重
* @return ?關(guān)鍵字列表
*/
public String NLPIR_GetFileKeyWords(String sTextFile, int nMaxKeyLimit, boolean bWeightOut);
/**
* 增加用戶詞聲明
* @param sWord 要增加的用戶詞
* @return 增加成功返回1,否則返回0
*/
public int NLPIR_AddUserWord(String sWord);
/**
* 保存用戶詞典
* @return 保存成功返回1,失敗返回0
*/
public int NLPIR_SaveTheUsrDic();
/**
* 刪除用戶詞
* @param sWord
* @return sWord不存在用戶詞典中,返回-1;否則刪除該詞
*/
public int NLPIR_DelUsrWord(String sWord);
/**
* 導入關(guān)鍵詞黑名單:永遠不作為關(guān)鍵詞輸出
* @param sFilename
* @return
*/
public int NLPIR_ImportKeyBlackList(String sFilename);
/**
* 退出函數(shù)聲明
*/
public void NLPIR_Exit();
}
public static String getDevideWords(String sInput) throws Exception{
String argu = "";
String system_charset = "UTF-8";
int charset_type = 1;
int init_flag = CLibrary.Instance.NLPIR_Init(argu.getBytes(system_charset), charset_type,
"0".getBytes(system_charset));
if (0 == init_flag) {
System.err.println("初始化失敗!");
return "";
}
String devideWords = null;
try {
devideWords = CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 3);
CLibrary.Instance.NLPIR_Exit();//退出
} catch (Exception ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
return devideWords;
}
public static String getKeyWords(String sInput,int maxkeynum) throws Exception{
String argu = "";
String system_charset = "UTF-8";
int charset_type = 1;
int init_flag = CLibrary.Instance.NLPIR_Init(argu.getBytes(system_charset), charset_type,
"0".getBytes(system_charset));
if (0 == init_flag) {
System.err.println("初始化失敗!");
return "";
}
String keyWords = null;
try {
keyWords= CLibrary.Instance.NLPIR_GetKeyWords(sInput, maxkeynum, true);
CLibrary.Instance.NLPIR_Exit();//退出
} catch (Exception ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
return keyWords;
}
/**
? ? ?* 添加用戶詞典并進行詞性標注
? ? ?* @param filePath
? ? ?*/
? ? public static void AddUserWords(String filePath){
? ? ? ? try{
? ? ? ? ? ? String encoding = "UTF-8";
? ? ? ? ? ? File file = new File(filePath);
? ? ? ? ? ? if(file.isFile()&&file.exists()){
? ? ? ? ? ? ? ? InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);
? ? ? ? ? ? ? ? BufferedReader bufferReader = new BufferedReader(read);
? ? ? ? ? ? ? ? String lineText = "";
? ? ? ? ? ? ? ? while((lineText = bufferReader.readLine()) != null){
? ? ? ? ? ? ? ? ? ? CLibrary.Instance.NLPIR_AddUserWord(lineText);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? else{
? ? ? ? ? ? ? ? System.out.println("詞典文件不存在!");
? ? ? ? ? ? }
? ? ? ? }catch(Exception e){
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
public static void main(String[] args) throws Exception {
long bs = Calendar.getInstance().getTimeInMillis();
String path = "D:\\DataResult\\result.txt";
List<String> source = new ArrayList<String>();
source=ReadTxt.readOneTxt(path);
String sInput =source.get(0);
String devideWords=getDevideWords(sInput);
System.out.println("分詞結(jié)果是:" + devideWords);
String keyWords=getKeyWords(sInput,10);
System.out.println("關(guān)鍵詞提取結(jié)果是:" + keyWords);
System.out.print("time : ");
System.out.println(Calendar.getInstance().getTimeInMillis() - bs);
}
}
?新版本有離線導入用戶詞典的小工具,使用起來也極為方便。相應文件夾內(nèi)容如下:點開Readme.txt按照指示即可完成用戶詞典的導入。
? ? ?下面簡要介紹另外幾款開源中文分詞系統(tǒng)。??
1、HTTPCWS – 基于HTTP協(xié)議的開源中文分詞系統(tǒng)
??????? HTTPCWS 是一款基于HTTP協(xié)議的開源中文分詞系統(tǒng),目前僅支持Linux系統(tǒng)。HTTPCWS 使用“ICTCLAS 3.0 2009共享版中文分詞算法”的API進行分詞處理,得出分詞結(jié)果。
??????? ICTCLAS是中國科學院計算技術(shù)研究所在多年研究工作積累的基礎(chǔ)上,基于多層隱馬模型研制出的漢語詞法分析系統(tǒng),主要功能包括中文分詞;詞性標注;命 名實體識別;新詞識別;同時支持用戶詞典。ICTCLAS經(jīng)過五年精心打造,內(nèi)核升級6次,目前已經(jīng)升級到了ICTCLAS3.0,分詞精度 98.45%,各種詞典數(shù)據(jù)壓縮后不到3M。ICTCLAS在國內(nèi)973專家組組織的評測中活動獲得了第一名,在第一屆國際中文處理研究機構(gòu)SigHan 組織的評測中都獲得了多項第一名,是當前世界上最好的漢語詞法分析器。
??????? ICTCLAS 3.0 商業(yè)版是收費的,而免費提供的 ICTCLAS 3.0 共享版不開源,詞庫是根據(jù)人民日報一個月的語料得出的,很多詞語不存在。所以本人補充的一個19萬條詞語的自定義詞庫,對ICTCLAS分詞結(jié)果進行合并 處理,輸出最終分詞結(jié)果。
??????? 由于 ICTCLAS 3.0 2009 共享版只支持GBK編碼,因此,如果是UTF-8編碼的字符串,可以先用iconv函數(shù)轉(zhuǎn)換成GBK編碼,再用httpcws進行分詞處理,最后轉(zhuǎn)換回UTF-8編碼。
??????? HTTPCWS 軟件自身(包括httpcws.cpp源文件、dict/httpcws_dict.txt自定義詞庫)采用NewBSD開源協(xié)議,可以自由修改。 HTTPCWS 使用的 ICTCLAS 共享版 API 及 dict/Data/ 目錄內(nèi)的語料庫,版權(quán)及著作權(quán)歸中國科學院計算技術(shù)研究所、ictclas.org所有,使用需遵循其相關(guān)協(xié)議。
系統(tǒng)平臺:Linux
開發(fā)語言:C++
使用方式:HTTP服務
演示網(wǎng)址:http://blog.s135.com/demo/httpcws/
開源官網(wǎng):http://blog.s135.com/httpcws_v100/
2、SCWS – 簡易中文分詞系統(tǒng)
??????? SCWS 在概念上并無創(chuàng)新成分,采用的是自行采集的詞頻詞典,并輔以一定程度上的專有名稱、人名、地名、數(shù)字年代等規(guī)則集,經(jīng)小范圍測試大概準確率在 90% ~ 95% 之間,已能基本滿足一些中小型搜索引擎、關(guān)鍵字提取等場合運用。 SCWS 采用純 C 代碼開發(fā),以 Unix-Like OS 為主要平臺環(huán)境,提供共享函數(shù)庫,方便植入各種現(xiàn)有軟件系統(tǒng)。此外它支持 GBK,UTF-8,BIG5 等漢字編碼,切詞效率高。
系統(tǒng)平臺:Windows/Unix
開發(fā)語言:C
使用方式:PHP擴展
演示網(wǎng)址:http://www.ftphp.com/scws/demo.php
開源官網(wǎng):http://www.ftphp.com/scws/
3、PhpanAlysis?- PHP無組件分詞系統(tǒng)
??????? PhpanAlysis分詞系統(tǒng)是基于字符串匹配的分詞方法 ,這種方法又叫做機械分詞方法,它是按照一定的策略將待分析的漢字串與一個“充分大的”機器詞典中的詞條進行配,若在詞典中找到某個字符串,則匹配成功 (識別出一個詞)。按照掃描方向的不同,串匹配分詞方法可以分為正向匹配 和逆向匹配;按照不同長度優(yōu)先匹配的情況,可以分為最大(最長)匹配和最小(最短)匹配;按照是否與詞性標注過程相結(jié)合,又可以分為單純分詞方法和分詞與 標注相結(jié)合的一體化方法。?
系統(tǒng)平臺:PHP環(huán)境
開發(fā)語言:PHP
使用方式:HTTP服務
演示網(wǎng)址:http://www.itgrass.com/phpanalysis/
開源官網(wǎng):http://www.itgrass.com/phpanalysis/
轉(zhuǎn)載地址
總結(jié)
以上是生活随笔為你收集整理的NLPIR/ICTCLAS 2015 分词系统使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅谈“微服务”
- 下一篇: linus下centos7防火墙设置