O blog da AWS

Como criar um classificador personalizado usando o Amazon Comprehend

Por Herve Nivon, Arquiteto de Soluções na AWS
 

Introdução

O Amazon Comprehend é um serviço de processamento de linguagem natural (PLN – ou NLP, na sigla em inglês) que usa aprendizado de máquina (ML, na sigla em inglês) para encontrar insights e relacionamentos em textos. O Amazon Comprehend pode identificar o idioma do texto, extrair frases-chave, lugares, pessoas, marcas ou eventos, e compreende o quão positivo ou negativo o texto é. Para obter mais informações sobre tudo o que o Amazon Comprehend pode fazer, consulte a página de funcionalidades do Amazon Comprehend.

Você pode precisar de recursos de PLN prontos para uso, vinculados às suas necessidades, sem ter que liderar uma fase de pesquisa. Isso permitiria reconhecer tipos de entidades e realizar classificações de documentos que são exclusivas para sua empresa, como reconhecer termos específicos do setor e fazer a triagem do feedback dos clientes em diferentes categorias.

O Amazon Comprehend é a combinação perfeita para esses casos de uso. Em novembro de 2018, o Amazon Comprehend adicionou a capacidade de treiná-lo para reconhecer entidades personalizadas e realizar classificações personalizadas. Para obter mais informações, consulte Crie seus próprios modelos de linguagem natural na AWS (sem necessidade de experiência em ML).

Este blogpost demonstra como criar um classificador de texto personalizado que pode atribuir um rótulo específico a um determinado texto. Nenhum conhecimento prévio de ML é necessário.

Sobre este blogpost
Tempo para completar
1 hora para o dataset reduzido; 2 horas para o dataset completo
Custo para completar
+/- USD $50 para o dataset reduzido; USD $150 para o dataset completo
Isso inclui treinamento, inferência e gerenciamento do modelo. Veja
a página de custos do Amazon Comprehend para mais detalhes.
Nível de aprendizado
Avançado (300)
Serviços AWS
Amazon Comprehend
Amazon S3
AWS Cloud9

Pré-requisitos

Para concluir esse passo a passo, você precisa de uma conta e acesso da AWS para criar recursos no AWS IAM, Amazon S3, Amazon Comprehend e AWS Cloud9 dentro dessa conta.

Esta postagem usa o corpus de respostas do Yahoo citado no artigo Text Understanding from Scratch, de Xiang Zhang e Yann LeCun. Esse conjunto de dados está disponível no AWS Open Data Registry.

Você também pode usar seu próprio conjunto de dados. É recomendável treinar seu modelo com até 1.000 documentos de treinamento para cada classe e que, ao selecionar suas classes, sugira rótulos que sejam claros e não tenham significado sobreposto. Para obter mais informações, consulte Treinar um classificador personalizado na documentação.

 

Visão geral da solução

O passo a passo inclui as seguintes etapas:

  1. Preparando seu ambiente
  2. Criação de um bucket do S3
  3. Configurando o IAM
  4. Preparando dados
  5. Treinando o classificador personalizado
  6. Coletando resultados

Para obter mais informações sobre como criar um reconhecedor de entidades personalizado para extrair informações como nomes de pessoas e organizações, locais, expressões de tempo e valores numéricos de um documento, consulte Criar um reconhecedor de entidades personalizado usando o Amazon Comprehend.

 

Preparando o ambiente

Neste post, você usa o AWS CLI o máximo possível para acelerar o experimento.

O AWS Cloud9 é um ambiente de desenvolvimento integrado (IDE) baseado em nuvem que permite escrever, executar e depurar seu código com um navegador. Ele inclui um editor de código, um depurador e um terminal. O AWS Cloud9 vem pré-empacotado com ferramentas essenciais para linguagens de programação populares e a CLI da AWS pré-instalada, para que você não precise instalar arquivos ou configurar seu laptop para este workshop.

Seu ambiente do AWS Cloud9 tem acesso aos mesmos recursos da AWS do usuário com o qual você fez login no Console de Gerenciamento da AWS.

Para preparar seu ambiente, conclua as seguintes etapas:

  1. No console, em Serviços, escolha AWS Cloud9.
  2. Escolha Criar ambiente.
  3. Em Nome, insira CustomClassifier.
  4. Escolha Próxima etapa.
  5. Em Configurações do ambiente, altere o tipo de instância para t2.large.
  6. Deixe as outras configurações em seus padrões.
  7. Escolha Próxima etapa.
  8. Revise as configurações do ambiente e escolha Criar ambiente.

