NLTK中文詞性自動標註

2021-07-29 11:11:07 字數 2939 閱讀 5919

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

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

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

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 標註器和乙個預設標註器

# encoding=utf-8

import nltk

from nltk.corpus import sinica_treebank # 帶標註的中文語料庫

# 用print輸出本地字元格式

def dump_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))

print t2.evaluate(test_sents) # 根據帶標註的文字,評估標註器的正確率

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

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

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

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

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

3)       新詞/不常用詞

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

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

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

4)       特殊規則

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

5)       語義, 形態…

更深層次的語義分析

a)        categorizing and tagging words

b)       結巴詞性標註

python nltk中文 NLTK中文詞性標註

1.說明 學習自然語言處理,一定會參考nltk,主要是學習它的思路,從設計地角度看看能做什麼.其本質就是把語言看成字串,字串組,字串集,尋找其間規律 nltk是多語言支援的,但目前網上的例程幾乎沒有用nltk處理中文的,其實可以做。比如標註功能,它自身提供了帶標註的中文語庫 繁體語料庫sinica ...

viterbi用於中文詞性標註

tag 詞性標註,viterbi,解碼演算法 今天看一篇分詞和詞性標註一體化的文章,解碼問題又折騰了老半天,才想起來複習下viterbi 該演算法解決的是hmm經典問題中最優狀態序列的選擇問題。詞性標註問題對映到隱馬模型可以表述為 模型中狀態 詞性 的數目為詞性符號的個數n 從每個狀態可能輸出的不同...

NLTK詞性標註編碼含義

1.cc coordinating conjunction 連線詞 2.cd cardinal number 基數詞 3.dt determiner 限定詞 如this,that,these,those,such,不定限定詞 no,some,any,each,every,enough,either,...