
- 自然語言工具包教程
- 自然語言工具包 - 首頁
- 自然語言工具包 - 簡介
- 自然語言工具包 - 入門
- 自然語言工具包 - 文字分詞
- 訓練分詞器和過濾停用詞
- 在WordNet中查詢單詞
- 詞幹提取和詞形還原
- 自然語言工具包 - 詞語替換
- 同義詞和反義詞替換
- 語料庫讀取器和自定義語料庫
- 詞性標註基礎
- 自然語言工具包 - 單詞標註器
- 自然語言工具包 - 組合標註器
- 自然語言工具包 - 更多NLTK標註器
- 自然語言工具包 - 語法分析
- 組塊和資訊提取
- 自然語言工具包 - 變換組塊
- 自然語言工具包 - 變換樹
- 自然語言工具包 - 文字分類
- 自然語言工具包資源
- 自然語言工具包 - 快速指南
- 自然語言工具包 - 有用資源
- 自然語言工具包 - 討論
自然語言工具包 - 單詞標註器
什麼是Unigram標註器?
顧名思義,Unigram標註器只使用單個單詞作為其確定詞性(Part-of-Speech)標記的上下文。簡單來說,Unigram標註器是一個基於上下文的標註器,其上下文是一個單詞,即Unigram。
它是如何工作的?
NLTK提供了一個名為UnigramTagger的模組來實現此目的。但在深入瞭解其工作原理之前,讓我們藉助下圖瞭解其層次結構:

從上圖可以看出,UnigramTagger繼承自NgramTagger,後者是ContextTagger的子類,而ContextTagger繼承自SequentialBackoffTagger。
UnigramTagger的工作原理如下所示:
正如我們所看到的,UnigramTagger繼承自ContextTagger,它實現了一個context()方法。此context()方法採用與choose_tag()方法相同的三個引數。
context()方法的結果將是單詞標記,該標記將進一步用於建立模型。建立模型後,單詞標記還用於查詢最佳標記。
透過這種方式,UnigramTagger將根據已標註句子的列表構建上下文模型。
訓練Unigram標註器
NLTK的UnigramTagger可以透過在初始化時提供已標註句子的列表來進行訓練。在下面的示例中,我們將使用treebank語料庫的已標註句子。我們將使用該語料庫的前2500個句子。
示例
首先從nltk匯入UnigramTagger模組:
from nltk.tag import UnigramTagger
接下來,匯入您要使用的語料庫。這裡我們使用treebank語料庫:
from nltk.corpus import treebank
現在,獲取用於訓練的句子。我們取前2500個句子用於訓練,並將它們進行標註:
train_sentences = treebank.tagged_sents()[:2500]
接下來,將UnigramTagger應用於用於訓練的句子:
Uni_tagger = UnigramTagger(train_sentences)
取一些句子(等於或少於訓練用的2500個句子)用於測試。這裡我們取前1500個句子用於測試:
test_sentences = treebank.tagged_sents()[1500:] Uni_tagger.evaluate(test_sents)
輸出
0.8942306156033808
在這裡,對於使用單個單詞查詢來確定詞性標記的標註器,我們獲得了大約89%的準確率。
完整的實現示例
from nltk.tag import UnigramTagger from nltk.corpus import treebank train_sentences = treebank.tagged_sents()[:2500] Uni_tagger = UnigramTagger(train_sentences) test_sentences = treebank.tagged_sents()[1500:] Uni_tagger.evaluate(test_sentences)
輸出
0.8942306156033808
覆蓋上下文模型
從上面顯示UnigramTagger層次結構的圖表中,我們知道所有繼承自ContextTagger的標註器,都可以使用預建模型,而不是訓練自己的模型。這個預建模型只是一個簡單的Python字典,它將上下文鍵對映到標記。對於UnigramTagger,上下文鍵是單個單詞,而對於其他NgramTagger子類,它將是元組。
我們可以透過向UnigramTagger類傳遞另一個簡單的模型來覆蓋此上下文模型,而不是傳遞訓練集。讓我們透過下面的簡單示例來理解它:
示例
from nltk.tag import UnigramTagger from nltk.corpus import treebank Override_tagger = UnigramTagger(model = {‘Vinken’ : ‘NN’}) Override_tagger.tag(treebank.sents()[0])
輸出
[ ('Pierre', None), ('Vinken', 'NN'), (',', None), ('61', None), ('years', None), ('old', None), (',', None), ('will', None), ('join', None), ('the', None), ('board', None), ('as', None), ('a', None), ('nonexecutive', None), ('director', None), ('Nov.', None), ('29', None), ('.', None) ]
由於我們的模型只包含'Vinken'作為唯一的上下文鍵,您可以從上面的輸出中觀察到,只有這個單詞得到了標記,其他所有單詞的標記都是None。
設定最小頻率閾值
為了確定給定上下文中哪個標記最有可能,ContextTagger類使用出現頻率。即使上下文單詞和標記只出現一次,它也會預設這樣做,但是我們可以透過向UnigramTagger類傳遞cutoff值來設定最小頻率閾值。在下面的示例中,我們在前面訓練UnigramTagger的示例中傳遞了cutoff值:
示例
from nltk.tag import UnigramTagger from nltk.corpus import treebank train_sentences = treebank.tagged_sents()[:2500] Uni_tagger = UnigramTagger(train_sentences, cutoff = 4) test_sentences = treebank.tagged_sents()[1500:] Uni_tagger.evaluate(test_sentences)
輸出
0.7357651629613641