Pode levar alguns minutos para que seu ambiente seja provisionado e preparado. Quando o ambiente estiver pronto, seu IDE se abrirá em uma tela de boas-vindas, que contém um prompt de terminal.

Você pode executar comandos da CLI da AWS nesse prompt da mesma forma que faria em seu computador local.

  1. Para verificar se seu usuário está conectado, digite o seguinte comando:
Admin:~/environment $ aws sts get-caller-identity

Você obtém a seguinte saída, que indica as informações da sua conta e do usuário:

{
    "Account": "123456789012",
    "UserId": "AKIAI53HQ7LSLEXAMPLE",
    "Arn": "arn:aws:iam::123456789012:user/Colin"
}
  1. Registre o ID da conta a ser usado na próxima etapa.

Mantenha seu IDE do AWS Cloud9 aberto em uma guia durante todo este passo a passo.

 

Criando um Bucket S3

Use o ID da conta da etapa anterior para criar um nome de bucket globalmente exclusivo, como 123456789012-comprehend. Insira o seguinte comando no prompt do terminal do AWS Cloud9:

Admin:~/environment $ aws s3api create-bucket --acl private --bucket '123456789012-comprehend' --region us-east-1

A saída mostra o nome do bucket que você criou:

{
    "Location": "/123456789012-comprehend"
}

Configurando o IAM

Para autorizar o Amazon Comprehend a realizar leituras e gravações de buckets durante o treinamento ou durante a inferência, você deve conceder ao Amazon Comprehend acesso ao bucket do S3 que você criou. Você está criando uma função de acesso a dados em sua conta para confiar na entidade de serviços do Amazon Comprehend.

Para configurar o IAM, conclua as seguintes etapas:

  1. No console, em Serviços, escolha IAM.
  2. Escolha Funções.
  3. Escolha Criar função.
  4. Selecione o serviço da AWS como o tipo de entidade confiável.
  5. Escolha Comprehend como o serviço que usa essa função.
  6. Escolha Avançar: Permissões.

A política chamada ComprehendDataAccessRolePolicy é anexada automaticamente.

  1. Escolha o próximo: Revisar
  2. Em Nome da função, insira ComprehendBucketAccessRole.
  3. Escolha Criar função.
  4. Registre o ARN da função.

Você usa esse ARN ao iniciar o treinamento do seu classificador personalizado.

 

Preparando os dados

Nesta etapa, você faz o download do corpus e prepara os dados para que correspondam aos formatos esperados do Amazon Comprehend para treinamento e inferência. Esta postagem fornece um script para ajudar você a preparar os dados do seu conjunto de dados.

Como alternativa, para maior comodidade, você pode baixar os dados preparados inserindo as duas linhas de comando a seguir:

Admin:~/environment $ aws s3 cp s3://aws-ml-blog/artifacts/comprehend-custom-classification/comprehend-test.csv . 

Admin:~/environment $ aws s3 cp s3://aws-ml-blog/artifacts/comprehend-custom-classification/comprehend-train.csv .

Se você seguir a etapa anterior, pule as próximas etapas e vá diretamente para a parte de carregamento no final desta seção.

Se você quiser fazer a preparação do conjunto de dados para este passo a passo ou se estiver usando seus próprios dados, siga as próximas etapas:

Insira o seguinte comando no prompt do terminal do AWS Cloud9 para baixá-lo do registro de dados abertos da AWS:

Admin:~/environment $ aws s3 cp s3://fast-ai-nlp/yahoo_answers_csv.tgz .

Você vê uma barra de progresso e, em seguida, a seguinte saída:

download: s3://fast-ai-nlp/yahoo_answers_csv.tgz to ./yahoo_answers_csv.tgz

Descompacte-o com o seguinte comando:

Admin:~/environment $ tar xvzf yahoo_answers_csv.tgz

Você deve excluir o arquivo porque está limitado no espaço disponível em seu ambiente do AWS Cloud9. Use o seguinte comando:

Admin:~/environment $ rm -f yahoo_answers_csv.tgz

Você obtém uma pasta yahoo_answers_csv, que contém os quatro arquivos a seguir:

  • classes.txt
  • readme.txt
  • test.csv
  • train.csv

