Natural-language-toolkit-more-natural-language-toolkit-taggers

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

その他の自然言語ツールキットタガー

付加タガー

ContextTaggerサブクラスのもう1つの重要なクラスは、AffixTaggerです。 AffixTaggerクラスでは、コンテキストは単語の接頭辞または接尾辞です。 これが、AffixTaggerクラスが単語の最初または最後の固定長の部分文字列に基づいてタグを学習できる理由です。

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

その動作は、接頭辞または接尾辞の長さを指定するaffix_lengthという名前の引数に依存します。 デフォルト値は3です。 しかし、AffixTaggerクラスが単語のプレフィックスまたはサフィックスを学習したかどうかをどのように区別しますか?

  • affix_length = positive -affix_lenghtの値が正の場合、AffixTaggerクラスが単語の接頭辞を学習することを意味します。
  • affix_length = negative -affix_lenghtの値が負の場合、AffixTaggerクラスが単語のサフィックスを学習することを意味します。

わかりやすくするために、以下の例では、タグ付きツリーバンク文でAffixTaggerクラスを使用します。

この例では、affix_length引数に値を指定していないため、AffixTaggerは単語のプレフィックスを学習します。 引数はデフォルト値3になります-

from nltk.tag import AffixTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
Prefix_tagger = AffixTagger(train_sentences)
test_sentences = treebank.tagged_sents()[1500:]
Prefix_tagger.evaluate(test_sentences)

出力

0.2800492099250667

次の例で、affix_length引数に値4を指定した場合の精度を見てみましょう-

from nltk.tag import AffixTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
Prefix_tagger = AffixTagger(train_sentences, affix_length=4 )
test_sentences = treebank.tagged_sents()[1500:]
Prefix_tagger.evaluate(test_sentences)

出力

0.18154947354966527

この例では、affix_length引数に負の値を指定するため、AffixTaggerは単語のサフィックスを学習します。

from nltk.tag import AffixTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
Suffix_tagger = AffixTagger(train_sentences, affix_length = -3)
test_sentences = treebank.tagged_sents()[1500:]
Suffix_tagger.evaluate(test_sentences)

出力

0.2800492099250667

ブリルタガー

ブリルタガーは変換ベースのタガーです。 NLTKは、 SequentialBackoffTagger のサブクラスではない最初のタガーである BrillTagger クラスを提供します。 それとは逆に、最初のタガーの結果を修正する一連のルールが BrillTagger によって使用されます。

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

*BrillTaggerTrainer* を使用して *BrillTagger* クラスをトレーニングするには、次の関数を定義します-
  • def train_brill_tagger(initial_tagger、train_sentences、** kwargs) *−
templates = [
   brill.Template(brill.Pos([-1])),
   brill.Template(brill.Pos([1])),
   brill.Template(brill.Pos([-2])),
   brill.Template(brill.Pos([2])),
   brill.Template(brill.Pos([-2, -1])),
   brill.Template(brill.Pos([1, 2])),
   brill.Template(brill.Pos([-3, -2, -1])),
   brill.Template(brill.Pos([1, 2, 3])),
   brill.Template(brill.Pos([-1]), brill.Pos([1])),
   brill.Template(brill.Word([-1])),
   brill.Template(brill.Word([1])),
   brill.Template(brill.Word([-2])),
   brill.Template(brill.Word([2])),
   brill.Template(brill.Word([-2, -1])),
   brill.Template(brill.Word([1, 2])),
   brill.Template(brill.Word([-3, -2, -1])),
   brill.Template(brill.Word([1, 2, 3])),
   brill.Template(brill.Word([-1]), brill.Word([1])),
]
trainer = brill_trainer.BrillTaggerTrainer(initial_tagger, templates, deterministic=True)
return trainer.train(train_sentences,* *kwargs)

ご覧のとおり、この関数には initial_taggertrain_sentences が必要です。 initial_tagger 引数と、 BrillTemplate インターフェースを実装するテンプレートのリストを受け取ります。 BrillTemplate インターフェースは nltk.tbl.template モジュールにあります。 そのような実装の1つは brill.Template クラスです。

変換ベースのタガーの主な役割は、初期のタガーの出力をトレーニング文により一致するように修正する変換ルールを生成することです。 以下のワークフローを見てみましょう-

BrillTemplate

この例では、 NgramTagger クラスのバックオフチェーンからタガーを(前のレシピで)コーミングするときに作成した combine_taggerinitial_tagger として使用します。 まず、 Combine.tagger を使用して結果を評価し、次にそれを initial_tagger として使用してブリルタガーをトレーニングします。

from tagger_util import backoff_tagger
from nltk.tag import UnigramTagger
from nltk.tag import BigramTagger
from nltk.tag import TrigramTagger
from nltk.tag import DefaultTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
back_tagger = DefaultTagger('NN')
Combine_tagger = backoff_tagger(
   train_sentences, [UnigramTagger, BigramTagger, TrigramTagger], backoff = back_tagger
)
test_sentences = treebank.tagged_sents()[1500:]
Combine_tagger.evaluate(test_sentences)

出力

0.9234530029238365

では、 Combine_taggerinitial_tagger として使用してブリルタガーをトレーニングした場合の評価結果を見てみましょう-

from tagger_util import train_brill_tagger
brill_tagger = train_brill_tagger(combine_tagger, train_sentences)
brill_tagger.evaluate(test_sentences)

出力

0.9246832510505041
*BrillTagger* クラスは *Combine_tagger* よりもわずかに精度が高くなっていることがわかります。

完全な実装例

from tagger_util import backoff_tagger
from nltk.tag import UnigramTagger
from nltk.tag import BigramTagger
from nltk.tag import TrigramTagger
from nltk.tag import DefaultTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
back_tagger = DefaultTagger('NN')
Combine_tagger = backoff_tagger(train_sentences,
[UnigramTagger, BigramTagger, TrigramTagger], backoff = back_tagger)
test_sentences = treebank.tagged_sents()[1500:]
Combine_tagger.evaluate(test_sentences)
from tagger_util import train_brill_tagger
brill_tagger = train_brill_tagger(combine_tagger, train_sentences)
brill_tagger.evaluate(test_sentences)

出力

0.9234530029238365
0.9246832510505041

TnTタガー

TnT Tagger(Trigram’snTagsの略)は、2次マルコフモデルに基づく統計タガーです。

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

私たちは次のステップの助けを借りてTnTタガーの働きを理解することができます-

  • 最初にトレーニングデータに基づいて、TnTテガーはいくつかの内部 FreqDist および ConditionalFreqDist インスタンスを維持します。
  • その後、ユニグラム、バイグラム、トリグラムは、これらの頻度分布によってカウントされます。
  • これで、タグ付け中に頻度を使用して、単語ごとに可能なタグの確率を計算します。

そのため、NgramTaggerのバックオフチェーンを構築する代わりに、すべてのngramモデルを一緒に使用して、各単語に最適なタグを選択します。 次の例でTnTタガーを使用して精度を評価しましょう-

from nltk.tag import tnt
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
tnt_tagger = tnt.TnT()
tnt_tagger.train(train_sentences)
test_sentences = treebank.tagged_sents()[1500:]
tnt_tagger.evaluate(test_sentences)

出力

0.9165508316157791

Brill Taggerを使用した場合よりも精度が少し低くなります。

  • train() evaluate()*の前に呼び出す必要があることに注意してください。そうしないと、精度が0%になります。