PLN na prática: do texto ao sentimento

Um computador não lê palavras, lê números. O Processamento de Linguagem Natural (PLN) é o caminho que transforma um comentário como "a espera foi longa e cansativa" em algo que um modelo consegue usar. Siga as etapas com comentários fictícios de pacientes, mude as escolhas e veja o efeito até a última etapa.

→ → → → → →

1Pré-processamento: limpar, separar, reduzir

Escreva ou edite o comentário e ligue ou desligue cada etapa. As escolhas feitas aqui valem também para as seções seguintes: o bag of words, o treino e o analisador de sentimento usam o mesmo pré-processamento.

Reduzir as palavras
Tokenização (só nesta demonstração)

Stemização × lematização, palavra por palavra

Passe o cursor sobre um radical para ver as regras aplicadas.

Qual a diferença?

Stemização corta sufixos por regras, sem consultar dicionário. É rápida e agressiva: "atendimento", "atendido" e "atender" viram "atend", que não é uma palavra de verdade. Aqui usamos uma versão simplificada do RSLP, o stemmer para português disponível no NLTK.

Lematização procura a forma de dicionário: "estavam" vira "estar", "cansativa" vira "cansativo". O resultado é legível, mas exige um léxico e, idealmente, saber a classe gramatical. "foi" pode ser do verbo ser ou do verbo ir, e só o contexto decide. Na prática, usam-se ferramentas como o spaCy.

2Bag of words: o texto vira uma tabela de contagens

Cada palavra do vocabulário vira uma coluna, e cada documento, uma linha que conta quantas vezes cada palavra aparece. A ordem se perde: fica só o "saco" de palavras. O TF-IDF reduz o peso das palavras que aparecem em quase todos os documentos, e os bigramas recuperam um pouco da ordem, juntando pares vizinhos.

Clique numa célula para ver de onde vem o número.

Semelhança entre os documentos (cosseno)

1 = mesmo conjunto de palavras nas mesmas proporções; 0 = nenhuma palavra em comum.

O que a tabela mostra

3Treinamento: o modelo aprende um peso para cada palavra

Temos 50 comentários rotulados: 40 para treinar e 10 guardados para teste, que o modelo nunca vê durante o treino. O modelo é uma regressão logística sobre o bag of words (presença ou ausência de cada termo). Cada termo ganha um peso: positivo puxa para "elogio", negativo para "reclamação". A cada época, o gradiente ajusta todos os pesos um pouco.

perda no treinoperda no teste

Os pesos aprendidos

Os 10 comentários de teste

Ensine o modelo

Escreva um comentário, diga se é elogio ou reclamação e acrescente ao treino. O modelo é treinado de novo, com o mesmo número de épocas.

Ver os comentários de treino

    4Aplicação: análise de sentimento

    O modelo treinado na seção 3 lê um comentário novo: pré-processa, monta o vetor, soma o peso de cada termo presente e passa a soma pela curva sigmoide. Palavras que ele nunca viu no treino não contribuem com nada.

    –

    Azul puxa para elogio; ameixa, para reclamação; cinza, termo que o modelo não conhece.

    Como a decisão foi somada

    Para experimentar em aula

    1. Na seção 1, compare stemização e lematização em "estavam", "foi" e "atendimento". Qual resultado é mais legível? Qual agrupa mais variações?
    2. Desmarque "Manter negações". Veja "não" sumir e, na seção 4, analise "Não recomendo". O que acontece com a previsão?
    3. Na seção 2, embaralhe o documento 1. A linha da tabela não muda: para o bag of words, a ordem não existe.
    4. Ligue os bigramas e procure, na tabela, o par que junta "não" e "ótimo". É um jeito simples de recuperar parte do contexto.
    5. Na seção 3, treine 1 época por vez e acompanhe os pesos. Depois, +100. A perda no teste cai tanto quanto a do treino?
    6. Treine 100 épocas com e sem stemização e compare a perda no teste (a acurácia, com só 10 frases, varia pouco). Com poucos dados, agrupar variações ajuda: "atendido" e "atendimento" passam a compartilhar o mesmo peso.
    7. Na seção 4, teste o sarcasmo "Ótimo, esperei cinco horas na fila". Por que um bag of words erra aqui? Que tipo de modelo poderia acertar?