Os arquivos train.csv e test.csv contêm as amostras de treinamento como valores separados por vírgula. Há quatro colunas nelas, correspondendo ao índice da classe (1 a 10), título da pergunta, conteúdo da pergunta e melhor resposta. Os campos de texto são escapados usando aspas duplas (“), e qualquer aspa dupla interna é substituída por duas aspas duplas (“”). Novas linhas são escapadas por uma barra invertida seguida por um caractere “n”, ou seja, “\ n”.

O código a seguir é a visão geral do conteúdo do arquivo:

"5","why doesn't an optical mouse work on a glass table?","or even on some surfaces?","Optical mice use an LED
"6","What is the best off-road motorcycle trail ?","long-distance trail throughout CA","i hear that the mojave
"3","What is Trans Fat? How to reduce that?","I heard that tras fat is bad for the body.  Why is that? Where ca
"7","How many planes Fedex has?","I heard that it is the largest airline in the world","according to the www.fe
"7","In the san francisco bay area, does it make sense to rent or buy ?","the prices of rent and the price of b

O arquivo classes.txt contém os rótulos disponíveis.

O arquivo train.csv contém 1.400.000 linhas e test.csv contém 60.000 linhas. O Amazon Comprehend usa de 10 a 20% dos documentos enviados para treinamento para testar o classificador personalizado.

O comando a seguir indica que os dados estão distribuídos uniformemente:

Admin:~/environment $ awk -F '","' '{print $1}'  yahoo_answers_csv/train.csv | sort | uniq -c

Você deve treinar seu modelo com até 1.000 documentos de treinamento para cada rótulo e não mais do que 1.000.000 de documentos.

Com 20% de 1.000.000 usados para testes, ainda há muitos dados para treinar seu classificador personalizado.
Use uma versão abreviada do train.csv para treinar seu modelo personalizado do Amazon Comprehend e use o test.csv para realizar sua validação e ver o desempenho do seu modelo personalizado.
Para treinamento, o formato do arquivo deve estar em conformidade com os seguintes requisitos:

  • O arquivo deve conter um rótulo e um texto por linha — 2 colunas
  • Sem cabeçalho
  • Formato UTF-8, retorno do carro “\ n”.

Os rótulos devem estar em maiúsculas, podem ter vários símbolos, ter espaços em branco, consistir em várias palavras conectadas por sublinhados ou hífens ou podem até conter uma vírgula, desde que sejam escapados corretamente.
A tabela a seguir contém os rótulos formatados propostos para o treinamento.

Índicie Original Para treino
1 Society & Culture SOCIETY_AND_CULTURE
2 Science & Mathematics SCIENCE_AND_MATHEMATICS
3 Health HEALTH
4 Education & Reference EDUCATION_AND_REFERENCE
5 Computers & Internet COMPUTERS_AND_INTERNET
6 Sports SPORTS
7 Business & Finance BUSINESS_AND_FINANCE
8 Entertainment & Music ENTERTAINMENT_AND_MUSIC
9 Family & Relationships FAMILY_AND_RELATIONSHIPS
10 Politics & Government POLITICS_AND_GOVERNMENT

Quando você quiser que seu modelo personalizado do Amazon Comprehend determine qual rótulo corresponde a um determinado texto de forma assíncrona, o formato do arquivo deve estar em conformidade com os seguintes requisitos:

  • O arquivo deve conter um texto por linha
  • Sem cabeçalho
  • Formato UTF-8, retorno do carro “\ n”.

Esta postagem inclui um script para acelerar a preparação dos dados. Insira o comando a seguir para copiar o script para seu ambiente local do AWS Cloud9:

Admin:~/environment $ aws s3 cp s3://aws-ml-blog/artifacts/comprehend-custom-classification/prepare_data.py .

Para iniciar a preparação de dados, insira os seguintes comandos:

Admin:~/environment $ sudo pip-3.6 install pandas tqdm
Admin:~/environment $ python3 prepare_data.py

Esse script está vinculado ao corpus do Yahoo e usa a biblioteca pandas para formatar os conjuntos de dados de treinamento e teste de acordo com as expectativas do Amazon Comprehend. Você pode adaptá-lo ao seu próprio conjunto de dados ou alterar o número de itens no conjunto de dados de treinamento e no conjunto de dados de validação.
Quando o script estiver concluído (ele deve ser executado por aproximadamente 11 minutos em uma instância t2.large para o conjunto de dados completo e em menos de 5 minutos para o conjunto de dados reduzido), você tem os seguintes novos arquivos em seu ambiente:

  • comprehend-train.csv
  • comprehend-test.csv

