Weitere Toolkit-Tagger für natürliche Sprachen

Tagger anbringen

Eine weitere wichtige Klasse der ContextTagger-Unterklasse ist AffixTagger. In der AffixTagger-Klasse ist der Kontext entweder das Präfix oder das Suffix eines Wortes. Aus diesem Grund kann die AffixTagger-Klasse Tags lernen, die auf Teilzeichenfolgen fester Länge am Anfang oder Ende eines Wortes basieren.

Wie funktioniert es?

Seine Arbeitsweise hängt von dem Argument mit dem Namen affix_length ab, das die Länge des Präfixes oder Suffix angibt. Der Standardwert ist 3. Aber wie wird unterschieden, ob die AffixTagger-Klasse das Präfix oder Suffix des Wortes gelernt hat?

  • affix_length=positive - Wenn der Wert von affix_lenght positiv ist, bedeutet dies, dass die AffixTagger-Klasse die Präfixe des Wortes lernt.

  • affix_length=negative - Wenn der Wert von affix_lenght negativ ist, bedeutet dies, dass die AffixTagger-Klasse die Wortsuffixe lernt.

Um dies zu verdeutlichen, verwenden wir im folgenden Beispiel die AffixTagger-Klasse für markierte Treebank-Sätze.

Beispiel

In diesem Beispiel lernt AffixTagger das Wortpräfix, da für das Argument affix_length kein Wert angegeben wird. Das Argument nimmt den Standardwert 3 - an.

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)

Ausgabe

0.2800492099250667

Lassen Sie uns im folgenden Beispiel sehen, wie genau es sein wird, wenn wir dem Argument affix_length den Wert 4 geben -

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)

Ausgabe

0.18154947354966527

Beispiel

In diesem Beispiel lernt AffixTagger das Wortsuffix, da für das Argument affix_length ein negativer Wert angegeben wird.

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)

Ausgabe

0.2800492099250667

Brill Tagger

Brill Tagger ist ein transformationsbasierter Tagger. NLTK bietetBrillTagger Klasse, die der erste Tagger ist, der keine Unterklasse von ist SequentialBackoffTagger. Im Gegensatz dazu wird von eine Reihe von Regeln verwendet, um die Ergebnisse eines anfänglichen Taggers zu korrigierenBrillTagger.

Wie funktioniert es?

A trainieren BrillTagger Klasse mit BrillTaggerTrainer Wir definieren die folgende Funktion:

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)

Wie wir sehen können, erfordert diese Funktion initial_tagger und train_sentences. Es dauert eineinitial_tagger Argument und eine Liste von Vorlagen, die die implementiert BrillTemplateSchnittstelle. DasBrillTemplate Schnittstelle befindet sich in der nltk.tbl.templateModul. Eine solche Implementierung istbrill.Template Klasse.

Die Hauptaufgabe des transformationsbasierten Taggers besteht darin, Transformationsregeln zu generieren, die die Ausgabe des anfänglichen Taggers so korrigieren, dass sie besser mit den Trainingssätzen übereinstimmt. Lassen Sie uns den Workflow unten sehen -

Beispiel

Für dieses Beispiel werden wir verwenden combine_tagger die wir beim Kämmen von Taggern (im vorherigen Rezept) aus einer Backoff-Kette von erstellt haben NgramTagger Klassen, als initial_tagger. Lassen Sie uns zunächst das Ergebnis mit bewertenCombine.tagger und dann benutze das als initial_tagger brill tagger zu trainieren.

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)

Ausgabe

0.9234530029238365

Lassen Sie uns nun das Bewertungsergebnis sehen, wenn Combine_tagger wird verwendet als initial_tagger brill tagger trainieren -

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

Ausgabe

0.9246832510505041

Das können wir feststellen BrillTagger Klasse hat leicht erhöhte Genauigkeit über die Combine_tagger.

Vollständiges Implementierungsbeispiel

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)

Ausgabe

0.9234530029238365
0.9246832510505041

TnT Tagger

TnT Tagger, steht für Trigrams'nTags, ist ein statistischer Tagger, der auf Markov-Modellen zweiter Ordnung basiert.

Wie funktioniert es?

Wir können die Funktionsweise des TnT-Taggers anhand der folgenden Schritte verstehen:

  • Zunächst unterhält TnT Tegger basierend auf Trainingsdaten mehrere interne FreqDist und ConditionalFreqDist Instanzen.

  • Danach werden Unigramme, Bigramme und Trigramme durch diese Häufigkeitsverteilungen gezählt.

  • Während des Markierens werden nun unter Verwendung von Frequenzen die Wahrscheinlichkeiten möglicher Markierungen für jedes Wort berechnet.

Aus diesem Grund werden anstelle einer Backoff-Kette von NgramTagger alle ngram-Modelle zusammen verwendet, um das beste Tag für jedes Wort auszuwählen. Lassen Sie uns die Genauigkeit mit TnT-Tagger im folgenden Beispiel bewerten -

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)

Ausgabe

0.9165508316157791

Wir haben eine etwas geringere Genauigkeit als mit Brill Tagger.

Bitte beachten Sie, dass wir anrufen müssen train() Vor evaluate() Andernfalls erhalten wir eine Genauigkeit von 0%.