Toolkit del linguaggio naturale - Combinazione di tagger
Combinazione di tagger
La combinazione di tag o il concatenamento di tag tra loro è una delle caratteristiche importanti di NLTK. Il concetto principale alla base della combinazione di tagger è che, nel caso in cui un tagger non sappia come taggare una parola, verrebbe passato al tagger concatenato. Per raggiungere questo scopo,SequentialBackoffTagger ci fornisce il file Backoff tagging caratteristica.
Contrassegno di backoff
Come detto in precedenza, il tagging di backoff è una delle caratteristiche importanti di SequentialBackoffTagger, che ci consente di combinare i tagger in modo che se un tagger non sa come taggare una parola, la parola sarebbe passata al tagger successivo e così via fino a quando non ci sono tagger di backoff da controllare.
Come funziona?
In realtà, ogni sottoclasse di SequentialBackoffTaggerpuò accettare un argomento di parola chiave "backoff". Il valore di questo argomento della parola chiave è un'altra istanza di aSequentialBackoffTagger. Ora ogni volta che questoSequentialBackoffTaggerclass viene inizializzata, verrà creato un elenco interno di tag di backoff (con se stesso come primo elemento). Inoltre, se viene fornito un tag di backoff, l'elenco interno di questi tag di backoff verrà aggiunto.
Nell'esempio seguente, stiamo prendendo DefaulTagger come tagger di backoff nella ricetta Python sopra con la quale abbiamo addestrato il file UnigramTagger.
Esempio
In questo esempio, stiamo usando DefaulTaggercome il tagger backoff. Ogni volta che il fileUnigramTagger non è in grado di taggare una parola, tag backoff, ad es DefaulTagger, nel nostro caso, lo taggerà con "NN".
from nltk.tag import UnigramTagger
from nltk.tag import DefaultTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
back_tagger = DefaultTagger('NN')
Uni_tagger = UnigramTagger(train_sentences, backoff = back_tagger)
test_sentences = treebank.tagged_sents()[1500:]
Uni_tagger.evaluate(test_sentences)
Produzione
0.9061975746536931
Dall'output sopra riportato, è possibile osservare che aggiungendo un tagger di backoff la precisione aumenta di circa il 2%.
Salvataggio di tagger con sottaceti
Come abbiamo visto, addestrare un tagger è molto macchinoso e richiede tempo. Per risparmiare tempo, possiamo scegliere un tagger addestrato per utilizzarlo in seguito. Nell'esempio seguente, lo faremo con il nostro tagger già addestrato denominato‘Uni_tagger’.
Esempio
import pickle
f = open('Uni_tagger.pickle','wb')
pickle.dump(Uni_tagger, f)
f.close()
f = open('Uni_tagger.pickle','rb')
Uni_tagger = pickle.load(f)
Classe NgramTagger
Dal diagramma gerarchico discusso nell'unità precedente, UnigramTagger è ereditato da NgarmTagger class ma abbiamo altre due sottoclassi di NgarmTagger classe -
BigramTagger sottoclasse
In realtà un ngram è una sottosequenza di n elementi, quindi, come suggerisce il nome, BigramTaggerla sottoclasse esamina i due elementi. Il primo elemento è la parola contrassegnata in precedenza e il secondo elemento è la parola contrassegnata in quel momento.
Sottoclasse TrigramTagger
Sulla stessa nota di BigramTagger, TrigramTagger la sottoclasse esamina i tre elementi, ovvero due parole con tag precedenti e una parola con tag corrente.
Praticamente se applichiamo BigramTagger e TrigramTaggersottoclassi individualmente come abbiamo fatto con la sottoclasse UnigramTagger, entrambi hanno prestazioni molto scarse. Vediamo negli esempi seguenti:
Utilizzo della sottoclasse BigramTagger
from nltk.tag import BigramTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
Bi_tagger = BigramTagger(train_sentences)
test_sentences = treebank.tagged_sents()[1500:]
Bi_tagger.evaluate(test_sentences)
Produzione
0.44669191071913594
Utilizzo della sottoclasse TrigramTagger
from nltk.tag import TrigramTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
Tri_tagger = TrigramTagger(train_sentences)
test_sentences = treebank.tagged_sents()[1500:]
Tri_tagger.evaluate(test_sentences)
Produzione
0.41949863394526193
Puoi confrontare le prestazioni di UnigramTagger, che abbiamo usato in precedenza (forniva circa l'89% di precisione) con BigramTagger (forniva circa il 44% di precisione) e TrigramTagger (forniva circa il 41% di precisione). Il motivo è che i tagger Bigram e Trigram non possono apprendere il contesto dalla prima parola (e) di una frase. D'altra parte, la classe UnigramTagger non si preoccupa del contesto precedente e indovina il tag più comune per ogni parola, quindi in grado di avere un'elevata precisione di base.
Combinazione di tagger ngram
Come dagli esempi precedenti, è ovvio che i tag Bigram e Trigram possono contribuire quando li combiniamo con i tag backoff. Nell'esempio seguente, stiamo combinando i tag Unigram, Bigram e Trigram con i tag backoff. Il concetto è lo stesso della ricetta precedente mentre si combina UnigramTagger con il backoff tagger. L'unica differenza è che stiamo usando la funzione chiamata backoff_tagger () da tagger_util.py, fornita di seguito, per l'operazione di backoff.
def backoff_tagger(train_sentences, tagger_classes, backoff=None):
for cls in tagger_classes:
backoff = cls(train_sentences, backoff=backoff)
return backoff
Esempio
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
Dall'output di cui sopra, possiamo vedere che aumenta la precisione di circa il 3%.