Faça upload dos dados preparados (o que você baixou ou o que você preparou) para o bucket que você criou com os seguintes comandos:

Admin:~/environment $ aws s3 cp comprehend-train.csv s3://123456789012-comprehend/

Admin:~/environment $ aws s3 cp comprehend-test.csv s3://123456789012-comprehend/

Treinando o Custom Classifier

Você está pronto para iniciar o treinamento de classificador de texto personalizado. Insira o comando a seguir e substitua o ARN da função e o nome do bucket pelos seus próprios:

Admin:~/environment $ aws comprehend create-document-classifier --document-classifier-name "yahoo-answers" --data-access-role-arn arn:aws:iam::123456789012:role/ComprehendBucketAccessRole --input-data-config S3Uri=s3://123456789012-comprehend/comprehend-train.csv --output-data-config S3Uri=s3://123456789012-comprehend/TrainingOutput/ --language-code en

Você obtém a seguinte saída que nomeia o classificador personalizado ARN:

{
    "DocumentClassifierArn": "arn:aws:comprehend:us-east-1:123456789012:document-classifier/yahoo-answers"
}

É uma chamada assíncrona. Em seguida, você pode acompanhar o progresso do treinamento com o seguinte comando:

Admin:~/environment $ aws comprehend describe-document-classifier --document-classifier-arn arn:aws:comprehend:us-east-1:123456789012:document-classifier/yahoo-answers

Você obtém o seguinte resultado:

{
    "DocumentClassifierProperties": {
        "DocumentClassifierArn": "arn:aws:comprehend:us-east-1: 123456789012:document-classifier/yahoo-answers",
        "Status": "TRAINING", 
        "LanguageCode": "en", 
        "DataAccessRoleArn": "arn:aws:iam:: 123456789012:role/ComprehendBucketAccessRole", 
        "InputDataConfig": {
            "S3Uri": "s3://123456789012-comprehend/comprehend-train.csv"
        },
        "SubmitTime": 1571657958.503, 
        "OutputDataConfig": {
            "S3Uri": "s3://123456789012-comprehend/TrainingOutput/123456789012-CLR-b205910479f3a195124bea9b70c4e2a9/output/output.tar.gz"
        }
    }
}

Quando o treinamento terminar, você obterá o seguinte resultado:

{
    "DocumentClassifierProperties": {
        "DocumentClassifierArn": "arn:aws:comprehend:us-east-1: 123456789012:document-classifier/yahoo-answers",
        "Status": "TRAINED", 
        "LanguageCode": "en", 
        "DataAccessRoleArn": "arn:aws:iam:: 123456789012:role/ComprehendBucketAccessRole", 
        "InputDataConfig": {
            "S3Uri": "s3://123456789012-comprehend/comprehend-train.csv"
        },
        "OutputDataConfig": {
            "S3Uri": "s3://123456789012-comprehend/TrainingOutput/123456789012-CLR-b205910479f3a195124bea9b70c4e2a9/output/output.tar.gz"
        },
        "SubmitTime": 1571657958.503,
        "EndTime": 1571661250.482,
        "TrainingStartTime": 1571658140.277
        "TrainingEndTime": 1571661207.915,
        "ClassifierMetadata": {
            "NumberOfLabels": 10,
            "NumberOfTrainedDocuments": 989873,
            "NumberOfTestDocuments": 10000,
            "EvaluationMetrics": {
                "Accuracy": 0.7235,
                "Precision": 0.722,
                "Recall": 0.7235,
                "F1Score": 0.7219
            }
        },
    }
}

A duração do treinamento pode variar; nesse caso, o treinamento levou aproximadamente uma hora para o conjunto de dados completo (20 minutos para o conjunto de dados reduzido).

O resultado do treinamento sobre o conjunto de dados completo mostra que seu modelo tem um recall de 0,72 — em outras palavras, ele identifica corretamente 72% dos rótulos fornecidos.
A captura de tela a seguir mostra a visualização do console (Comprehend > Custom classification > yahoo-answers).

Coletando resultados

Agora você pode iniciar um trabalho de inferência para testar o desempenho do classificador. Insira os seguintes comandos:

