Path: blob/master/site/pt-br/hub/tutorials/bangla_article_classifier.ipynb
25118 views
Copyright 2019 The TensorFlow Hub Authors.
Licensed under the Apache License, Version 2.0 (the "License");
Classificador de artigos em bengali com o TF Hub
Atenção: além de instalar pacotes Python com o pip, este notebook usa sudo apt install
para instalar pacotes do sistema: unzip
.
Este Colab é uma demonstração de uso do TensorFlow Hub para classificação de texto em idiomas locais/diferentes do inglês. Aqui, escolhemos bengali como o idioma local e usamos embeddings de palavras pré-treinados para resolver uma tarefa de classificação multiclasse, em que classificamos notícias em bengali em 5 categorias. Os embeddings pré-treinados para bengali vêm de fastText, uma biblioteca do Facebook com vetores de palavras pré-treinados lançados para 157 idiomas.
Primeiro, usaremos o exportador de embeddings pré-treinados do TF Hub para converter os embeddings de palavras em um módulo de embeddings de texto e depois usaremos o módulo para treinar um classificador usando tf.keras, uma API amigável de alto nível do TensorFlow para criar modelos de aprendizado profundo. Mesmo que estejamos usando embeddings de fastText, é possível exportar qualquer outro embedding pré-treinado a partir de outras tarefas e obter resultados rapidamente com o TensorFlow Hub.
Configuração
Dataset
Usaremos o BARD (dataset de notícias em bengali), que tem cerca de 376.226 notícias extraídas de diferentes portais de notícias em bengali e rotuladas em 5 categorias: economia, nacional, internacional, esportes e entretenimento. Baixamos o arquivo do Google Drive (bit.ly/BARD_DATASET). Esse link faz referência a este repositório do GitHub.
Exporte os vetores de palavras pré-treinados para o módulo do TF Hub
O TF Hub conta com alguns scripts úteis para converter embeddings de palavras em módulos de embeddings de texto do TF Hub aqui. Para criar o módulo para bengali ou qualquer outro idioma, basta baixar o arquivo de embeddings de palavras em .txt
ou .vec
para o mesmo diretório de export_v2.py
e executar o script.
O exportador lê os vetores de embeddings e os exporta para um SavedModel do TensorFlow. O SavedModel contém um programa completo do TensorFlow, incluindo os pesos e o grafo. O TF Hub pode carregar o SavedModel como um módulo, que será usado para criar o modelo para classificação de texto. Como estamos usando tf.keras
para criar o modelo, usaremos hub.KerasLayer, que conta com um encapsulador de um módulo do TF Hub para usar como uma Layer (camada) do Keras.
Primeiro, vamos baixar os embeddings de palavras em fastText e o exportador de embeddings no repositório do TF Hub.
Em seguida, vamos executar o script exportador em nosso arquivo de embeddings. Como os embeddings de fastText têm uma linha de cabeçalho e são muito grandes (cerca de 3,3 GB para bengali após converter para um módulo), ignoramos a primeira linha e exportamos somente os primeiros 100 mil tokens para o módulo de embeddings de texto.
O módulo de embeddings de texto recebe um lote de frases em um tensor de strings unidimensional como entrada e gera como saída os vetores de embeddings com formato (batch_size, embedding_dim), correspondentes às frases. Ele pré-processa a entrada por meio da divisão em espaços. Os embeddings de palavras são combinados em embeddings de frases usando o combinador sqrtn
(confira aqui). Para fins de demonstração, passamos uma lista de palavras em bengali como entrada e obtemos os vetores de embeddings correspondentes.
Converta para TensorFlow Dataset
Como o dataset é muito grande, em vez de carregar todo ele na memória, vamos usar um gerador para gerar amostras em tempo de execução nos lotes usando as funções do TensorFlow Dataset. O dataset também é bastante desequilibrado e, portanto, antes de usar o gerador, vamos embaralhar o dataset.
Vamos verificar a distribuição de rótulos nos exemplos de treinamento e validação após embaralhar o dataset.
Para criar um dataset usando um gerador, primeiro escrevemos uma função geradora que lê cada uma das notícias em file_paths
e os rótulos no array de rótulos e que gera um exemplo de treinamento em cada passo. Passamos essa função geradora para o método tf.data.Dataset.from_generator
e especificamos os tipos de saída. Cada exemplo de treinamento é uma tupla contendo uma notícia com tipo de dados tf.string
e um rótulo com codificação one-hot. Dividimos o dataset com uma divisão treinamento/validação de 80/20 utilizando os métodos tf.data.Dataset.skip
e tf.data.Dataset.take
.
Treinamento e avaliação do modelo
Como já adicionamos um encapsulador ao nosso módulo para usá-lo como qualquer outra camada no Keras, podemos criar um modelo sequencial pequeno que seja uma pilha linear de camadas. Podemos adicionar o módulo de embeddings de texto usando model.add
como qualquer outra camada. Para compilar o modelo, especificamos a perda e o otimizador e fazemos 10 épocas de treinamento. A API tf.keras
consegue tratar TensorFlow Datasets como entrada, então podemos passar uma instância de Dataset para o método de ajuste a fim de treinar o modelo. Como estamos usando a função geradora, tf.data
tratará da geração das amostras, da divisão dessas amostras em lotes e da alimentação delas no modelo.
Modelo
Treinamento
Avaliação
Podemos visualizar as curvas de exatidão e perda para os dados de treinamento e validação usando o objeto tf.keras.callbacks.History
retornado pelo método tf.keras.Model.fit
, que contém o valor de perda e exatidão para cada época.
Previsão
Podemos obter as previsões para os dados de validação e conferir a matriz de confusão para ver o desempenho do modelo para cada uma das 5 classes. Como o método tf.keras.Model.predict
retorna um array de dimensão n para as probabilidades de cada classe, é possível converter em rótulos de classe usando np.argmax
.
Compare o desempenho
Agora podemos obter os rótulos corretos para os dados de validação em labels
e compará-los com as previsões para obter um classification_report (relatório de classificação).
Também podemos comparar o desempenho do modelo com os resultados obtidos no artigo original, que teve uma precisão de 0,96. Os autores descreveram diversas etapas de pré-processamento realizadas no dataset, como a retirada de pontuações e numerais e a remoção das 25 palavras vazias mais frequentes. Como podemos ver no classification_report
, também obtivemos uma precisão e exatidão de 0,96 após somente 5 épocas de treinamento sem qualquer pré-processamento!
Neste exemplo, quando criamos a camada do Keras do modelo de embeddings, definimos o parâmetro trainable=False
, ou seja, os pesos dos embeddings não são atualizados durante o treinamento. Tente defini-lo como True
para alcançar uma exatidão de cerca de 97% usando esse dataset após somente 2 épocas.