怎麼用ICTCLAS分詞系統對一個TXT文檔裡面的所有中文語料進行分詞操作,求大神指點,越詳細越好
ICTCLAS分詞系統可以高效地實現分詞。下面把過程貼出來。
使用方法,首先到網上下載ICTCLAS,因為我是windows下的C++實現,所以在http://ictclas.org/ictclas_download.aspx下載ICTCLAS2011_Windows_32_c,解壓,裡面有很好的Demo,Doc,copy API目錄下的所有文件(夾)到你所在的工程,在你的源文件加上
#include "ICTCLAS50.h"
#pragma comment(lib, "ICTCLAS50.lib") //ICTCLAS50.lib庫加入到工程中
//
//your code here,可參考Demo裡面的代碼
//
即可。
大概的函數C++函數接口都在Doc文件下的文檔中:
bool ICTCLAS_Init(const char* pszInitDir=NULL);初始化函數
返回值
如果初始化成功返回true, 否則返回false. 如初始化不成功,請查看ictclas.log文件了解詳細錯誤原因.
參數
pszInitDir:初始化路徑,應包含配置文件(Configure.xml)和詞典目錄(Data目錄)以及授權文件(user.lic). 如果這些文件及目錄在系統運行當前目錄下,此參數可以為null。
bool ICTCLAS_Exit( );退出,釋放內存
返回值
成功返回true;否則返回false。
unsigned int ICTCLAS_ImportUserDict(const char *sFilename,eCodeType eCT)
//導入用戶自定義詞典
返回值
導入成功的詞的個數
參數
sFilename: 用戶定義詞典文件
eCT:編碼格式
int ICTCLAS_ParagraphProcess(const char sParagraph,int nPaLen,eCodeType eCt,int bPOStagged,char sResult);//對一段文字進行分詞
返回值
返回結果緩沖區的指針(sResult)以及結果的長度R
參數
sParagraph: 原始文字段
nPaLen: 文字段的長度
eCodeType: 文字段的編碼格式
bPOStagged: 需不需要根據標注集做標記 0 = 做標記 ; 1 = 不標記; 默認為1.
sResult: 輸出結果
t_pstRstVec ICTCLAS_ParagraphProcessA(const char *sParagraph,int PaLen,eCodeType eCodeType,int bPOStagged,int &nRstCnt);
//處理文字段
返回值
結果vector的指針,系統調用,用戶無法分配以及釋放
struct stResult{
int start; //start position
int length; //length
#ifdef POS_TAGGER
int iPOS; //POS
char sPOS[POS_SIZE];//word type
#endif
int word_ID; //word_ID
int word_type; //Is the word of the user's dictionary?(0-no,1-yes)
int weight;// word weight
};
參數
sParagraph: 原始文字段
nPaLen: 文字段長度
eCodeType: 編碼格式
bPOStagged:
需不需要根據標注集做標記 0 = 做標記 ; 1 = 不標記; 默認為1.
nRstcnt: 處理結果的長度值。
詳細用法參見Doc文件。
bool ICTCLAS_FileProcess(const char *sSrcFilename,eCodeType eCt,const char *sDsnFilename,int bPOStagged);//處理txt文件
返回值
處理文本文件成功返回true, 否則返回false
參數
sSourceFilename: 原始處理文件
eCodeType: 原始文件編碼格式
sDsnFilename: 存儲結果的文件名T
bPOStagged: 需不需要根據標注集做標記 0 = 做標記 ; 1 = 不標記; 默認為1.
注意事項
調用此函數之前需要調用init函數成功,輸出格式可以通過ICTCLAS 配置來更改,這個需要研究下配置文件。
int ICTCLAS_SetPOSmap(int nPOSmap);//設置標注集
返回值
成功為1,其他為0
參數
nPOSmap :
ICT_POS_MAP_FIRST 計算所一級標注集
ICT_POS_MAP_SECOND 計算所二級標注集 PKU_POS_MAP_SECOND 北大二級標注集 PKU_POS_MAP_FIRST 北大一級標注集
int ICTCLAS_GetWordId(const char *sWord,int nWrdLen,eCodeType eCT);
返回值
單詞的ID(我覺得是詞典裡面的存儲位置,不清楚詞典的具體結構)
參數
sWord: 目標單詞
nWrdLen: 單詞長度
eCodeType: 編碼格式
bool ICTCLAS_ResultFree ( t_pstRstVec pRetVec)
//釋放調用ICTCLAS_ParagraphProcessAW得到的vector指針
返回值
成功為1,失敗為0
參數
t_pstRstVec: ICTCLAS_ParagraphProcessAW得到的vector指針
總結:這些函數都很好用,我需要使用處理文件函數ICTCLAS_FileProcess我出現的問題是:單獨調用這個函數沒有問題,但是在MFC界面調用兩個選擇打開文件路徑和保存結果文件路徑的CFileDialog以後就會出現ICTCLAS_Init初始化失敗!郁悶了半天,查看ICTCLAS.log文件,
Default Path : E:\test_ICTCLAS\test_ICTCLAS\test_ICTCLAS
start lic check.
License succeed!Cannot open user dictionary
E:\test_ICTCLAS\test_ICTCLAS\test_ICTCLAS\Data\UserDict.pdat.
Cannot open file E:\test_ICTCLAS\test_ICTCLAS\test_ICTCLAS\Data\UserDict.map.
Cannot open user dictionary E:\test_ICTCLAS\test_ICTCLAS\test_ICTCLAS\Data\UserDict.pos.
Load dictionary down!
並沒有異常,加載失敗是因為並沒有自定義詞典。
仔細排查,發現bool ICTCLAS_Init(const char* pszInitDir=NULL)有一個默認的工作路徑,在沒有打開CFileDialog的時候默認的路徑是exe文件執行路徑,但是打開以後若不進行設置,會改變工作路徑!這就是為什麼點擊CFileDialog路徑更改,找不到路徑下的文件,當然無法初始化了!( pszInitDir:初始化路徑,應包含配置文件(Configure.xml)和詞典目錄(Data目錄)以及授權文件(user.lic). 如果這些文件及目錄在系統運行當前目錄下,此參數可以為null)
解決方案:
方案1. 在每次調用CFileDialog打開文件後重新設置工作路徑
方案2. 在程序中使用絕對路徑
方案3. CFileDialog的構造函數有8個參數,平時為了省事一般只是指定第一個。其實解決這個問題,只要在第四個參數dwFlags中加上OFN_NOCHANGEDIR即可
我使用第三個方法解決了^_^!