Classificador de Intenções - Atendimento ao Cliente
Modelo híbrido BERT + Random Forest para classificação automática de intenções em mensagens de atendimento ao cliente em português brasileiro.
Descrição
Sistema completo de classificação automática de intenções que combina:
- BERT português (
neuralmind/bert-base-portuguese-cased) para embeddings semânticos - Random Forest para classificação final
- 16 categorias de intenções de atendimento ao cliente
Métricas de Performance
- Acurácia: 67.4%
- Acurácia CV: 66.7% ± 1.9%
- 16 categorias de intenção
- Dataset: Mensagens reais de atendimento
Categorias Suportadas
| Categoria | Nome Legível | Exemplo |
|---|---|---|
duvida_produto |
Dúvida sobre Produto | "Este produto é resistente à água?" |
rastreamento_pedido |
Rastreamento de Pedido | "Onde está meu pedido #123?" |
agradecimento |
Agradecimento | "Muito obrigada pela ajuda!" |
saudacao |
Saudação | "Bom dia, como estão?" |
troca_devolucao |
Troca/Devolução | "Quero trocar por outro tamanho" |
problema_tecnico |
Problema Técnico | "O app não está funcionando" |
solicitacao_informacao |
Solicitação de Informação | "Preciso de mais detalhes" |
reacao_emocional |
Reação Emocional | "Que decepção!" |
interesse_produto |
Interesse em Produto | "Gostaria de saber mais sobre..." |
solicitacao_contato |
Solicitação de Contato | "Podem me ligar?" |
mensagem_sistema |
Mensagem do Sistema | "Mensagem enviada automaticamente" |
nao_identificado |
Não Identificado | Mensagens ambíguas |
reposicao_estoque |
Reposição de Estoque | "Quando volta ao estoque?" |
confirmacao |
Confirmação | "Sim, pode prosseguir" |
parceria_comercial |
Parceria Comercial | "Interesse em revenda" |
evento_presencial |
Evento Presencial | "Quando será o evento?" |
Como Usar
import pickle
import torch
import numpy as np
from transformers import AutoTokenizer, AutoModel
class ClassificadorIntencoes:
def __init__(self):
# Carregar BERT
self.tokenizer = AutoTokenizer.from_pretrained("neuralmind/bert-base-portuguese-cased")
self.bert = AutoModel.from_pretrained("neuralmind/bert-base-portuguese-cased")
# Carregar modelo treinado
with open('modelo_classificacao_intencoes.pkl', 'rb') as f:
self.classificador = pickle.load(f)
def gerar_embedding(self, texto):
inputs = self.tokenizer(texto, return_tensors="pt", padding=True,
truncation=True, max_length=128)
with torch.no_grad():
outputs = self.bert(**inputs)
embedding = outputs.last_hidden_state.mean(dim=1).numpy()
return embedding
def classificar(self, mensagem):
embedding = self.gerar_embedding(mensagem)
predicao = self.classificador.predict(embedding)[0]
probabilidades = self.classificador.predict_proba(embedding)[0]
return {
'intencao': predicao,
'confianca': float(probabilidades.max()),
'intencao_legivel': self.get_readable_name(predicao)
}
def get_readable_name(self, categoria):
mapping = {
"duvida_produto": "Dúvida sobre Produto",
"solicitacao_informacao": "Solicitação de Informação",
"reacao_emocional": "Reação Emocional",
"interesse_produto": "Interesse em Produto",
"agradecimento": "Agradecimento",
"rastreamento_pedido": "Rastreamento de Pedido",
"saudacao": "Saudação",
"solicitacao_contato": "Solicitação de Contato",
"mensagem_sistema": "Mensagem do Sistema",
"troca_devolucao": "Troca/Devolução",
"problema_tecnico": "Problema Técnico",
"nao_identificado": "Não Identificado",
"reposicao_estoque": "Reposição de Estoque",
"confirmacao": "Confirmação",
"parceria_comercial": "Parceria Comercial",
"evento_presencial": "Evento Presencial"
}
return mapping.get(categoria, categoria)
# Exemplo de uso
classificador = ClassificadorIntencoes()
resultado = classificador.classificar("Muito obrigada pela ajuda!")
print(f"Intenção: {resultado['intencao_legivel']}")
print(f"Confiança: {resultado['confianca']:.3f}")
Exemplo Rápido
mensagens_teste = [
"Bom dia, como posso ser ajudado?",
"Onde está meu pedido?",
"Muito obrigada!",
"Quero trocar este produto"
]
for msg in mensagens_teste:
resultado = classificador.classificar(msg)
print(f"'{msg}' → {resultado['intencao_legivel']} ({resultado['confianca']:.3f})")
Arquitetura do Sistema
[Mensagem] → [BERT Embeddings] → [Random Forest] → [Classificação + Confiança]
Componentes:
- Tokenização: BERT tokenizer português
- Embeddings: Média dos hidden states do BERT
- Classificação: Random Forest com 200 árvores
- Balanceamento:
class_weight='balanced'para classes desbalanceadas
Dataset
- Fonte: Mensagens reais de atendimento ao cliente
- Tamanho: 1.440+ exemplos
- Idioma: Português brasileiro
- Média: 8.4 palavras por mensagem
- Divisão: 80% treino, 20% teste
Performance por Categoria
Melhores Performances (F1 > 0.80):
- Saudação: 0.90
- Agradecimento: 0.83
- Parceria Comercial: 0.83
Performance Moderada (F1: 0.50-0.80):
- Reação Emocional: 0.84
- Problema Técnico: 0.80
- Dúvida sobre Produto: 0.67
Desafios:
- Categorias com poucos exemplos (<20)
- Sobreposição semântica entre algumas classes
- Mensagens muito curtas (ambiguidade)
Requisitos
- Python 3.8+
- PyTorch 1.9+
- Transformers 4.20+
- Scikit-learn 1.0+
- NumPy 1.21+
Limitações
- Desbalanceamento: Algumas categorias têm poucos exemplos
- Contexto: Funciona melhor com mensagens de 5+ palavras
- Domínio: Treinado especificamente para atendimento ao cliente
- Língua: Otimizado para português brasileiro
Casos de Uso
- Chatbots: Roteamento automático de mensagens
- CRM: Categorização de tickets de suporte
- Analytics: Análise de sentimentos e intenções
- Automação: Respostas automáticas baseadas em intenção
Citação
@misc{nsync_classificador_intencoes,
title={Classificador de Intenções para Atendimento ao Cliente},
author={NSYNC Team},
year={2024},
publisher={Hugging Face},
url={https://huggingface.co/itman-inteli/nsync-sprint2-classificador-intencoes}
}
Licença
MIT License - Uso livre para projetos comerciais e acadêmicos.
- Downloads last month
- 3