接觸自然語言處理有一年多了,最基本的一些自然是分詞,詞性標注,命名實體識別之類的知識,有些應用知道原理是一回事,自己動手做起來又是另外一回事了。最近又開始重操舊業:分詞。分詞最著名的自然就是中科院的分詞系統,這幾天接觸的ICTCLAS5.0(下載的文件夾名稱是:ICTCLAS50_Windows_32_JNI)覺得不錯,摸索下,記錄下心得和收獲。
<一>.使用
http://blog.csdn.net/wangxiafghj/article/details/8147926,我是按照這篇博客的教程操作的,基本沒什么問題,可以運行。
收獲:
1.TestMain.java文件中就是由兩個函數構成,字面理解,一個是處理段落的,一個是處理文本的。我覺得兩者沒什么大區別,主要的不同是處理段落的函數testICTCLAS_ParagraphProcess(sInput),輸入的段落在程序里修改,輸出的結果也是直接顯示在控制端。處理文本的函數testICTCLAS_FileProcess(),輸入是你指定路徑下的指定文件,輸出也是指定路徑下的指定文件。
2.參數的修改,我覺得我使用過程中涉及到的參數修改包括是否選擇標注詞性,詞性標記集的設置,以及文件的路徑。
是否標注詞性很容易,段落中將ICTCLAS_ParagraphProcess函數最后一個參數改為1即可(1 yes ,0 no);文本中將ICTCLAS_FileProcess函數的第三個參數改為1(1 yes ,0 no)。
程序中詞性標記集的設置只寫了一次,在函數testICTCLAS_ParagraphProcess(sInput)內部,
//設置詞性標注集(0 計算所二級標注集,1 計算所一級標注集,2 北大二級標注集,3 北大一級標注集)
testICTCLAS50.ICTCLAS_SetPOSmap(0);
我覺得這個語句在testICTCLAS_FileProcess()函數中應該再寫一次,假如使用者只使用文本形式的而把段落處理的注釋掉了,那詞性標記集的設置豈不是很麻煩,建議把這句添加到testICTCLAS_FileProcess()函數的相應位置。
文件路徑有四條語句需要修改:
//輸入文件名 String Inputfilename = "e:/pos/test.txt"; byte[] Inputfilenameb = Inputfilename.getBytes();//將文件名string類型轉為byte類型 //分詞處理后輸出文件名 String Outputfilename = "e:/pos/test_result.txt"; byte[] Outputfilenameb = Outputfilename.getBytes();//將文件名string類型轉為byte類型 //文件分詞(第一個參數為輸入文件的名,第二個參數為文件編碼類型,第三個參數為是否標記詞性集1 yes,0 no,第四個參數為輸出文件名) testICTCLAS50.ICTCLAS_FileProcess(Inputfilenameb, 0, 1, Outputfilenameb); int nCount = 0; String usrdir = "e:/pos/userdict.txt"; //用戶字典路徑 byte[] usrdirb = usrdir.getBytes();//將string轉化為byte類型 //第一個參數為用戶字典路徑,第二個參數為用戶字典的編碼類型(0:type unknown;1:ASCII碼;2:GB2312,GBK,GB10380;3:UTF-8;4:BIG5) nCount = testICTCLAS50.ICTCLAS_ImportUserDictFile(usrdirb, 0);//導入用戶字典,返回導入用戶詞語個數 System.out.println("導入用戶詞個數" + nCount); nCount = 0; String Outputfilename1 = "e:/pos/testing_result.txt"; byte[] Outputfilenameb1 = Outputfilename1.getBytes();//將文件名string類型轉為byte類型
按照自己的要求修改結束就可以運行出自己想要的結果了。
最后一個問題:每種詞性標記集中詞性代表的含義不太清楚,不廢話,繼續我的尋表之路。。。。
<二>.詞性標注集
程序中提及的詞性標注集有四種:0 計算所二級標注集,1 計算所一級標注集,2 北大二級標注集,3 北大一級標注集,但是每種標注集具體的詞表還是不清楚,找到了兩種標注集,中科院標注集和北大標注集。
中科院標記集
# 1. 名詞 (1個一類,7個二類,5個三類)
名詞分為以下子類:
n 名詞 nr 人名 nr1 漢語姓氏 nr2 漢語名字
nrj 日語人名 nrf 音譯人名 ns 地名 nsf 音譯地名
nt 機構團體名 nz 其它專名 nl 名詞性慣用語 ng 名詞性語素
nw 新詞
# 2. 時間詞(1個一類,1個二類)
t 時間詞 tg 時間詞性語素
# 3. 處所詞(1個一類)
s 處所詞
# 4. 方位詞(1個一類)
f 方位詞
# 5. 動詞(1個一類,9個二類)
v 動詞 vd 副動詞 vn 名動詞 vshi 動詞“是”
vyou 動詞“有” vf 趨向動詞 vx 形式動詞 vi 不及物動詞(內動詞)
vl 動詞性慣用語 vg 動詞性語素
# 6. 形容詞(1個一類,4個二類)
a 形容詞 ad 副形詞 an 名形詞 ag 形容詞性語素 al 形容詞性慣用語
# 7. 區別詞(1個一類,2個二類)
b 區別詞 bl 區別詞性慣用語
# 8. 狀態詞(1個一類)
z 狀態詞
# 9. 代詞(1個一類,4個二類,6個三類)
r 代詞 rr 人稱代詞 rz 指示代詞 rzt 時間指示代詞
rzs 處所指示代詞 rzv 謂詞性指示代詞 ry 疑問代詞 ryt 時間疑問代詞
rys 處所疑問代詞 ryv 謂詞性疑問代詞 rg 代詞性語素
# 10. 數詞(1個一類,1個二類)
m 數詞 mq 數量詞
# 11. 量詞(1個一類,2個二類)
q 量詞 qv 動量詞 qt 時量詞
# 12. 副詞(1個一類)
d 副詞
# 13. 介詞(1個一類,2個二類)
p 介詞 pba 介詞“把” pbei 介詞“被”
# 14. 連詞(1個一類,1個二類)
c 連詞 cc 並列連詞
# 15. 助詞(1個一類,15個二類)
u 助詞 uzhe 着 ule 了 嘍 uguo 過 ude1 的 底
ude2 地 ude3 得 usuo 所 udeng 等 等等 雲雲
uyy 一樣 一般 似的 般 udh 的話 uls 來講 來說 而言 說來
uzhi 之 ulian 連 (“連小學生都會”)
# 16. 嘆詞(1個一類)
e 嘆詞
# 17. 語氣詞(1個一類)
y 語氣詞(delete yg)
# 18. 擬聲詞(1個一類)
o 擬聲詞
# 19. 前綴(1個一類)
h 前綴
# 20. 后綴(1個一類)
k 后綴
# 21. 字符串(1個一類,2個二類)
x 字符串 xx 非語素字 xu 網址URL
# 22. 標點符號(1個一類,16個二類)
w 標點符號
wkz 左括號,全角:( 〔 [ { 《 【 〖〈 半角:( [ { <
wky 右括號,全角:) 〕 ] } 》 】 〗 〉 半角: ) ] { >
wyz 左引號,全角:“ ‘ 『 wyy 右引號,全角:” ’ 』
wj 句號,全角:。 ww 問號,全角:? 半角:? wt 嘆號,全角:! 半角:!
wd 逗號,全角:, 半角:, wf 分號,全角:; 半角: ; wn 頓號,全角:、
wm 冒號,全角:: 半角: : ws 省略號,全角:…… …
wp 破折號,全角:—— -- ——- 半角:--- ----
wb 百分號千分號,全角:% ‰ 半角:%
wh 單位符號,全角:¥ $ £ ° ℃ 半角:$
北大標記集
還增加了一類詞:un(未知詞),表示不可識別詞及用戶自定義詞組。取英文unknown前兩個字母,參考CSW分詞中的定義。
坑爹的是我分完的結果竟然都是un,腫么辦,哭死!!
今天發現un出現的原因是因為添加了詞典,只要是詞典中添加的詞,詞性標注均為un,再想辦法搞定這個大詞條詞性標注的問題吧。
找到的針對上一問題的解決方法了,就是在添加詞典的時候將詞典中詞條的詞性標記出來,這樣就不會顯示出來都是un了。