Altri tagger del toolkit in linguaggio naturale
Applica Tagger
Un'altra importante classe della sottoclasse ContextTagger è AffixTagger. Nella classe AffixTagger, il contesto è prefisso o suffisso di una parola. Questo è il motivo per cui la classe AffixTagger può apprendere tag in base a sottostringhe di lunghezza fissa dell'inizio o della fine di una parola.
Come funziona?
Il suo funzionamento dipende dall'argomento denominato affix_length che specifica la lunghezza del prefisso o del suffisso. Il valore predefinito è 3. Ma come si distingue se il prefisso o il suffisso della parola appresa dalla classe AffixTagger?
affix_length=positive - Se il valore di affix_lenght è positivo, significa che la classe AffixTagger imparerà i prefissi delle parole.
affix_length=negative - Se il valore di affix_lenght è negativo, significa che la classe AffixTagger imparerà i suffissi delle parole.
Per renderlo più chiaro, nell'esempio seguente, useremo la classe AffixTagger su frasi con tag treebank.
Esempio
In questo esempio, AffixTagger imparerà il prefisso della parola perché non stiamo specificando alcun valore per l'argomento affix_length. L'argomento assumerà il valore predefinito 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)
Produzione
0.2800492099250667
Vediamo nell'esempio seguente quale sarà l'accuratezza quando forniamo il valore 4 all'argomento affix_length -
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)
Produzione
0.18154947354966527
Esempio
In questo esempio, AffixTagger apprenderà il suffisso della parola perché specificheremo un valore negativo per l'argomento affix_length.
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)
Produzione
0.2800492099250667
Brill Tagger
Brill Tagger è un tagger basato sulla trasformazione. NLTK fornisceBrillTagger class che è il primo tagger che non è una sottoclasse di SequentialBackoffTagger. Di fronte ad esso, viene utilizzata una serie di regole per correggere i risultati di un tagger inizialeBrillTagger.
Come funziona?
Per addestrare un BrillTagger classe utilizzando BrillTaggerTrainer definiamo la seguente funzione -
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)
Come possiamo vedere, questa funzione richiede initial_tagger e train_sentences. Ci vuole uninitial_tagger argomento e un elenco di modelli, che implementa l'estensione BrillTemplateinterfaccia. IlBrillTemplate l'interfaccia si trova nel file nltk.tbl.templatemodulo. Una di queste implementazioni èbrill.Template classe.
Il ruolo principale del tagger basato sulla trasformazione è quello di generare regole di trasformazione che correggano l'output del tagger iniziale per essere più in linea con le frasi di addestramento. Vediamo di seguito il flusso di lavoro:
Esempio
Per questo esempio, useremo combine_tagger che abbiamo creato mentre pettinavamo i tagger (nella ricetta precedente) da una catena di backoff di NgramTagger classi, come initial_tagger. Innanzitutto, valutiamo il risultato utilizzandoCombine.tagger e poi usalo come initial_tagger per addestrare brill 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)
Produzione
0.9234530029238365
Vediamo ora il risultato della valutazione quando Combine_tagger è usato come initial_tagger addestrare brill tagger -
from tagger_util import train_brill_tagger
brill_tagger = train_brill_tagger(combine_tagger, train_sentences)
brill_tagger.evaluate(test_sentences)
Produzione
0.9246832510505041
Possiamo notarlo BrillTagger class ha una precisione leggermente maggiore rispetto a Combine_tagger.
Esempio di implementazione completo
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)
Produzione
0.9234530029238365
0.9246832510505041
TnT Tagger
TnT Tagger, acronimo di Trigrams'nTags, è un tagger statistico basato su modelli Markoviani del secondo ordine.
Come funziona?
Possiamo capire il funzionamento di TnT tagger con l'aiuto dei seguenti passaggi:
In primo luogo sulla base dei dati di addestramento, TnT tegger mantiene diversi file interni FreqDist e ConditionalFreqDist istanze.
Dopo di che unigrammi, bigrammi e trigrammi verranno contati da queste distribuzioni di frequenza.
Ora, durante il tagging, utilizzando le frequenze, calcolerà le probabilità di possibili tag per ogni parola.
Ecco perché invece di costruire una catena di backoff di NgramTagger, utilizza tutti i modelli di ngram insieme per scegliere il tag migliore per ogni parola. Valutiamo la precisione con il tagger TnT nel seguente esempio:
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)
Produzione
0.9165508316157791
Abbiamo una precisione leggermente inferiore a quella ottenuta con Brill Tagger.
Si prega di notare che dobbiamo chiamare train() prima evaluate() altrimenti otterremo una precisione dello 0%.