Plus de marqueurs de boîte à outils en langage naturel

Affixer Tagger

Une autre classe importante de la sous-classe ContextTagger est AffixTagger. Dans la classe AffixTagger, le contexte est soit le préfixe, soit le suffixe d'un mot. C'est la raison pour laquelle la classe AffixTagger peut apprendre des balises basées sur des sous-chaînes de longueur fixe du début ou de la fin d'un mot.

Comment ça marche?

Son fonctionnement dépend de l'argument nommé affix_length qui spécifie la longueur du préfixe ou du suffixe. La valeur par défaut est 3. Mais comment distingue-t-il si la classe AffixTagger a appris le préfixe ou le suffixe du mot?

  • affix_length=positive - Si la valeur de affix_lenght est positive, cela signifie que la classe AffixTagger apprendra les préfixes des mots.

  • affix_length=negative - Si la valeur de affix_lenght est négative, cela signifie que la classe AffixTagger apprendra les suffixes des mots.

Pour clarifier les choses, dans l'exemple ci-dessous, nous utiliserons la classe AffixTagger sur des phrases treebank étiquetées.

Exemple

Dans cet exemple, AffixTagger apprendra le préfixe du mot car nous ne spécifions aucune valeur pour l'argument affix_length. L'argument prendra la valeur par défaut 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)

Production

0.2800492099250667

Voyons dans l'exemple ci-dessous quelle sera la précision lorsque nous fournirons la valeur 4 à l'argument 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)

Production

0.18154947354966527

Exemple

Dans cet exemple, AffixTagger apprendra le suffixe du mot car nous spécifierons une valeur négative pour l'argument 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)

Production

0.2800492099250667

Brill Tagger

Brill Tagger est un tagueur basé sur la transformation. NLTK fournitBrillTagger class qui est le premier tagueur qui n'est pas une sous-classe de SequentialBackoffTagger. En face, une série de règles pour corriger les résultats d'un tagueur initial est utilisée parBrillTagger.

Comment ça marche?

Former un BrillTagger classe utilisant BrillTaggerTrainer on définit la fonction suivante -

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)

Comme on peut le voir, cette fonction nécessite initial_tagger et train_sentences. Il faut uninitial_tagger et une liste de modèles, qui implémente le BrillTemplateinterface. leBrillTemplate l'interface se trouve dans le nltk.tbl.templatemodule. L'une de ces implémentations estbrill.Template classe.

Le rôle principal du tagueur basé sur la transformation est de générer des règles de transformation qui corrigent la sortie du tagger initial pour être plus en ligne avec les phrases d'apprentissage. Voyons le flux de travail ci-dessous -

Exemple

Pour cet exemple, nous utiliserons combine_tagger que nous avons créé en peignant les tagueurs (dans la recette précédente) à partir d'une chaîne backoff de NgramTagger classes, comme initial_tagger. Tout d'abord, évaluons le résultat en utilisantCombine.tagger puis utilisez-le comme initial_tagger pour former le tagueur de barbue.

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)

Production

0.9234530029238365

Maintenant, voyons le résultat de l'évaluation lorsque Combine_tagger est utilisé en tant que initial_tagger pour former le géniteur de barbue -

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

Production

0.9246832510505041

On peut remarquer que BrillTagger classe a une précision légèrement accrue sur Combine_tagger.

Exemple d'implémentation complet

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)

Production

0.9234530029238365
0.9246832510505041

Tagger TnT

TnT Tagger, signifie Trigrams'nTags, est un tagueur statistique basé sur des modèles de Markov du second ordre.

Comment ça marche?

Nous pouvons comprendre le fonctionnement du tagueur TnT à l'aide des étapes suivantes -

  • Basé d'abord sur les données d'entraînement, TnT tegger maintient plusieurs FreqDist et ConditionalFreqDist instances.

  • Après cela, les unigrammes, les bigrammes et les trigrammes seront comptés par ces distributions de fréquences.

  • Désormais, lors de l'étiquetage, en utilisant des fréquences, il calculera les probabilités d'étiquettes possibles pour chaque mot.

C'est pourquoi au lieu de construire une chaîne de backoff de NgramTagger, il utilise tous les modèles ngram ensemble pour choisir la meilleure balise pour chaque mot. Évaluons la précision avec le tagger TnT dans l'exemple suivant -

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)

Production

0.9165508316157791

Nous avons une précision légèrement inférieure à celle obtenue avec Brill Tagger.

Veuillez noter que nous devons appeler train() avant evaluate() sinon, nous obtiendrons une précision de 0%.