Kit de ferramentas de linguagem natural - Unigram Tagger
O que é Unigram Tagger?
Como o nome indica, unigram tagger é um tagger que usa apenas uma única palavra como contexto para determinar a tag POS (Part-of-Speech). Em palavras simples, Unigram Tagger é um tagger baseado em contexto cujo contexto é uma única palavra, ou seja, Unigram.
Como funciona?
NLTK fornece um módulo chamado UnigramTaggerpara este propósito. Mas antes de nos aprofundarmos em seu funcionamento, vamos entender a hierarquia com a ajuda do diagrama a seguir -
A partir do diagrama acima, entende-se que UnigramTagger é herdado de NgramTagger que é uma subclasse de ContextTagger, que herda de SequentialBackoffTagger.
O trabalho de UnigramTagger é explicado com a ajuda das seguintes etapas -
Como nós vimos, UnigramTagger herda de ContextTagger, ele implementa um context()método. estecontext() método leva os mesmos três argumentos que choose_tag() método.
O resultado de context()método será a palavra token que será usada posteriormente para criar o modelo. Depois que o modelo é criado, a palavra token também é usada para pesquisar a melhor tag.
Nesse caminho, UnigramTagger irá construir um modelo de contexto a partir da lista de frases marcadas.
Treinando um Unigram Tagger
NLTK's UnigramTaggerpode ser treinado fornecendo uma lista de frases marcadas no momento da inicialização. No exemplo abaixo, vamos usar as frases marcadas do treebank corpus. Estaremos usando as primeiras 2.500 frases desse corpus.
Exemplo
Primeiro importe o módulo UniframTagger do nltk -
from nltk.tag import UnigramTagger
Em seguida, importe o corpus que deseja usar. Aqui, estamos usando treebank corpus -
from nltk.corpus import treebank
Agora, pegue as frases para fins de treinamento. Estamos pegando as primeiras 2.500 frases para fins de treinamento e as marcaremos -
train_sentences = treebank.tagged_sents()[:2500]
Em seguida, aplique UnigramTagger nas frases usadas para fins de treinamento -
Uni_tagger = UnigramTagger(train_sentences)
Tome algumas sentenças, iguais ou menores, para fins de treinamento, ou seja, 2500, para fins de teste. Aqui estamos pegando os primeiros 1500 para fins de teste -
test_sentences = treebank.tagged_sents()[1500:]
Uni_tagger.evaluate(test_sents)
Resultado
0.8942306156033808
Aqui, obtivemos cerca de 89 por cento de precisão para um tagger que usa pesquisa de palavra única para determinar a tag POS.
Exemplo de implementação completo
from nltk.tag import UnigramTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
Uni_tagger = UnigramTagger(train_sentences)
test_sentences = treebank.tagged_sents()[1500:]
Uni_tagger.evaluate(test_sentences)
Resultado
0.8942306156033808
Substituindo o modelo de contexto
Do diagrama acima, mostrando a hierarquia para UnigramTagger, conhecemos todos os etiquetadores que herdam de ContextTagger, em vez de treinar seu próprio, pode usar um modelo pré-construído. Este modelo pré-construído é simplesmente um mapeamento de dicionário Python de uma chave de contexto para uma tag. E paraUnigramTagger, as chaves de contexto são palavras individuais, enquanto para outras NgramTagger subclasses, serão tuplas.
Podemos substituir este modelo de contexto, passando outro modelo simples para o UnigramTaggerclasse em vez de passar no conjunto de treinamento. Vamos entendê-lo com a ajuda de um exemplo fácil abaixo -
Exemplo
from nltk.tag import UnigramTagger
from nltk.corpus import treebank
Override_tagger = UnigramTagger(model = {‘Vinken’ : ‘NN’})
Override_tagger.tag(treebank.sents()[0])
Resultado
[
('Pierre', None),
('Vinken', 'NN'),
(',', None),
('61', None),
('years', None),
('old', None),
(',', None),
('will', None),
('join', None),
('the', None),
('board', None),
('as', None),
('a', None),
('nonexecutive', None),
('director', None),
('Nov.', None),
('29', None),
('.', None)
]
Como nosso modelo contém 'Vinken' como a única chave de contexto, você pode observar na saída acima que apenas esta palavra tem tag e todas as outras palavras têm None como tag.
Definir um limite mínimo de frequência
Para decidir qual tag é mais provável para um determinado contexto, o ContextTaggerclasse usa frequência de ocorrência. Ele fará isso por padrão, mesmo se a palavra de contexto e a tag ocorrerem apenas uma vez, mas podemos definir um limite mínimo de frequência passando umcutoff valor para o UnigramTaggerclasse. No exemplo abaixo, estamos passando o valor de corte na receita anterior em que treinamos um UnigramTagger -
Exemplo
from nltk.tag import UnigramTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
Uni_tagger = UnigramTagger(train_sentences, cutoff = 4)
test_sentences = treebank.tagged_sents()[1500:]
Uni_tagger.evaluate(test_sentences)
Resultado
0.7357651629613641