自然語言工具包 - 單詞標註器



什麼是Unigram標註器?

顧名思義,Unigram標註器只使用單個單詞作為其確定詞性(Part-of-Speech)標記的上下文。簡單來說,Unigram標註器是一個基於上下文的標註器,其上下文是一個單詞,即Unigram。

它是如何工作的?

NLTK提供了一個名為UnigramTagger的模組來實現此目的。但在深入瞭解其工作原理之前,讓我們藉助下圖瞭解其層次結構:

Unigram Tagger

從上圖可以看出,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
廣告