iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 11
0
自我挑戰組

機器學習應用練習系列 第 11

詞性標註

  • 分享至 

  • xImage
  •  

詞性標註

使用Brown語料庫

(Brown語料庫是nltk中的內建語料庫,特色是所有文本依照主題分類)


定義一個fdist之後將brown語料庫中單字的末三個字母組合統計起來

suffix_fdist = nltk.FreqDist()步驟可能是為了後面使用.most_common()

>>> from nltk.corpus import brown
>>> suffix_fdist = nltk.FreqDist()
>>> for word in brown.words():
...     word = word.lower()  
...     suffix_fdist[word[-1 :]] += 1
...     suffix_fdist[word[-2:]] += 1
...     suffix_fdist[word[-3:]] += 1
>>> print(suffix_fdist)

FreqDist({'e': 202946, ',': 175002, '.': 152999, 's': 128722, 'd': 105687, 't': 94459, 'he': 92084, 'n': 87889, 'a': 74912, 'of': 72978, ...})

接著使用.most_common()只挑出頻率最高的100個字尾組合

>>> common_suffixes = [suffix for (suffix, count) in suffix_fdist.most_common(100)]
>>> print (common_suffixes)

['e', ',', '.', 's', 'd', 't', 'he', 'n', 'a', 'of', 'the', 'y', 'r', 'to', 'in', 'f', 'o', 'ed', 'nd', 'is', 'on', 'l', 'g', 'and', 'ng', 'er', 'as', 'ing', 'h', 'at', 'es', 'or', 're', 'it', '``', 'an', "''", 'm', ';', 'i', 'ly', 'ion', 'en', 'al', '?', 'nt', 'be', 'hat', 'st', 'his', 'th', 'll', 'le', 'ce', 'by', 'ts', 'me', 've', "'", 'se', 'ut', 'was', 'for', 'ent', 'ch', 'k', 'w', 'ld', '`', 'rs', 'ted', 'ere', 'her', 'ne', 'ns', 'ith', 'ad', 'ry', ')', '(', 'te', '--', 'ay', 'ty', 'ot', 'p', 'nce', "'s", 'ter', 'om', 'ss', ':', 'we', 'are', 'c', 'ers', 'uld', 'had', 'so', 'ey']

接著用剛做好的common_suffixes定義一個特徵提取器函數,檢查給定的單詞的這些後綴:

>>> def  pos_features (word):
...     features = {}
...     for suffix in common_suffixes:
...         features[ 'endswith({})' .format(suffix)] = word.lower().endswith (suffix)
...     return features

我們使用brown.tagged_words()整理出brown語料庫中指定類別的單詞並附上詞性標籤做成特徵集

>>> tagged_words = brown.tagged_words(categories= 'news' )
>>> featuresets = [(pos_features(n), g) for (n,g) in tagged_words]

將特徵集以9:1比例分為訓練及測試集

>>> size = int(len(featuresets) * 0.1)
>>> train_set, test_set = featuresets[size:], featuresets[:size]

使用決策樹模型分析特徵集,並查看精度

>>> classifier = nltk.DecisionTreeClassifier.train(train_set)
>>> nltk.classify.accuracy(classifier, test_set)
0.6270512182993535

最後可將新資料帶入剛完成的決策樹模型。此時得到的結果是經由模型計算得出,而非透過特徵集查詢。

>>> classifier.classify(pos_features( 'yee' ))
'NN'

我們可以以偽代碼的形式查看決策樹的分支,觀察模型的決策過程

>>> print (classifier.pseudocode(depth=10))

if endswith(the) == False: 
  if endswith(,) == False: 
    if endswith(s) == False: 
      if endswith(.) == False: 
        if endswith(of) == False: 
          if endswith(and) == False: 
            if endswith(a) == False: 
              if endswith(in) == False: 
                if endswith(ed) == False: 
                  if endswith(to) == False: return '.'
                  if endswith(to) == True: return 'TO'
                if endswith(ed) == True: return 'VBN'
              if endswith(in) == True: return 'IN'
            if endswith(a) == True: return 'AT'
          if endswith(and) == True: return 'CC'
        if endswith(of) == True: return 'IN'
      if endswith(.) == True: return '.'
    if endswith(s) == True: 
      if endswith(is) == False: 
        if endswith(was) == False: 
          if endswith(as) == False: 
            if endswith('s) == False: 
              if endswith(ss) == False: return 'NNS'
              if endswith(ss) == True: return 'NN'
            if endswith('s) == True: return 'NP$'
          if endswith(as) == True: return 'CS'
        if endswith(was) == True: return 'BEDZ'
      if endswith(is) == True: 
        if endswith(his) == False: return 'BEZ'
        if endswith(his) == True: return 'PP$'
  if endswith(,) == True: return ','
if endswith(the) == True: return 'AT'

參考資料: Python 自然語言處理第二版 https://usyiyi.github.io/nlp-py-2e-zh/


上一篇
文檔分類
下一篇
探索上下文語境
系列文
機器學習應用練習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言