Como disponibilizar uma interface web para o seu classificador de texto

Thiago Magnago
Data Hackers
Published in
7 min readOct 25, 2021

Conheça um jeito simples e gratuito de criar uma aplicação com seu modelo de machine learning para classificação de texto.

Aplicativo desenvolvido com Streamlit

Imagine que você desenvolveu em Python um modelo para classificar textos de determinado domínio. E já percorreu boa parte do pipeline de NLP (Natural Language Processing): da obtenção dos dados à avaliação do modelo.

Legal! Seu classificador alcançou métricas satisfatórias, mas ainda será preciso colocá-lo em produção, momento conhecido como deployment. Esse post vai demonstrar uma forma simples de se fazer isso, disponibilizando na web um aplicativo por meio do qual o usuário consiga apresentar um texto e obter sua classificação, com base no seu modelo preditivo.

Pipeline genérico de NLP. Adaptado de Practical Natural Language Processing by Sowmya Vajjala, et al.

Contextualizando o exemplo

No exemplo deste post, o modelo de classificação de texto foi desenvolvido para indicar a relevância (ou não) de determinada norma tributária para uma empresa. Diariamente são publicados inúmeros normativos tributários no Brasil, que precisam ser lidos por experts para avaliar se o ato legal traz algum impacto ao negócio da empresa. Dessa leitura, extraem-se duas conclusões possíveis:

  • Há impacto na empresa => ato legal RELEVANTE
  • Não há impacto na empresa => ato legal NÃO RELEVANTE

Portanto, o objetivo do modelo é fazer a referida classificação dos atos legais, otimizando o tempo dos experts que atuam nessa atividade diária. Na prática, o sistema que gerencia tais atos consumirá o modelo treinado e os classificará quanto a sua relevância para o negócio.

Mas até que a integração desse sistema de gestão dos atos legais com o modelo seja desenvolvida — deploy, tipicamente realizado por um engenheiro de machine learning — surgiu a ideia de antecipar e tangibilizar o uso do classificador pelos experts tributários, por meio de um protótipo de interface, para que se familiarizem e forneçam feedback sobre os outputs do modelo.

E foi aí que usamos o Streamlit: uma plataforma open-source de aplicativos para machine learning e times de data science. Basicamente, basta conectá-la ao seu repositório no GitHub e o ambiente em nuvem será configurado com os requisitos necessários para seu aplicativo na web. E você não precisa ter experiência com front-end, muito embora tal conhecimento ajude na personalização da sua página.

Etapas para criação do aplicativo no Streamlit

Na sequência iremos discorrer sobre as seis etapas realizadas e apresentar algumas dicas.

1ª etapa — Solicitar convite para o Streamlit Community

Solicitar seu convite para uso da plataforma por meio do formulário Streamlit Cloud Community. Pois é, ao menos por ora não é plug and play! É preciso solicitar e esperar seu convite chegar por email. Daí a sugestão de iniciar por este pedido de ingresso, para que você adiante outras coisas enquanto aguarda. No meu caso, o convite chegou em algumas horas, mas a plataforma diz que os convites são enviados semanalmente.

2ª etapa — Criação de um pipeline do modelo preditivo

Em se tratando de um modelo de machine learning clássico para classificação de texto, sabemos que previamente ao treinamento do algoritmo, os dados brutos passam pelas etapas de limpeza (remoção de tags html, etc.), pré-processamento (tokenização, remoção de stop words, dígitos e pontuação, lematização, etc.) e representação do texto (bag of words, TF-IDF, word embeddings, etc).

E as mesmas etapas a que foram submetidos os textos em tempo de treinamento, serão também necessárias em tempo de predição. Ou seja, as funções criadas para tratamento e representação do texto serão também utilizadas nos dados (textos) a serem classificados por seu aplicativo, de modo que o modelo receba os dados para predição no mesmo formato no qual foi treinado.

Neste caso, a dica aqui é encapsular todas essas etapas, da limpeza dos dados ao modelo preditivo, em um pipeline. Para isso, o scikit-learn possui uma função chamada make_pipeline. Veja o trecho de código abaixo:

Explicando cada linha do pipeline:

  • TfidfVectorizer(preprocessor=pre_processing) — O texto será representado no formato TF-IDF. Mas antes disso, passará por um pré-processamento de acordo com a função ‘pre_processing’, declarada em etapa anterior: remoção de stopwords, transliteração, limpeza e lemetização. Tal função variará conforme o seu projeto, e será necessária no momento da geração do aplicativo. Veremos mais à frente.
  • FunctionTransformer(func=dense, accept_sparse=True) — A representação TF-IDF retornará uma matriz esparsa. Contudo, o algoritmo escolhido HistogramGradientBoostingClassifier exige uma matriz densa. Daí a necessidade de incluir essa transformação no pipeline, passando a função ‘dense’ (também criada anteriormente) no parâmetro ‘func’.
  • HistGradientBoostingClassifier() — Este foi o algoritmo escolhido, disponível na biblioteca scikit-learn.

3ª etapa — Salvando o modelo

