python nltk中文 NLTK中文詞性標註

2021-10-11 20:30:23 字數 2944 閱讀 4297

1.說明

學習自然語言處理,一定會參考nltk,主要是學習它的思路,從設計地角度看看能做什麼.其本質就是把語言看成字串,字串組,字串集,尋找其間規律.

nltk是多語言支援的,但目前網上的例程幾乎沒有用nltk處理中文的,其實可以做。比如標註功能,它自身提供了帶標註的中文語庫(繁體語料庫sinica_treebank).下面來看看怎樣通過資料訓練來實現中文詞性自動標註.

可以利用它來標註中本,也可以尋找和驗證一些隱性的規律.

2.相關知識

1)詞性標註

詞彙按它們的詞性(parts-of-speech,pos)分類以及相應的標註它們的過程,詞性包括:名詞、動詞、形容詞,副詞等.

2)中文字元的顯示

python內部編碼是unicode,所以輸出中文常常像這樣"\u4eba\u5de5",用print函式輸出時,將自動轉換成本地字符集,也可以使用encode(『utf-8』)函式轉換.

3)資料集,訓練集,評估

有監督的機器學習一般都是把資料分成兩個部分,一部分用於訓練,一部分用於測試,還可以通過不同分組交叉驗證. nltk提供了evaluate()函式評估標註效果.

4)預設標註(default tagger)

事先對語料庫做了統計(利用nltk.freqdist()),出現最多的是名詞.

在這裡,預設標註為名詞

5)正規表示式標註(regexp tagger)

用匹配模式分配標記給識別符號.在英文處理中,常用此方式識別各種形態(時態,字尾等),中文識別中也可以使用它來識別標點,數字等.

6)一元標註(unigram tagger)

一元標註基於乙個簡單的統計演算法:對每個識別符號分配這個獨特的識別符號最有可能的標記.

在這裡就是分配給具體單詞,它最常出現的詞性.

7)多元標註(n-gram tagger)

多元標註使用訓練集來確定對每個上下文哪個詞性標記最有可能。上下文指當前詞和它前面n-1個識別符號的詞性標記.

在這裡,就是找一些規律,比如: xx常出現在名詞之前, yy常出現在動詞之後.通過某個詞以及它之前那個詞的詞性來判斷它的詞性.這就是二元標註.同理,可以生成三元甚至多元標註.詞的距離越遠影響越小,也更占用資源,一般二元到三元就夠了.

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],

print

#等標註的詞,以空格分詞(分詞問題不在此討論)

raw = '讓人工智慧能夠更有效地甄別虛假和低俗內容並控制其傳播是當前業界和學界要重點研究的問題'.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%資料作為訓練集

test_sents= sinica_treebank_tagged_sents[size:]#10%資料作為測試集

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)#根據帶標註的文字,評估標註器的正確率

4.主要思想

詞性標註的主要思想是提煉最容易出現的可能性(在不同層次:所有詞,具體詞,詞間關係),它是一套統計方法,也是分類器的乙個應用.

nltk的詞性標註只是拋磚引玉,使用同樣方法,還也可以實現標註詞義(一詞多義的消歧),字音(多音字)等等.

通過它來看看自然語言的處理方法,有了自己的工具,也能更靈活地使用這個功能,目前還很簡陋,下面來看看怎麼改進它.

5.改進

1)缺少訓練資料

訓練資料不足,或者一些標註本身的問題,需要改進和增加訓練資料.錯誤分類可以通過大量資料的校正,同時也需考慮語境,選擇不同訓練集.

上例中的sinica_treebank語料庫自帶1萬個句子, 10萬左右的詞,文字也比較單一,執行以上程式後可以看到,準確率在75%左右.

2)有一些詞本身就是特例,就如同」海豚不是魚類」

統計歸類本身無法處理,除了統計的方案,還可以新增一一對應的詞與標註的對映表來解決此類問題.

3)新詞/不常用詞

未被訓練過的詞,可以用一些特殊標記加入字典,在資料積累到一定數量時總結其規律.

n元標註再抽象乙個層次是發現詞性間的規律,比如"名詞前是形容詞的可能性比較大",藉此來處理不能識別的"新詞".

也可以通過wordnet等字典檢視具體詞的詞性.有一些詞雖然很少出現,但詞義和詞性比較單一.對多義詞,可以選擇其最常用的詞性.

4)特殊規則

有些專業領域會有一些特殊的習慣用法,也可以通過它制定一些規則.通過正規表示式標註器實現.

5)語義,形態…

更深層次的語義分析

6.參考

1)categorizing and tagging words

2)結巴詞性標註

python nltk 基本操作

nltk.sent tokenize text 按句子分割 nltk.word tokenize sentence 分詞 nltk的分詞是句子級別的,所以對於一篇文件首先要將文章按句子進行分割,然後句子進行分詞 nltk.pos tag tokens 對分詞後的句子進行詞性標註 tags nltk....

python NLTK 環境搭建

這裡是我之前親自操作過安裝nltk,安裝成功了。當時記得是參考這篇博文 1.安裝python 我安裝的是python2.7.8,目錄d python27 2.安裝numpy 可選 注意py版本 把nltk 3.0.0解壓到d python27目錄 開啟cmd,進到d python27 nltk 3....

Python NLTK環境搭建

for 32 bits windows 1.安裝python 我安裝的是python2.7,目錄c python27 2.安裝numpy 可選 注意py版本 把nltk 2.0.3解壓到c python27目錄 開啟cmd,進到c python27 nltk 2.0.3目錄 輸入 cd c pyth...