Admin:~/environment $ aws comprehend start-document-classification-job --document-classifier-arn arn:aws:comprehend:us-east-1:123456789012:document-classifier/yahoo-answers --input-data-config S3Uri=s3://123456789012-comprehend/comprehend-test.csv,InputFormat=ONE_DOC_PER_LINE --output-data-config S3Uri=s3://123456789012-comprehend/InferenceOutput/ --data-access-role-arn arn:aws:iam::123456789012:role/ComprehendBucketAccessRole

Você obtém o seguinte resultado:

{
    "JobStatus": "SUBMITTED", 
    "JobId": "cd5a6ee7f490a353e33f50d866d0317a"
}

Assim como você fez com o acompanhamento do progresso do treinamento, como a inferência é assíncrona, você pode verificar o progresso do trabalho recém-lançado com o seguinte comando:

Admin:~/environment $ aws comprehend describe-document-classification-job --job-id cd5a6ee7f490a353e33f50d866d0317a

Você obtém o seguinte resultado:

{
    "DocumentClassificationJobProperties": {
        "InputDataConfig": {
            "S3Uri": "s3://123456789012-comprehend/comprehend-test.csv", 
            "InputFormat": "ONE_DOC_PER_LINE"
        }, 
        "DataAccessRoleArn": "arn:aws:iam:: 123456789012:role/ComprehendBucketAccessRole", 
        "DocumentClassifierArn": "arn:aws:comprehend:us-east-1: 123456789012:document-classifier/yahoo-answers", 
        "JobStatus": "IN_PROGRESS", 
        "JobId": "cd5a6ee7f490a353e33f50d866d0317a", 
        "SubmitTime": 1571663022.503, 
        "OutputDataConfig": {
            "S3Uri": "s3://123456789012-comprehend/InferenceOutput/123456789012-CLN-cd5a6ee7f490a353e33f50d866d0317a/output/output.tar.gz"
        }
    }
}

Quando concluído, o JobStatus muda para COMPLETED. Isso leva aproximadamente alguns minutos para ser concluído.

Faça o download dos resultados usando o caminho OutputDataConfig.s3URI com o seguinte comando:

 

Admin:~/environment $ aws s3 cp s3://123456789012-comprehend/InferenceOutput/123456789012-CLN-cd5a6ee7f490a353e33f50d866d0317a/output/output.tar.gz .

Ao descompactar a saída (tar xvzf output.tar.gz), você obtém um arquivo.json. Cada linha representa o resultado da classificação solicitada para a linha correspondente do documento que você enviou.

Por exemplo, o código a seguir é uma linha das previsões:

{"File": "comprehend-test.csv", "Line": "9", "Classes": [{"Name": "ENTERTAINMENT_AND_MUSIC", "Score": 0.9685}, {"Name": "EDUCATION_AND_REFERENCE", "Score": 0.0159}, {"Name": "BUSINESS_AND_FINANCE", "Score": 0.0102}]}

Isso significa que seu modelo personalizado previu com uma pontuação de confiança de 96,8% que o texto a seguir estava relacionado ao selo “Entretenimento e música”.

"What was the first Disney animated character to appear in color? \n Donald Duck was the first major Disney character to appear in color, in his debut cartoon, \"The Wise Little Hen\" in 1934.\n\nFYI: Mickey Mouse made his color debut in the 1935 'toon, \"The Band Concert,\" and the first color 'toon from Disney was \"Flowers and Trees,\" in 1932."

Cada linha de resultados também fornece o segundo e o terceiro rótulos possíveis. Você pode usar essas pontuações diferentes para criar sua inscrição aplicando cada etiqueta com uma pontuação superior a 40% ou alterando o modelo se nenhuma pontuação única estiver acima de 70%.

 

Conclusão

Com o conjunto de dados completo para treinamento e validação, em menos de duas horas, você usou o Amazon Comprehend para aprender 10 categorias personalizadas — e obteve um recall de 72% no teste — e para aplicar esse modelo personalizado a 60.000 documentos.

Experimente categorias personalizadas agora no console do Amazon Comprehend. Para obter mais informações, consulte Classificação personalizada. Você pode descobrir outros recursos do Amazon Comprehend e se inspirar em outras postagens do blog da AWS sobre como usar o Amazon Comprehend além da classificação.

O Amazon Comprehend pode ajudar você a potencializar seu aplicativo com recursos de PLN quase que instantaneamente. Boa experimentação!

 

Este artigo foi traduzido do Blog da AWS em Inglês

 


Sobre o autor

Hervé Nivon é Arquiteto de Soluções na AWS