Uma vez treinado o modelo, será preciso salvá-lo. Neste caso pode-se usar o módulo pickle, que que faz parte da biblioteca Python por padrão.

4ª etapa — Desenvolvimento do arquivo.py

Inicialmente será preciso instalar o Streamlit, por meio do comandopip install streamlit .

Agora é o momento de desenvolver o arquivo.py, que será o ‘executável’ do seu aplicativo.

Em linhas gerais, didaticamente podemos dividir este arquivo em 5 grupos de código. Vamos a cada um deles:

  • Grupo 1. Importação dos módulos e bibliotecas

Além da própria biblioteca Streamlit, foram importados módulos para tratamento do texto bruto e carregamento do modelo treinado.

  • Grupo 2. Funções utilizadas no pipeline do modelo (conforme abordado na 2ª etapa)

Há 2 funções. A primeira delas, chamada pre_processing, fará o pré-processamento do texto, passando pela transliteração, limpeza e lematização. Quanto às stopwords, observe que a opção foi trazer uma lista reduzida, para fins de simplificar a demonstração. No entanto, pode-se optar por usar stopwords de bibliotecas como nltk.

Já a segunda função, ‘dense’, será usada para transformar a matriz de representação do texto (TF-IDF) em uma matriz densa, formato necessário para a previsão do algoritmo.

  • Grupo 3. Carregamento do modelo classificador

Carregamos o modelo na variável ‘classifier’, que será acionada no momento em que o usuário pedir (clicar) para classificar o texto.

  • Grupo 4. Função de predição, a partir do input fornecido pelo usuário

Esta função fará a classificação do texto a partir do input do usuário na interface. Retornará a predição da classe e sua respectiva probabilidade.

Quanto ao @st.cache antes da função, trata-se de um mecanismo para otimizar a performance. Detalhes podem ser obtidos aqui.

  • Grupo 5. Funções e componentes para a interface do aplicativo

Na variável ‘html_temp’ foi configurada a área do título da interface, que será usada no componente st.markdown, o qual plota a string formatada como Markdown.

Na sequência, a variável ‘text’ traz o componente st.text_area, que representa uma área de texto multi-linha, a qual receberá o input (texto) do usuário.

Inserido o texto, o usuário solicitará a classificação pelo modelo. Neste caso, criamos o botão “Classificar” por meio do st.button que, quando acionado, chamará a função de predição demonstrada na etapa 4. Por fim, printará na tela o resultado da classificação por meio do componente st.info.

  • Grupo 6. Testando seu aplicativo

Uma vez configurado seu ‘arquivo.py’, pode testá-lo no terminal por linha de comando. No diretório no qual está o arquivo, digite

streamlit run seu_arquivo.py

Com isso será gerada uma URL para abertura pelo navegador.

Faça os testes necessários e promova os ajustes pertinentes. Finda esta etapa, estaremos quase lá!

5ª etapa — Elaboração do requirements.txt

Com seu aplicativo funcionando como esperado, chegou a hora de colocá-lo em produção. E para isso, será preciso relacionar num arquivo denominado ‘requirements.txt’ os itens/pacotes requeridos para que o Streamlit os disponibilize no ambiente que hospedará seu aplicativo.

Uma maneira de criar este arquivo de dependências automaticamente é por meio da seguinte linha de comando no terminal:

pip freeze > requirements.txt

Este material pode te dar mais detalhes sobre esta etapa.

Meu ‘requirements.txt’ final, após pequenos ajustes, ficou assim:

Dica: Fique atento às versões. Exemplo: Utilize a mesma versão do scikit-learn utilizada no treinamento do seu algoritmo, para que não haja problema no momento da predição.

6ª etapa — Criando o aplicativo no Streamlit

A essa altura seu convite para uso do Streamlit já deve ter chegado por email (verifique também no lixo eletrônico!). O convite deve se parecer com isso:

Basta seguir as instruções do email: Suba seus arquivos para um repositório público no GitHub: ‘seu_modelo’.pkl, ‘seu_arquivo’.py e o ‘requirements.txt’. Depois basta logar em share.streamlit.io e criar seu aplicativo, apontando para o repositório no GitHub. A plataforma irá então fazer o deploy e seu aplicativo estará disponível na web.

Aqui estão os links para o aplicativo demonstrado e repositório no GitHub.

Sucesso com sua aplicação!

Referências

Dependências de projetos Python: requirements.txt. Jessica Temporal, 2018. Disponível em: <https://jtemporal.com/requirements-txt/>. Acesso em: 10 out. 2021.

Practical Natural Language Processing by Sowmya Vajjala, Bodhisattwa Majumder, Anuj Gupta, and Harshit Surana (O’Reilly). Copyright 2020 Anuj Gupta, Bodhisattwa Prasad Majumder, Sowmya Vajjala, and Harshit Surana, 978–1–492–05405-4.

Stack. Como colocar um modelo de Machine Learning em Produção? (Tutorial Completo). Youtube, 3 jun. 2021. Disponível em: <https://www.youtube.com/watch?v=HRVAzphuAEY>. Acesso em: 27 set. 2021.

--

--