中科院分词系统(NLPIR)JAVA简易教程
這篇文檔內(nèi)容主要從官方文檔中獲取而來,對API進(jìn)行了翻譯,并依據(jù)個人使用經(jīng)驗(yàn)進(jìn)行了一些補(bǔ)充,鑒于能力有限、水平較低,文檔中肯定存在有很多不足之處,還請見諒。
下載地址:http://ictclas.nlpir.org/downloads,下載最新的NLPIR/ICTCLAS分詞系統(tǒng)下載包
授權(quán)文件下載地址:https://github.com/NLPIR-team/NLPIR/tree/431b6351f30ed7d606ac50fde1f4456c596998df/License
NLPIR是用C/C++編寫的,如果要用Java來使用NLPIR,需要通過JNA調(diào)用NLPIR的函數(shù)來實(shí)現(xiàn)。下面通過一個示例來進(jìn)行說明:
首先新建一個JAVA項(xiàng)目,導(dǎo)入JNA的jar包(可從下載包中的sample\JnaTest_NLPIR\lib文件夾中拷貝),將下載包中的Data文件夾拷貝到項(xiàng)目根目錄中,再將lib文件夾中與你操作系統(tǒng)對應(yīng)的文件夾中的NLPIR.dll和NLPIR.lib文件拷貝到系統(tǒng)根目錄中,不妨新建一個名為source的文件夾,放到那里面去。我的目錄如下圖所示:
然后新建一個接口,繼承JNA的Library接口,在接口中定義對NLPIR一系列函數(shù)的實(shí)現(xiàn)(具體API可參見下方我翻譯的API或參看include文件夾中的頭文件NLPIR.h)。
[java] view plaincopy
再新建一個類,實(shí)例化上面的接口后,就可以調(diào)用NLPIR的各個函數(shù)了。
[java] view plaincopy
其中我在source文件夾中添加了一個用戶詞典userdic.txt,在程序運(yùn)行時導(dǎo)入到系統(tǒng)中,該文件內(nèi)容如下:
前重后輕 nr
對TXT文件進(jìn)行分詞處理時需要用到的3個TXT文件,分別如下所示:
1.txt作為從文件內(nèi)容進(jìn)行分詞操作的文件源,其內(nèi)容如下:
曾經(jīng)有一份真摯的感情擺在我的面前我沒有珍惜,等我失去的時候才追悔莫及,人間最痛苦的事莫過于此,你的劍在我的咽喉上刺下去吧,不用在猶豫了!如果上天能給我一次再來一次的機(jī)會,我會對哪個女孩說三個字:我愛你,如果非要在這份愛上加一個期限,我希望是一萬年!2.txt作為對1.txt進(jìn)行分詞處理的結(jié)果接收文件,為一個空文件,運(yùn)行后其內(nèi)容如下:
曾經(jīng)/d 有/vyou 一/m 份/q 真摯/a 的/ude1 感情/n 擺/v 在/p 我/rr 的/ude1 面前/f 我/rr 沒有/d 珍惜/v ,/wd 等/udeng 我/rr 失去/v 的/ude1 時候/n 才/d 追悔莫及/vl ,/wd 人間/n 最/d 痛苦/a 的/ude1 事/n 莫過于/vl 此/rzs ,/wd 你/rr 的/ude1 劍/n 在/p 我/rr 的/ude1 咽喉/n 上/f 刺/v 下去/vf 吧/y ,/wd 不/d 用/v 在/p 猶豫/a 了/y !/wt 如果/c 上/f 天/qt 能/v 給/p 我/rr 一/m 次/qv 再/d 來/vf 一/m 次/qv 的/ude1 機(jī)會/n ,/wd 我/rr 會/v 對/p 哪個/ry 女孩/n 說/v 三/m 個/q 字/n :/wp 我/rr 愛/v 你/rr ,/wd 如果/c 非/b 要/v 在/p 這/rzv 份/q 愛上/v 加/v 一個/mq 期限/n ,/wd 我/rr 希望/v 是/vshi 一/m 萬/m 年/qt !/wt3.txt作為從內(nèi)容提取關(guān)鍵詞的文件源,其內(nèi)容如下:
你把胡子剃光干什么?你不知不知道你少了胡子一點(diǎn)性格都沒有了……唉~文也不行武也不行,你不做山賊,你想做狀元啊?省省吧你!改變什么形象,好好的做你山賊這份很有前途的職業(yè)去吧!?
程序運(yùn)行結(jié)果如下:
分詞結(jié)果為:
哎/e ~/w 那個/rz 金剛/n 圈/qv 尺寸/n 太/d 差/a ,/wd 前重后輕/nr ,/wd 左寬/nr 右/f 窄/a ,/wd 他/rr 戴/v 上/f 去/vf 很/d 不/d
舒服/a ,/wd 整/v 晚/tg 失眠/vi 會/v 連累/v 我/rr 嘛/y ,/wd 他/rr 雖然/c 是/vshi 只/q 猴子/n ,/wd 但/c 你/rr 也/d 不/d 能/v
這樣/rzv 對/p 他/rr 啊/y ,/wd 官府/n 知道/v 會/v 說/v 我/rr 虐待/v 動物/n 的/ude1 ,/wd 說/v 起/vf 那個/rz 金剛/n 圈/qv ,/wd
啊/y ~/w 去年/t 我/rr 在/p 陳家村/nr 認(rèn)識/v 了/ule 一個/mq 鐵匠/n ,/wd 他/rr 手工/d 精美/a ,/wd 價錢/n 又/d 公道/a ,/wd 童叟無欺
/vl ,/wd 干脆/d 我/rr 介紹/v 你/rr 再/d 定做/v 一個/mq 吧/y !/wt?
增加用戶詞典后分詞結(jié)果為:
哎/e ~/w 那個/rz 金剛?cè)?n 尺寸/n 太/d 差/a ,/wd 前重后輕/nr ,/wd 左寬右窄/n ,/wd 他/rr 戴/v 上/f 去/vf 很/d 不/d 舒服/a ,/wd 整
/v 晚/tg 失眠/vi 會/v 連累/v 我/rr 嘛/y ,/wd 他/rr 雖然/c 是/vshi 只/q 猴子/n ,/wd 但/c 你/rr 也/d 不/d 能/v 這樣/rzv 對/p?
他/rr 啊/y ,/wd 官府/n 知道/v 會/v 說/v 我/rr 虐待/v 動物/n 的/ude1 ,/wd 說/v 起/vf 那個/rz 金剛?cè)?n ,/wd 啊/y ~/w 去年/t 我/
rr 在/p 陳家村/nr 認(rèn)識/v 了/ule 一個/mq 鐵匠/n ,/wd 他/rr 手工/d 精美/a ,/wd 價錢/n 又/d 公道/a ,/wd 童叟無欺/vl ,/wd 干脆/d 我/
rr 介紹/v 你/rr 再/d 定做/v 一個/mq 吧/y !/wt?
刪除用戶詞典后分詞結(jié)果為:
哎/e ~/w 那個/rz 金剛?cè)?n 尺寸/n 太/d 差/a ,/wd 前重后輕/nr ,/wd 左寬/nr 右/f 窄/a ,/wd 他/rr 戴/v 上/f 去/vf 很/d 不/d 舒服/a
,/wd 整/v 晚/tg 失眠/vi 會/v 連累/v 我/rr 嘛/y ,/wd 他/rr 雖然/c 是/vshi 只/q 猴子/n ,/wd 但/c 你/rr 也/d 不/d 能/v 這樣/r
zv 對/p 他/rr 啊/y ,/wd 官府/n 知道/v 會/v 說/v 我/rr 虐待/v 動物/n 的/ude1 ,/wd 說/v 起/vf 那個/rz 金剛?cè)?n ,/wd 啊/y ~/w?
去年/t 我/rr 在/p 陳家村/nr 認(rèn)識/v 了/ule 一個/mq 鐵匠/n ,/wd 他/rr 手工/d 精美/a ,/wd 價錢/n 又/d 公道/a ,/wd 童叟無欺/vl ,/wd?
干脆/d 我/rr 介紹/v 你/rr 再/d 定做/v 一個/mq 吧/y !/wt?
導(dǎo)入用戶詞典文件后分詞結(jié)果為:
哎/e ~/w 那個/rz 金剛?cè)?n 尺寸/n 太/d 差/a ,/wd 前重后輕/nr ,/wd 左寬/nr 右/f 窄/a ,/wd 他/rr 戴/v 上/f 去/vf 很/d 不/d 舒服/a
,/wd 整/v 晚/tg 失眠/vi 會/v 連累/v 我/rr 嘛/y ,/wd 他/rr 雖然/c 是/vshi 只/q 猴子/n ,/wd 但/c 你/rr 也/d 不/d 能/v 這樣/r
zv 對/p 他/rr 啊/y ,/wd 官府/n 知道/v 會/v 說/v 我/rr 虐待/v 動物/n 的/ude1 ,/wd 說/v 起/vf 那個/rz 金剛?cè)?n ,/wd 啊/y ~/w?
去年/t 我/rr 在/p 陳家村/nr 認(rèn)識/v 了/ule 一個/mq 鐵匠/n ,/wd 他/rr 手工/d 精美/a ,/wd 價錢/n 又/d 公道/a ,/wd 童叟無欺/vl ,/wd?
干脆/d 我/rr 介紹/v 你/rr 再/d 定做/v 一個/mq 吧/y !/wt?
從段落中提取的關(guān)鍵詞:
前重后輕#陳家村#左寬#金剛?cè)?
新詞提取結(jié)果為:
對文件內(nèi)容進(jìn)行分詞的運(yùn)行速度為:?
0.76秒
從文件中提取關(guān)鍵詞的結(jié)果為:
胡子#形象#職業(yè)#前途#
?
分詞后每個詞后面都跟著詞性標(biāo)記(bPOSTagged參數(shù)為1時,輸出結(jié)果顯示標(biāo)記;為0時,不現(xiàn)實(shí)標(biāo)記),并彼此以空格分隔;提取的關(guān)鍵詞則以#號分隔;因輸入的文字沒有新詞,均能被識別,所以新詞提取結(jié)果為空。各函數(shù)的具體使用可參考下面我翻譯的API。
?
我對NLPIR系統(tǒng)的接口函數(shù)說明進(jìn)行了簡單的翻譯,如下所示:
1. NLPIR_Init
初始化分析器,并根據(jù)配置文件為NLPIR準(zhǔn)備數(shù)據(jù)。
函數(shù)形式:
bool NLPIR_Init(const char* sInitDirPath=0, int encoding=GBK_CODE,
const char* sLicenceCode=0)
需要的頭文件:<NLPIR.h>
返回值:
如果初始化成功,返回successed,否則返回false。
參數(shù):
char*?sInitDirPath:指定存放配置文件Configure.xml和Data文件的路徑,默認(rèn)值為0,表明路徑為當(dāng)前工作目錄。
int?encoding: 編碼格式標(biāo)識符,默認(rèn)為GBK_CODE ,也可以設(shè)置為UTF8_CODE和BIG5_CODE。
char*??sLicenceCode: 商業(yè)用戶需要使用的許可證編碼,免費(fèi)用戶無需使用該參數(shù)。
說明:
使用NLPIR時必須先執(zhí)行NLPIR_Init函數(shù)(只需執(zhí)行一次)。系統(tǒng)關(guān)閉時還應(yīng)執(zhí)行NLPIR_Exit函數(shù)來銷毀緩存數(shù)據(jù)。
NLPIR_Init執(zhí)行失敗通常有兩個原因:1. 需要的數(shù)據(jù)文件格式不兼容或丟失;2.配置文件丟失或存在非法參數(shù)。還可以通過日志文件來了解更多信息,日志文件存放在默認(rèn)路徑中。
?
?
2. NLPIR_Exit
退出程序并釋放所有資源和NLPIR使用的緩存數(shù)據(jù)。
函數(shù)形式:
bool NLPIR_Exit();
需要的頭文件:<NLPIR.h>
返回值:
執(zhí)行成功返回successed,否則返回false。
參數(shù):
無
說明:
該函數(shù)必須在關(guān)閉系統(tǒng)時執(zhí)行,若需重啟NLPIR,再次執(zhí)行NLPIR_Init函數(shù)即可。
?
?
3. NLPIR_ImportUserDict
從文件中導(dǎo)入用戶自定義的詞典。
函數(shù)形式:
unsigned int NLPIR_ImportUserDict(const char * sFilename);
需要的頭文件:<NLPIR.h>
返回值:
導(dǎo)入的詞匯數(shù)量。
參數(shù):
char *?sFilename: 要導(dǎo)入的用戶詞典文件所在路徑。
說明:
該函數(shù)只有在NLPIR_Init函數(shù)執(zhí)行成功后才能使用。詞典文件的格式請參見相關(guān)示例。
你只需在更改了用戶詞典或第一次使用某個詞典時執(zhí)行該函數(shù),當(dāng)配置文件中的UserDict參數(shù)為on時,NLPIR將會(把該詞典添加到配置文件中)并在啟動時自動加載該詞典。當(dāng)將UserDict置為off時,用戶自定義詞典文件將不再自動導(dǎo)入。
?
?
4. NLPIR_ParagraphProcess
處理一個段落文字,返回運(yùn)行結(jié)果緩存的指針。
函數(shù)形式:
const char * NLPIR_ParagraphProcess(const char * sParagraph, int bPOStagged=1);
需要的頭文件:<NLPIR.h>
返回值:
運(yùn)行結(jié)果緩存的指針。
參數(shù):
char *?sParagraph: 輸入段落的源
int?bPOStagged:? 判斷是否需要位置標(biāo)記,0:無標(biāo)記;1:有標(biāo)記。默認(rèn)值為1。
說明:
該函數(shù)只有在NLPIR_Init函數(shù)執(zhí)行成功后才能使用
?
?
5. NLPIR_ParagraphProcessA
函數(shù)形式:
result_t * NLPIR_ParagraphProcessA(
const char * sParagraph, int * pResultCount, bool bUserDict=true)
需要的頭文件:<NLPIR.h>
返回值:
運(yùn)行結(jié)果向量的指針,該指針由系統(tǒng)進(jìn)行管理,用戶無法對它進(jìn)行分配和釋放。
其結(jié)構(gòu)如下:
struct result_t{
int start; //start position,詞語在輸入句子中的開始位置
int length; //length,詞語的長度
char sPOS[POS_SIZE];//word type,詞性ID值,可以快速的獲取詞性表
int? iPOS;//詞性
int word_ID; //如果是未登錄詞,設(shè)成或者-1
int word_type; //區(qū)分用戶詞典;1,是用戶詞典中的詞;,非用戶詞典中的詞
int weight;// word weight
};
參數(shù):
char *?sParagraph: 輸入段落的源
int *?pResultCount: 結(jié)果向量的大小
bool?bUserDict:是否使用用戶詞典
說明:
該函數(shù)只有在NLPIR_Init函數(shù)執(zhí)行成功后才能使用
?
?
6. NLPIR_FileProcess
處理一個TXT文件。
函數(shù)形式:
Double NLPIR_FileProcess(const char * sSourceFilename,
const char * sResultFilename, int bPOStagged=1);
需要的頭文件:<NLPIR.h>
返回值:
如果執(zhí)行成功,返回處理速度值,否則返回false。
參數(shù):
char * sSourceFilename: 要處理的源文件名稱;
char * sResultFilename: 存儲處理結(jié)果的文件名稱;
int bPOStagged:? 判斷是否需要位置標(biāo)記,0:無標(biāo)記;1:有標(biāo)記。默認(rèn)值為1。說明:
該函數(shù)只有在NLPIR_Init函數(shù)執(zhí)行成功后才能使用
處理結(jié)果的輸出格式可在配置文件中進(jìn)行設(shè)置。
?
?
7. NLPIR_GetParagraphProcessAWordCount
NLPIR_ParagraphProcessA函數(shù)的C#實(shí)現(xiàn)API。
函數(shù)形式:
int NLPIR_GetParagraphProcessAWordCount(const char *sParagraph);
需要的頭文件:<NLPIR.h>
返回值:
返回輸入段落的詞匯數(shù)量。
參數(shù):
char *?sParagraph: 輸入段落的源
說明:
該函數(shù)只有在NLPIR_Init函數(shù)執(zhí)行成功后才能使用
處理結(jié)果的輸出格式可在配置文件中進(jìn)行設(shè)置。
?
?
8. NLPIR_ ParagraphProcessAW
NLPIR_ParagraphProcessA函數(shù)的C#實(shí)現(xiàn)API。
函數(shù)形式:
void NLPIR_ParagraphProcessAW(int nCount,result_t * result);
需要的頭文件:<NLPIR.h>
返回值:
無。
參數(shù):
nCount: 輸入段落的詞匯數(shù)量;
result: 處理結(jié)果的結(jié)構(gòu)體指針;
說明:
該函數(shù)只有在NLPIR_Init函數(shù)執(zhí)行成功后才能使用
處理結(jié)果的輸出格式可在配置文件中進(jìn)行設(shè)置。
?
?
9. NLPIR_AddUserWord
向用戶詞典添加一個詞匯。
函數(shù)形式:
int NLPIR_AddUserWord(const char * sWord);
需要的頭文件:<NLPIR.h>
返回值:
如果添加成功,返回successed,否則返回false。
參數(shù):
char *?sWord:要添加的詞匯。
說明:
該函數(shù)只有在NLPIR_Init函數(shù)執(zhí)行成功后才能使用
?
?
10. NLPIR_SaveTheUsrDic
將用戶詞典保存至硬盤。
函數(shù)形式:
int NLPIR_SaveTheUsrDic();
需要的頭文件:<NLPIR.h>
返回值:
如果執(zhí)行成功返回1,否則返回0。
參數(shù):
無
說明:
該函數(shù)只有在NLPIR_Init函數(shù)執(zhí)行成功后才能使用
?
11. NLPIR_DelUsrWord
從用戶詞典中刪除一個詞匯。
函數(shù)形式:
int NLPIR_DelUsrWord(const char * sWord);
需要的頭文件:<NLPIR.h>
返回值:
如果要刪除的詞匯不存在,則返回-1;如果刪除成功,則返回該詞匯的句柄。
參數(shù):
char *?sWord:要刪除的詞匯。
說明:
該函數(shù)只有在NLPIR_Init函數(shù)執(zhí)行成功后才能使用
?
12. NLPIR_GetKeyWords
從輸入的段落中提取關(guān)鍵詞。
函數(shù)形式:
const char * NLPIR_GetKeyWords(const char * sLine,int nMaxKeyLimit=50,
bool bWeightOut=false);
需要的頭文件:<NLPIR.h>
返回值:
如果執(zhí)行成功,返回執(zhí)行結(jié)果列表。如果執(zhí)行失敗,返回NULL。
格式如下:
"科學(xué)發(fā)展觀 宏觀經(jīng)濟(jì) "
或者
"科學(xué)發(fā)展觀 23.80 宏觀經(jīng)濟(jì) 12.20" (帶有權(quán)值)
參數(shù):
char *?sLine:輸入的段落;
int?nMaxKeyLimit:關(guān)鍵詞最大數(shù)量;
bool?bWeightOut: 是否輸出權(quán)值;
說明:
無。
?
13. NLPIR_GetFileKeyWords
從TXT文件中提取關(guān)鍵詞。
函數(shù)形式:
const char * NLPIR_GetFileKeyWords(const char * sTextFile,
int nMaxKeyLimit=50, bool bWeightOut=false);
需要的頭文件:<NLPIR.h>
返回值:
如果執(zhí)行成功,返回執(zhí)行結(jié)果列表。如果執(zhí)行失敗,返回NULL。格式同上。
參數(shù):
char *?sTextFile:輸入文件的名稱;
int?nMaxKeyLimit:關(guān)鍵詞最大數(shù)量;
bool?bWeightOut: 是否輸出權(quán)值;
說明:
無
?
14. NLPIR_GetNewWords
從段落中提取新詞。
函數(shù)形式:
const char * NLPIR_GetNewWords(const char * sLine, int nMaxKeyLimit=50,
bool bWeightOut=false);
需要的頭文件:<NLPIR.h>
返回值:
如果執(zhí)行成功,返回提取到的新詞列表,否則返回NULL。格式同上
參數(shù):
char *?sLine:輸入的段落;
int?nMaxKeyLimit:關(guān)鍵詞最大數(shù)量;
bool?bWeightOut: 是否輸出權(quán)值;
說明:
無
?
15. NLPIR_GetFileNewWords
從TXT文件中提取新詞。
函數(shù)形式:
const char * NLPIR_GetFileNewWords(const char * sTextFile,
int nMaxKeyLimit=50, bool bWeightOut=false);
需要的頭文件:<NLPIR.h>
返回值:
如果執(zhí)行成功,返回提取到的新詞列表,否則返回NULL。格式同上
參數(shù):
char *?sTextFile:輸入文件的名稱;
int?nMaxKeyLimit:關(guān)鍵詞最大數(shù)量;
bool?bWeightOut: 是否輸出權(quán)值;
說明:
無
16. NLPIR_FingerPrint
提取段落的一個指紋。
函數(shù)形式:
unsigned long NLPIR_FingerPrint(const char * sLine);
需要的頭文件:<NLPIR.h>
返回值:
如果執(zhí)行成功,返回指紋值,否則返回0。
參數(shù):
char *?sLine:輸入的段落;
說明:
無。
?
17. NLPIR_SetPOSmap
設(shè)置使用的POS map。
函數(shù)形式:
int NLPIR_SetPOSmap(int nPOSmap);
需要的頭文件:<NLPIR.h>
返回值:
如果執(zhí)行成功,返回1,否則返回0。
參數(shù):
int?nPOSmap?:??
ICT_POS_MAP_FIRST? 計(jì)算所一級標(biāo)注集
ICT_POS_MAP_SECOND? 計(jì)算所二級標(biāo)注集
PKU_POS_MAP_SECOND? 北大二級標(biāo)注集
PKU_POS_MAP_FIRST??? 北大一級標(biāo)注集
說明:
該函數(shù)只有在NLPIR_Init函數(shù)執(zhí)行成功后才能使用
?
?
18. NLPIR_GetLastErrorMsg
獲取最近一條報錯信息。
函數(shù)形式:
const char * NLPIR_GetLastErrorMsg();
需要的頭文件:<NLPIR.h>
返回值:
獲取最近一條報錯信息的指針。
參數(shù):
無。
說明:
無。
?
以下為新詞識別函數(shù),建議脫機(jī)使用。
1. NLPIR_NWI_Start
啟動新詞識別。
函數(shù)形式:
bool NLPIR_NWI_Start();
需要的頭文件:<NLPIR.h>
返回值:
如果執(zhí)行成功,返回successed,否則返回false。
參數(shù):
無
?
?
2. NLPIR_NWI_AddFile
往新詞識別系統(tǒng)中添加待識別新詞的文本文件,需要在運(yùn)行 NLPIR_NWI_Start()之后,才有效。
函數(shù)形式:
Int NLPIR_NWI_AddFile(const char * sFilename);
需要的頭文件:<NLPIR.h>
返回值:
如果執(zhí)行成功,返回true,否則返回false。
參數(shù):
char *sFilename:輸入的文件名;
?
?
3. NLPIR_NWI_AddMem
往新詞識別系統(tǒng)中添加一段待識別新詞的內(nèi)存,需要在運(yùn)行 NLPIR_NWI_Start()之后,才有效。
函數(shù)形式:
bool NLPIR_NWI_AddMem(const char *sText);
需要的頭文件:<NLPIR.h>
返回值:
如果執(zhí)行成功,返回true,否則返回false。
參數(shù):
char *sFilename:文件名
?
?
4. NLPIR_NWI_Complete
新詞識別添加內(nèi)容結(jié)束,需要在運(yùn)行 NLPIR_NWI_Start()之后,才有效。
函數(shù)形式:
bool NLPIR_NWI_Complete();
需要的頭文件:<NLPIR.h>
返回值:
如果執(zhí)行成功,返回true,否則返回false。
參數(shù):
無。
說明:
?
?
5. NLPIR_NWI_GetResult
獲取新詞識別的結(jié)果。
函數(shù)形式:
const char * NLPIR_NWI_GetResult(bool bWeightOut=false);
需要的頭文件:<NLPIR.h>
返回值:
執(zhí)行結(jié)果的列表。
參數(shù):
bool bWeightOut:是否輸出權(quán)重值。
?
6. NLPIR_NWI_Result2UserDict
將新詞識別結(jié)果導(dǎo)入到用戶詞典中,需要在運(yùn)行 NLPIR_NWI_Complete()之后,才有效,如果需要將新詞結(jié)果永久保存,建議在執(zhí)行NLPIR_SaveTheUsrDic函數(shù)。
函數(shù)形式:
unsigned int NLPIR_NWI_Result2UserDict()
需要的頭文件:<NLPIR.h>
返回值:
如果執(zhí)行成功,返回true,否則返回false。
參數(shù):
無。
總結(jié)
以上是生活随笔為你收集整理的中科院分词系统(NLPIR)JAVA简易教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python + wordcloud +
- 下一篇: TF之NN:利用神经网络系统自动学习散点