Natural-language-toolkit-unigram-tagger

提供:Dev Guides
移動先:案内検索

自然言語ツールキット-ユニグラムタガー

ユニグラムタガーとは何ですか?

名前が示すように、ユニグラムタガーは、POS(品詞)タグを決定するためのコンテキストとして単一の単語のみを使用するタガーです。 簡単に言うと、Unigram Taggerはコンテキストベースのタガーであり、そのコンテキストは単一の単語、つまりUnigramです。

それはどのように機能しますか?

NLTKはこの目的のために UnigramTagger という名前のモジュールを提供します。 しかし、その動作を深く掘り下げる前に、次の図の助けを借りて階層を理解しましょう-

ユニグラムタガー

上の図から、 UnigramTaggerSequentialBackoffTagger を継承する ContextTagger のサブクラスである NgramTagger から継承されていることがわかります。

*UnigramTagger* の働きは次のステップの助けを借りて説明されています-
  • これまで見てきたように、 UnigramTaggerContextTagger を継承し、* context()メソッドを実装します。 この context()メソッドは、 choose_tag()*メソッドと同じ3つの引数を取ります。
  • * context()*メソッドの結果は、モデルの作成にさらに使用される単語トークンになります。 モデルが作成されると、トークンという単語も最適なタグを検索するために使用されます。
  • このようにして、 UnigramTagger はタグ付けされた文のリストからコンテキストモデルを構築します。

ユニグラムタガーのトレーニング

NLTKの UnigramTagger は、初期化時にタグ付けされた文のリストを提供することによってトレーニングできます。 以下の例では、ツリーバンクコーパスのタグ付けされた文を使用します。 そのコーパスの最初の2500文を使用します。

最初にnltkからUniframTaggerモジュールをインポートします-

from nltk.tag import UnigramTagger

次に、使用するコーパスをインポートします。 ここでは、ツリーバンクコーパスを使用しています-

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

ここでは、単一の単語の検索を使用してPOSタグを決定するタガーの精度が約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 クラスは出現頻度を使用します。 コンテキストワードとタグが1回だけ発生してもデフォルトでそれを行いますが、 _ cutoff_ 値を UnigramTagger クラスに渡すことで最小頻度しきい値を設定できます。 以下の例では、UnigramTaggerをトレーニングした前のレシピでカットオフ値を渡しています-

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