1.說明
學習自然語言處理,一定會參考NLTK,主要是學習它的思路,從設計地角度看看能做什么.其本質就是把語言看成字符串隶校,字符串組夺姑,字符串集蜈漓,尋找其間規(guī)律.
NLTK是多語言支持的,但目前網(wǎng)上的例程幾乎沒有用NLTK處理中文的,其實可以做宫盔。比如標注功能,它自身提供了帶標注的中文語庫(繁體語料庫sinica_treebank).下面來看看怎樣通過數(shù)據(jù)訓練來實現(xiàn)中文詞性自動標注.
可以利用它來標注中本迎变,也可以尋找和驗證一些隱性的規(guī)律.
2.相關知識
1)詞性標注
詞匯按它們的詞性(parts-of-speech,POS)分類以及相應的標注它們的過程,詞性包括:名詞、動詞飘言、形容詞,副詞等.
2)中文字符的顯示
Python內(nèi)部編碼是unicode,所以輸出中文常常像這樣"\u4eba\u5de5",用print函數(shù)輸出時,將自動轉換成本地字符集,也可以使用encode(‘utf-8’)函數(shù)轉換.
3)數(shù)據(jù)集,訓練集,評估
有監(jiān)督的機器學習一般都是把數(shù)據(jù)分成兩個部分,一部分用于訓練,一部分用于測試,還可以通過不同分組交叉驗證. Nltk提供了evaluate()函數(shù)評估標注效果.
4)默認標注(Default Tagger)
事先對語料庫做了統(tǒng)計(利用nltk.FreqDist()),出現(xiàn)最多的是名詞.
在這里衣形,默認標注為名詞
5)正則表達式標注(Regexp Tagger)
用匹配模式分配標記給標識符.在英文處理中,常用此方式識別各種形態(tài)(時態(tài)姿鸿,后綴等)谆吴,中文識別中也可以使用它來識別標點,數(shù)字等.
6)一元標注(Unigram Tagger)
一元標注基于一個簡單的統(tǒng)計算法:對每個標識符分配這個獨特的標識符最有可能的標記.
在這里就是分配給具體單詞苛预,它最常出現(xiàn)的詞性.
7)多元標注(N-gram Tagger)
多元標注使用訓練集來確定對每個上下文哪個詞性標記最有可能句狼。上下文指當前詞和它前面n-1個標識符的詞性標記.
在這里,就是找一些規(guī)律,比如: XX常出現(xiàn)在名詞之前, YY常出現(xiàn)在動詞之后.通過某個詞以及它之前那個詞的詞性來判斷它的詞性.這就是二元標注.同理热某,可以生成三元甚至多元標注.詞的距離越遠影響越小,也更占用資源,一般二元到三元就夠了.
8)組合標注
更精確的算法在很多時候落后于具有更廣覆蓋范圍的算法(比如滿足三元標的詞可能非常少),所以有時我們組合多個標注器腻菇,
在這里,組合bigram標注器昔馋、unigram標注器和一個默認標注器
3.代碼
#encoding=utf-8
importnltk
fromnltk.corpus import sinica_treebank#帶標注的中文語料庫
#用print輸出本地字符格式
defdump_result(result):
for item in result:
print item[0],",",item[1],
#等標注的詞筹吐,以空格分詞(分詞問題不在此討論)
raw = '讓人工智能能夠更有效地甄別虛假和低俗內(nèi)容並控制其傳播是當前業(yè)界和學界要重點研究的問題'.decode('utf-8')
tokens= nltk.word_tokenize(raw)
sinica_treebank_tagged_sents= sinica_treebank.tagged_sents()#以句為單位標
size =int(len(sinica_treebank_tagged_sents) * 0.9)
train_sents= sinica_treebank_tagged_sents[:size]#90%數(shù)據(jù)作為訓練集
test_sents= sinica_treebank_tagged_sents[size:]#10%數(shù)據(jù)作為測試集
t0 =nltk.DefaultTagger('Nab')#詞性的默認值為名詞
t1 =nltk.UnigramTagger(train_sents, backoff=t0)#一元標注
t2 =nltk.BigramTagger(train_sents, backoff=t1)#多元(二元)標注
dump_result(t2.tag(tokens))
printt2.evaluate(test_sents)#根據(jù)帶標注的文本,評估標注器的正確率
4.主要思想
詞性標注的主要思想是提煉最容易出現(xiàn)的可能性(在不同層次:所有詞,具體詞,詞間關系)秘遏,它是一套統(tǒng)計方法丘薛,也是分類器的一個應用.
NLTK的詞性標注只是拋磚引玉,使用同樣方法邦危,還也可以實現(xiàn)標注詞義(一詞多義的消歧),字音(多音字)等等.
通過它來看看自然語言的處理方法,有了自己的工具,也能更靈活地使用這個功能,目前還很簡陋洋侨,下面來看看怎么改進它.
5.改進
1)缺少訓練數(shù)據(jù)
訓練數(shù)據(jù)不足,或者一些標注本身的問題,需要改進和增加訓練數(shù)據(jù).錯誤分類可以通過大量數(shù)據(jù)的校正,同時也需考慮語境倦蚪,選擇不同訓練集.
上例中的sinica_treebank語料庫自帶1萬個句子, 10萬左右的詞希坚,文本也比較單一,執(zhí)行以上程序后可以看到,準確率在75%左右.
想要訓練出更理想的標注器,需要更多帶標注的數(shù)據(jù)(有監(jiān)督學習).數(shù)據(jù)從哪兒來呢?其實也簡單,可以用現(xiàn)有靠譜的分詞工具(比如:在線的”語言云”,離線的”結巴”)的標注結果去訓練你自己的標注器.
2)有一些詞本身就是特例,就如同”海豚不是魚類”
統(tǒng)計歸類本身無法處理,除了統(tǒng)計的方案,還可以添加一一對應的詞與標注的映射表來解決此類問題.
3)新詞/不常用詞
未被訓練過的詞陵且,可以用一些特殊標記加入字典裁僧,在數(shù)據(jù)積累到一定數(shù)量時總結其規(guī)律.
N元標注再抽象一個層次是發(fā)現(xiàn)詞性間的規(guī)律,比如"名詞前是形容詞的可能性比較大"滩报,借此來處理不能識別的"新詞".
也可以通過WordNet等字典查看具體詞的詞性.有一些詞雖然很少出現(xiàn),但詞義和詞性比較單一.對多義詞锅知,可以選擇其最常用的詞性.
4)特殊規(guī)則
有些專業(yè)領域會有一些特殊的習慣用法,也可以通過它制定一些規(guī)則.通過正則表達式標注器實現(xiàn).
5)語義,形態(tài)…
更深層次的語義分析
6.參考
1)Categorizing and Tagging Words
http://www.nltk.org/book_1ed/ch05.html
2)結巴詞性標注
http://www.mamicode.com/info-detail-562618.html