Path: blob/master/site/pt-br/tutorials/load_data/text.ipynb
25118 views
Copyright 2018 The TensorFlow Authors.
Carregue texto
Este tutorial mostra duas maneiras de carregar e pré-processar texto.
Primeiro, você usará utilitários e camadas de pré-processamento do Keras. Isso inclui
tf.keras.utils.text_dataset_from_directory
para transformar os dados em umtf.data.Dataset
etf.keras.layers.TextVectorization
para a padronização, tokenização e vetorização dos dados. Se você for iniciante no TensorFlow, comece com eles.Em seguida, você usará utilitários de nível inferior, como
tf.data.TextLineDataset
para carregar arquivos de texto, e APIs TensorFlow Text, comotext.UnicodeScriptTokenizer
etext.case_fold_utf8
, para pré-processar os dados para um controle mais granular.
Exemplo 1: preveja a tag de uma pergunta do Stack Overflow
Como um primeiro exemplo, baixe o dataset de perguntas de programação do Stack Overflow. Cada pergunta ("How do I sort a dictionary by value?", ou "Como classificar um dicionário por valor?") está rotulada com apenas uma tag (Python
, CSharp
, JavaScript
ou Java
). Sua tarefa é desenvolver um modelo que prevê a tag de uma pergunta. Isso é um exemplo de classificação multiclasse — um tipo de problema de aprendizado de máquina importante e amplamente aplicável.
Baixe e explore o dataset
Para começar, baixe o dataset do Stack Overflow usando tf.keras.utils.get_file
e explore a estrutura do diretório:
Os diretórios train/csharp
, train/java
, train/python
e train/javascript
contêm vários arquivos de texto, sendo cada um deles uma pergunta do Stack Overflow.
Imprima um arquivo de exemplo e inspecione os dados:
Carregue o dataset
Em seguida, você vai carregar os dados para fora do disco e prepará-los em um formato adequado para treinamento. Para isso, você usará o utilitário tf.keras.utils.text_dataset_from_directory
para criar um tf.data.Dataset
rotulado. Se você for iniciante no tf.data
, é uma coleção poderosa de ferramentas para criar pipelines de entrada. (Saiba mais no guia tf.data: crie pipelines de entrada do TensorFlow.)
A API tf.keras.utils.text_dataset_from_directory
espera uma estrutura de diretório assim:
Ao realizar um experimento de aprendizado de máquina, é uma prática recomendada dividir o dataset em três: treinamento, validação e teste.
O dataset do Stack Overflow já foi dividido em treinamento e teste, mas ainda falta o dataset de validação.
Crie um dataset de validação com uma divisão de 80:20 dos dados de treinamento usando tf.keras.utils.text_dataset_from_directory
com validation_split
definido como 0.2
(ou seja, 20%):
Como a saída da célula anterior sugere, há 8.000 exemplos nessa pasta de treinamento, e você usará 80% (ou 6.400) para treinamento. Você aprenderá em um instante que é possível treinar um modelo ao passar um tf.data.Dataset
diretamente para Model.fit
.
Primeiro, itere o dataset e imprima alguns exemplos, para ter uma noção dos dados.
Observação: para aumentar a dificuldade do problema de classificação, o autor do dataset trocou as ocorrências das palavras Python, CSharp, JavaScript ou Java na pergunta de programação pela palavra blank.
Os rótulos são 0
, 1
, 2
ou 3
. Para conferir quais deles correspondem a cada rótulo de string, inspecione a propriedade class_names
do dataset:
Em seguida, você criará um dataset de validação e teste usando tf.keras.utils.text_dataset_from_directory
. Você usará as 1.600 avaliações restantes do dataset de treinamento para validação.
Observação: ao usar os argumentos validation_split
e subset
de tf.keras.utils.text_dataset_from_directory
, especifique uma semente aleatória ou passe shuffle=False
, para que as divisões de validação e treinamento não se sobreponham.
Prepare o dataset para treinamento
Em seguida, você padronizará, tokenizará e vetorizará os dados usando a camada tf.keras.layers.TextVectorization
.
A padronização se refere ao pré-processamento do texto, geralmente para remover pontuação ou elementos HTML, simplificando o dataset.
A tokenização se refere à divisão de strings em tokens (por exemplo, dividindo uma frase em palavras individuais ao separar nos espaços em branco).
A vetorização se refere à conversão de tokens em números para alimentar uma rede neural.
Todas essas tarefas podem ser realizadas com essa camada. (Saiba mais sobre cada uma delas nos documentos da API tf.keras.layers.TextVectorization
.)
Observe que:
A padronização padrão converte o texto para letras minúsculas e remove a pontuação (
standardize='lower_and_strip_punctuation'
).O tokenizer padrão faz a separação nos espaços em branco (
split='whitespace'
).O modo de vetorização padrão é
'int'
(output_mode='int'
). Isso gera índices de números inteiros (um por token). Esse modo pode ser usado para criar modelos que consideram a ordem das palavras. Você também pode usar outros modos, como'binary'
, para criar modelos bag-of-words.
Você criará dois modelos para saber mais sobre a padronização, tokenização e vetorização com TextVectorization
:
Primeiro, você usará o modo de vetorização
'binary'
para criar um modelo bag-of-words.Em seguida, você usará o modo
'int'
com uma ConvNet 1D.
Para o modo 'int'
, além do tamanho de vocabulário máximo, você precisa definir um comprimento de sequência máximo explícito (MAX_SEQUENCE_LENGTH
), que fará com que a camada preencha ou trunque as sequências exatamente para valores output_sequence_length
:
Em seguida, chame TextVectorization.adapt
para adequar o estado da camada de pré-processamento ao dataset. Isso fará com que o modelo crie um índice de strings para os números inteiros.
Observação: é importante só usar seus dados de treinamento ao chamar TextVectorization.adapt
, já que o uso do dataset de teste vazaria informações.
Imprima o resultado de usar essas camadas para pré-processar dados:
Conforme mostrado acima, o modo 'binary'
de TextVectorization
retorna um array que indica quais tokens existem pelo menos uma vez na entrada, enquanto o modo 'int'
substitui cada token por um número inteiro, preservando a ordem deles.
Você pode consultar o token (string) correspondente a cada número inteiro ao chamar TextVectorization.get_vocabulary
na camada:
Já está quase tudo pronto para treinar o modelo.
Como etapa final de pré-processamento, você aplicará as camadas TextVectorization
criadas antes para os datasets de treinamento, validação e teste:
Configure o dataset para melhor desempenho
Há dois métodos importantes que você deve usar ao carregar os dados para garantir que a I/O não seja bloqueada.
Dataset.cache
mantém os dados na memória após o carregamento fora do disco. Isso garante que o dataset não se torne um gargalo ao treinar seu modelo. Se o dataset for muito grande para a memória, você também pode usar esse método para criar um cache no disco eficaz, que tem uma leitura mais eficiente do que vários arquivos pequenos.Dataset.prefetch
sobrepõe o pré-processamento de dados e a execução do modelo durante o treinamento.
Saiba mais sobre ambos os métodos, além de como armazenar os dados em cache no disco, na seção Pré-busca do guia Melhor desempenho com a API tf.data API.
Treine o modelo
Chegou a hora de criar sua rede neural.
Para os dados 'binary'
vetorizados, defina um modelo linear bag-of-words simples. Depois, configure e treine esse modelo:
Em seguida, você usará a camada 'int'
vetorizada para criar uma ConvNet 1D:
Compare os dois modelos:
Avalie os dois modelos com o dataset de teste:
Observação: esse dataset de exemplo representa um problema de classificação bastante simples. Datasets e problemas mais complexos revelam diferenças sutis mas significativas nas estratégias de pré-processamento e arquiteturas de modelos. Teste épocas e hiperparâmetros diferentes para comparar várias abordagens.
Exporte o modelo
No código acima, você aplicou o tf.keras.layers.TextVectorization
ao dataset antes de alimentar o modelo com texto. Se você quiser tornar o modelo capaz de processar strings brutas (por exemplo, para simplificar a implantação), é possível incluir a camada TextVectorization
dentro do modelo.
Para isso, crie um novo modelo usando os pesos que você acabou de treinar:
Agora, seu modelo aceita strings brutas como entrada e prevê uma pontuação para cada rótulo usando Model.predict
. Defina uma função para encontrar o rótulo com a pontuação máxima:
Realize a inferência dos dados novos
Incluindo a lógica de pré-processamento de texto dentro do modelo, você pode exportar um modelo para produção que simplifica a implantação e reduz o potencial de desvio de treinamento/teste.
Há uma diferença de desempenho que você deve considerar ao escolher onde aplicar o tf.keras.layers.TextVectorization
. Ao usá-lo fora do modelo, você pode fazer o processamento de CPU assíncrono e armazenar os dados em buffer ao treinar na GPU. Portanto, se você estiver treinando seu modelo na GPU, deve escolher essa opção para obter o melhor desempenho ao desenvolver o modelo. Depois, quando você estiver pronto para preparar a implantação, troque para a inclusão da camada TextVectorization
dentro do modelo.
Acesse o tutorial Salve e carregue modelos para saber mais sobre como salvar modelos.
Exemplo 2: preveja o tradutor da Ilíada
Confira a seguir como usar o tf.data.TextLineDataset
para carregar exemplos de arquivos de texto e o TensorFlow Text para pré-processar dados. Você usará três traduções em inglês da mesma obra, a Ilíada do Homero, e treinará um modelo para identificar o tradutor a partir de uma única linha de texto.
Baixe e explore o dataset
Os textos das três traduções são de:
Os arquivos de texto usados neste tutorial passaram por algumas tarefas típicas de pré-processamento, como remoção de cabeçalhos, rodapés, números de linhas e títulos de capítulos dos documentos.
Baixe esses arquivos ligeiramente manipulados localmente:
Carregue o dataset
Antes, com o tf.keras.utils.text_dataset_from_directory
todo o conteúdo de um arquivo era tratado como um único exemplo. Aqui, você usará o tf.data.TextLineDataset
, feito para criar um tf.data.Dataset
a partir de um arquivo de texto em que cada exemplo é uma linha de texto do arquivo original. O TextLineDataset
é útil para dados de texto que são principalmente baseados em linha (por exemplo, poesia ou logs de erros).
Itere esses arquivos, carregando cada um em um dataset próprio. Cada exemplo precisa ser rotulado individualmente, então use Dataset.map
para aplicar uma função rotuladora. Isso fará com que cada exemplo do dataset seja iterado, retornando pares (example, label
).
Em seguida, combine esses datasets rotulados em um único dataset usando Dataset.concatenate
e o misture com Dataset.shuffle
:
Imprima alguns exemplos como antes. O dataset ainda não foi dividido em lotes, então cada entrada em all_labeled_data
corresponde a um ponto de dados:
Prepare o dataset para treinamento
Em vez de usar tf.keras.layers.TextVectorization
para pré-processar o dataset de texto, use as APIs TensorFlow Text para padronizar e tokenizar os dados, crie um vocabulário e use tf.lookup.StaticVocabularyTable
para mapear tokens para números inteiros e alimentar o modelo. (Saiba mais sobre o TensorFlow Text).
Defina uma função para converter o texto em letras maiúsculas e realizar a tokenização:
O TensorFlow Text oferece vários tokenizers. Neste exemplo, você usará
text.UnicodeScriptTokenizer
para tokenizar o dataset.Você usará
Dataset.map
para aplicar a tokenização ao dataset.
Itere o dataset e imprima alguns exemplos tokenizados:
Em seguida, crie um vocabulário ao ordenar os tokens por frequência e manter os principais tokens VOCAB_SIZE
:
Para converter os tokens em números inteiros, use o dataset vocab
para criar um tf.lookup.StaticVocabularyTable
. Você mapeará os tokens para números inteiros no intervalo [2
, vocab_size + 2
]. Assim como a camada TextVectorization
, 0
é reservado para indicar o preenchimento e 1
para indicar um token fora do vocabulário (OOV).
Por fim, defina uma função para padronizar, tokenizar e vetorizar o dataset usando o tokenizer e a tabela de consulta:
Teste isso em um único exemplo para imprimir a saída:
Agora execute a função de pré-processamento no dataset usando Dataset.map
:
Divida o dataset em treinamento e validação
A camada TextVectorization
do Keras também divide em lotes e preenche os dados vetorizados. O preenchimento é necessário porque os exemplos dentro de um lote precisam ser do mesmo tamanho e formato, mas os exemplos nesses datasets não são todos do mesmo tamanho — cada linha de texto tem um número diferente de palavras.
tf.data.Dataset
é compatível com a divisão e os lotes preenchidos de datasets:
Agora, validation_data
e train_data
não são coleções de pares (example, label
), e sim coleções de lotes. Cada lote é um par de (vários exemplos, vários rótulos) representado como arrays.
Para ilustrar isso:
Já que você usou 0
para preenchimento e 1
para tokens fora do vocabulário (OOV), o tamanho do vocabulário aumentou em dois:
Configure os datasets para melhor desempenho como antes:
Treine o modelo
Você pode treinar um modelo com esse dataset como antes:
Exporte o modelo
Para tornar o modelo capaz de aceitar strings brutas como entrada, crie uma camada TextVectorization
do Keras que realize os mesmos passos que sua função de pré-processamento personalizado. Como você já treinou um vocabulário, use TextVectorization.set_vocabulary
(em vez de TextVectorization.adapt
), que treina um novo vocabulário.
A perda e a exatidão do modelo com o dataset de validação codificado e do modelo exportado com o dataset de validação bruto são as mesmas, conforme esperado.
Realize a inferência dos dados novos
Baixe mais datasets usando o TensorFlow Datasets (TFDS)
Você pode baixar muitos outros datasets no TensorFlow Datasets.
Neste exemplo, você usará o grande dataset de avaliações de filmes do IMDB para treinar um modelo para classificação de sentimentos:
Imprima alguns exemplos:
Agora você pode pré-processar os dados e treinar um modelo como antes.
Observação: você usará tf.keras.losses.BinaryCrossentropy
em vez de tf.keras.losses.SparseCategoricalCrossentropy
para seu modelo, já que esse é um problema de classificação binária.
Prepare o dataset para treinamento
Crie, configure e treine o modelo
Exporte o modelo
Conclusão
Este tutorial mostra diversas maneiras de carregar e pré-processar texto. Como próximo passo, você pode explorar mais tutoriais de pré-processamento de texto do TensorFlow Text, como:
Você também pode encontrar novos datasets no TensorFlow Datasets. Para saber mais sobre o tf.data
, confira o guia sobre a criação de pipelines de entrada.