Daha Doğal Dil Araç Seti Etiketleyicileri

Ek Etiketleyici

ContextTagger alt sınıfının bir diğer önemli sınıfı, AffixTagger'dır. AffixTagger sınıfında, bağlam, bir kelimenin ya öneki ya da sonekidir. AffixTagger sınıfının, bir kelimenin başındaki veya sonundaki sabit uzunluktaki alt dizelere dayalı olarak etiketleri öğrenmesinin nedeni budur.

O nasıl çalışır?

Çalışması, önek veya sonekin uzunluğunu belirten affix_length adlı argümana bağlıdır. Varsayılan değer 3'tür. Fakat AffixTagger sınıfının kelimenin önekini veya sonekini öğrenip öğrenmediğini nasıl ayırt eder?

  • affix_length=positive - affix_lenght değeri pozitifse bu, AffixTagger sınıfının kelimenin öneklerini öğreneceği anlamına gelir.

  • affix_length=negative - affix_lenght değeri negatifse bu, AffixTagger sınıfının kelimenin son eklerini öğreneceği anlamına gelir.

Daha açık hale getirmek için, aşağıdaki örnekte, etiketli treebank cümlelerinde AffixTagger sınıfını kullanacağız.

Misal

Bu örnekte, AffixTagger sözcüğün önekini öğrenecek çünkü affix_length bağımsız değişkeni için herhangi bir değer belirtmiyoruz. Bağımsız değişken varsayılan 3 değerini alacaktır -

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)

Çıktı

0.2800492099250667

Aşağıdaki örnekte, affix_length argümanına 4 değerini verdiğimizde doğruluğun ne olacağını görelim -

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)

Çıktı

0.18154947354966527

Misal

Bu örnekte, AffixTagger kelimenin sonekini öğrenecek çünkü affix_length argümanı için negatif bir değer belirleyeceğiz.

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)

Çıktı

0.2800492099250667

Brill Etiketleyici

Brill Tagger, dönüşüm tabanlı bir etiketleyicidir. NLTK sağlarBrillTagger alt sınıfı olmayan ilk etiketleyici olan sınıf SequentialBackoffTagger. Bunun karşısında, ilk etiketleyicinin sonuçlarını düzeltmek için bir dizi kural kullanılır.BrillTagger.

O nasıl çalışır?

Eğitmek için BrillTagger sınıf kullanıyor BrillTaggerTrainer aşağıdaki işlevi tanımlıyoruz -

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)

Gördüğümüz gibi, bu işlev şunu gerektirir: initial_tagger ve train_sentences. Bir alırinitial_tagger bağımsız değişken ve bir şablon listesi, BrillTemplatearayüz. BrillTemplate arayüzü şurada bulunur: nltk.tbl.templatemodül. Bu tür uygulamalardan biribrill.Template sınıf.

Dönüşüm tabanlı etiketleyicinin ana rolü, ilk etiketleyicinin çıktısını eğitim cümleleri ile daha uyumlu olacak şekilde düzelten dönüşüm kuralları oluşturmaktır. İş akışını aşağıda görelim -

Misal

Bu örnek için kullanacağız combine_tagger (önceki tarifte) etiketleyicileri tararken oluşturduğumuz, geri çekilme zincirinden NgramTagger sınıflar olarak initial_tagger. Önce sonucu şu şekilde değerlendirelim:Combine.tagger ve sonra bunu olarak kullan initial_tagger brill tagger yetiştirmek için.

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)

Çıktı

0.9234530029238365

Şimdi değerlendirme sonucunu görelim. Combine_tagger Olarak kullanılır initial_tagger brill tagger'ı eğitmek -

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

Çıktı

0.9246832510505041

Bunu fark edebiliriz BrillTagger sınıfının biraz daha yüksek doğruluğu vardır. Combine_tagger.

Eksiksiz uygulama örneği

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)

Çıktı

0.9234530029238365
0.9246832510505041

TnT Etiketleyici

TnT Tagger, Trigrams'nTags'in kısaltmasıdır ve ikinci derece Markov modellerine dayanan istatistiksel bir etiketleyicidir.

O nasıl çalışır?

TnT etiketleyicinin çalışmasını aşağıdaki adımlar yardımıyla anlayabiliriz -

  • İlk olarak eğitim verilerine dayalı olarak, TnT tegger birkaç dahili FreqDist ve ConditionalFreqDist örnekler.

  • Bundan sonra unigramlar, bigramlar ve trigramlar bu frekans dağılımları tarafından sayılacaktır.

  • Şimdi, etiketleme sırasında, frekansları kullanarak, her kelime için olası etiketlerin olasılıklarını hesaplayacaktır.

Bu nedenle, NgramTagger'ın geri çekilme zinciri oluşturmak yerine, her kelime için en iyi etiketi seçmek için tüm ngram modellerini birlikte kullanır. Aşağıdaki örnekte doğruluğu TnT etiketleyici ile değerlendirelim -

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)

Çıktı

0.9165508316157791

Brill Tagger ile elde ettiğimizden biraz daha az doğruluğa sahibiz.

Lütfen aramamız gerektiğini unutmayın train() önce evaluate() aksi takdirde% 0 doğruluk elde ederiz.