<jupyter_start><jupyter_text><jupyter_code><jupyter_output><empty_output><jupyter_text>Treinar um etiquetador morfossintáticoPara realizar a etiquetagem morfossintática de textos, é preciso obter um etiquetador. O NLTK possui diversas opções para a criação de classificadores e etiquetadores de palavras: DefaultTagger, RegexpTagger, UnigramTagger, BigramTagger, TrigramTagger, BrillTagger, além de outros classificadores.A criação de etiquetadores requer dados de treinamento, textos previamente etiquetados, no formato de sentenças etiquetadas, especificamente em listas de tuplas para o NLTK. A partir dos dados e algoritmos de treinamento, cria-se um objeto (etiquetador) que pode ser armazenado para usos futuros, uma vez que o treinamento leva um tempo considerável.  RecursosPara realizar o teste de utilização, precisamos carregar o corpus mc-morpho e o tokenizador 'punkt' da biblioteca do nltk:<jupyter_code>import nltk

nltk.download('mac_morpho')
nltk.download('punkt')

import nltk
import pickle
from nltk.corpus import mac_morpho

# prepara dados de treinamento e teste
sents = mac_morpho.tagged_sents()
trein = sents[0:30000]
teste = sents[13000:]

# treina um etiquetador sequencial
etq1 = nltk.DefaultTagger('N')
etq2 = nltk.UnigramTagger(trein,backoff=etq1)
etq3 = nltk.BigramTagger(trein,backoff=etq2)

# imprime a acurácia dos etiquetadores
print('DefaultTagger', etq1.evaluate(teste))
print('UnigramTagger', etq2.evaluate(teste))
print('BigramTagger', etq3.evaluate(teste))

# armazena o etiquetador treinado
with open('etq.pickle','wb') as fh:
  pickle.dump(etq3,fh)<jupyter_output>DefaultTagger 0.20087708474599295
UnigramTagger 0.8237940367746194
BigramTagger 0.842816406510894<jupyter_text>No exemplo, carregamos os dados etiquetados para treinamento e teste do etiquetador. Separamos uma quantidade maior de sentenças para treino (70%) e outra menor para teste (30%).Em seguida, iniciamos o processo de treinamento de um etiquetador sequencial a partir de três modelos diferentes combinados. O etiquetador 'DefaultTagger' atribui uma etiqueta padrão ('N') para todas as palavras. O etiquetador 'UnigramTagger', treinado com as sentenças, atribui a etiqueta mais provável para a palavra a partir de um dicionário criado internamente. O etiquetador 'BigramTagger', também treinado com as sentenças etiquetadas, atribui a etiqueta mais provável para a palavra com base na etiqueta anterior (hipótese de Markov). A combinação dos etiquetadores é feita sequencialmente por meio do argumento 'backoff''.Tendo realizado o treinamento do etiquetador, avaliamos a precisão de cada etapa por meio da função ‘evaluate()’, passando como argumento a variável ‘teste’, que armazena parte das sentenças etiquetadas do corpus MacMorpho. No processo, obtemos a impressão do desempenho de cada um dos etiquetadores em separado. O etiquetador final, resultado da combinação de todos, obtém uma precisão de 84% com os dados de teste.Por fim, armazenamos o etiquetador treinado para usos posteriores por meio da função ‘dump’, do módulo ‘pickle’. Para verificar a funcionalidade do etiquetador, realizamos o seguinte teste:<jupyter_code>import nltk
import pickle

# carrega o etiquetador treinado
with open('etq.pickle','rb') as fh:
  etiquetador = pickle.load(fh)

# armazena um texto a ser etiquetado como teste
texto = 'Estamos realizando um teste agora.'

# itemiza o texto
itens = nltk.word_tokenize(texto,language='portuguese')

# etiqueta os itens
itens_etiquetados = etiquetador.tag(itens)

# imprime o resultado
print(itens_etiquetados)<jupyter_output>[('Estamos', 'V'), ('realizando', 'V'), ('um', 'ART'), ('teste', 'N'), ('agora', 'ADV'), ('.', '.')]
{'fraction_non_alphanumeric': 0.07583196944899072, 'fraction_numerical': 0.021003818876159302, 'mean_word_length': 6.393145161290323, 'pattern_counts': {'":': 0, '<': 11, '<?xml version=': 0, '>': 11, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '2292', 'license': 'MIT', 'n_tokens_mistral': 1389, 'n_tokens_neox': 1323, 'n_words': 420, 'path': 'nltk_treinar_etiquetador.ipynb', 'repo_name': 'ilexistools/ebralc2021', 'size': '3666'}