Embeddings de Palavras
O que são incorporações de palavras?
Incorporações de palavras (word embeddings) são representações vetoriais densas (dense) (de baixa dimensionalidade) de palavras. Em vez de representar palavras como símbolos discretos (como IDs) ou vetores esparsos (sparse vectors) (como vetores one-hot (one-hot vectors)), as incorporações mapeiam cada palavra para um ponto em um espaço vetorial contínuo, tipicamente com 50–1000 dimensões.
A ideia central é que palavras usadas em contextos semelhantes tendem a ter significados semelhantes — um princípio clássico conhecido como a hipótese distribucional (distributional hypothesis). Na prática, isso significa que incorporações podem capturar relações como:
- Similaridade: “cat” está mais perto de “dog” do que de “car”
- Analogias (às vezes): “king − man + woman ≈ queen”
- Padrões sintáticos: singular/plural, tempos verbais, etc.
Incorporações de palavras são um tema fundamental em PLN (NLP) e um passo-chave na evolução de atributos de saco de palavras (bag-of-words) para métodos neurais. Elas são representações estáticas (static representations): cada tipo de palavra (word type) recebe um vetor, independentemente do contexto.
Por que as incorporações importam (em comparação com representações esparsas)
Representações tradicionais de texto como saco de palavras ou TF‑IDF (term frequency–inverse document frequency) representam palavras como dimensões independentes. Isso é simples e muitas vezes eficaz, mas tem desvantagens:
- Alta dimensionalidade: o tamanho do vocabulário (vocabulary) pode ser 50k–1M+
- Esparsidade: a maioria das entradas é zero
- Nenhuma noção de similaridade: “good” e “great” são atributos não relacionados
As incorporações resolvem isso ao fornecer:
- Compacidade: vetores de 300 dimensões são comuns
- Generalização: palavras semelhantes compartilham vetores próximos
- Compatibilidade com modelos neurais: incorporações alimentam naturalmente Redes Neurais (Neural Networks)
Intuição: aprender a partir do contexto
A maioria das incorporações clássicas de palavras é treinada explorando padrões de coocorrência (co-occurrence) de palavras dentro de uma janela de contexto (context window).
Por exemplo, em:
“The quick brown fox jumps over the lazy dog”
Com um tamanho de janela (window size) de 2, a palavra “fox” aparece com palavras de contexto: {quick, brown, jumps, over}. Se “fox” e “wolf” aparecem em contextos semelhantes ao longo de um grande corpus, seus vetores se tornarão semelhantes.
Por baixo dos panos, muitos métodos treinam incorporações para que sejam boas em prever:
- uma palavra a partir do seu contexto (CBOW), ou
- palavras de contexto a partir de uma palavra (Skip-gram)
Essas ideias se conectam de perto a Modelos de Linguagem (Language Models), mas incorporações clássicas geralmente são mais simples e não totalmente contextualizadas.
Métodos clássicos
word2vec (CBOW e Skip-gram)
word2vec (Mikolov et al., 2013) popularizou o treinamento eficiente de incorporações neurais. Ele vem em duas variantes principais:
CBOW (Continuous Bag of Words)
Prever a palavra central a partir das palavras de contexto ao redor.
- Entrada: média (ou soma) dos vetores das palavras de contexto
- Saída: palavra-alvo prevista
- Mais rápido e frequentemente bom para palavras frequentes
Skip-gram
Prever palavras de contexto ao redor a partir da palavra central.
- Entrada: vetor da palavra central
- Saída: palavra(s) de contexto prevista(s)
- Frequentemente melhor para palavras raras (mais sinal de aprendizado por palavra)
Treinamento eficiente: amostragem negativa e softmax hierárquico
Uma implementação ingênua usaria uma função softmax (softmax) sobre todo o vocabulário, o que é caro para vocabulários grandes.
O word2vec comumente usa:
- Amostragem negativa (negative sampling): aprender a distinguir pares verdadeiros (palavra, contexto) de pares aleatórios de “ruído”.
- Softmax hierárquico (hierarchical softmax): usar uma fatoração baseada em árvore para reduzir computação.
A amostragem negativa é especialmente comum na prática. Conceitualmente, cada passo de treinamento diz:
- “Este par de contexto deve ter alta similaridade”
- “Estes pares amostrados aleatoriamente devem ter baixa similaridade”
Um objetivo simplificado de amostragem negativa para um par positivo ((w, c)) é:
[ \log \sigma(\mathbf{v}_w^\top \mathbf{u}c) + \sum{i=1}^k \log \sigma(-\mathbf{v}w^\top \mathbf{u}{n_i}) ]
onde:
- (\mathbf{v}_w) é a incorporação “de entrada” da palavra (w)
- (\mathbf{u}_c) é a incorporação “de saída” do contexto (c)
- (n_i) são amostras negativas
- (\sigma) é a sigmoide (sigmoid)
Detalhe prático: o word2vec mantém duas matrizes de incorporação (entrada e saída). Muitas implementações retornam os vetores de entrada como “as incorporações”.
Truques importantes de treinamento
- Subamostragem (subsampling) de palavras frequentes (ex.: “the”, “of”) para reduzir sua dominância
- Tamanho da janela controla foco semântico vs. sintático (janelas menores capturam mais sintaxe)
- Dimensão do vetor (vector dimension) equilibra velocidade vs. capacidade
GloVe (Global Vectors)
GloVe (Pennington et al., 2014) se baseia em contagens globais de coocorrência em vez de predição local.
- Construir uma matriz de coocorrência palavra-palavra (X), onde (X_{ij}) conta quantas vezes a palavra (j) aparece perto da palavra (i).
- Aprender vetores de forma que produtos escalares (dot products) aproximem o log da coocorrência:
[ \mathbf{w}_i^\top \mathbf{\tilde{w}}_j + b_i + \tilde{b}j \approx \log X{ij} ]
Ele usa um objetivo de mínimos quadrados ponderados (weighted least squares) de modo que:
- coocorrências muito raras não dominem,
- coocorrências extremamente frequentes não sobrecarreguem o treinamento.
Quando se destaca: o GloVe frequentemente tem bom desempenho quando você consegue aproveitar grandes corpora e quer incorporações fundamentadas em estatísticas globais.
fastText (incorporações sensíveis a subpalavras)
fastText (Bojanowski et al., 2017) estende o Skip-gram ao representar uma palavra como um saco de n-gramas de caracteres (character n-grams).
Por exemplo, “where” com n-gramas de 3–5 caracteres pode incluir:
<wh,whe,her,ere,re>, etc. (o esquema exato varia)
O vetor da palavra é calculado como a soma de seus vetores de n-gramas de subpalavra.
Benefícios:
- Lida melhor com palavras fora do vocabulário (OOV, out-of-vocabulary) (ex.: erros de digitação, formas raras)
- Ajuda idiomas morfologicamente ricos (ex.: finlandês, turco)
- Aprende relações entre formas relacionadas (“run”, “running”, “runner”)
Isso se conecta conceitualmente à Tokenização em Subpalavras (Subword Tokenization), embora o fastText ainda seja um modelo de incorporação estática.
Como as incorporações são treinadas na prática
Requisitos de dados
- Grandes corpora de texto melhoram a qualidade significativamente.
- O domínio importa: texto médico produz semântica diferente de notícias.
Hiperparâmetros típicos
- Dimensão: 100–300 é comum; 300 é um padrão popular para vetores pré-treinados (pretrained vectors)
- Tamanho da janela: 2–10 é típico (menor: sintaxe; maior: semântica/tópico)
- Contagem mínima (min count): ignorar palavras extremamente raras para reduzir ruído
- Amostras negativas: frequentemente 5–20
- Épocas (epochs): 3–10 para corpora grandes; mais para corpora menores
Pré-treinadas vs. treinar as suas
Você pode:
- Usar incorporações pré-treinadas (pretrained embeddings) (treinadas em Wikipedia/Common Crawl/etc.)
- Treinar no seu corpus de domínio (frequentemente melhor para vocabulário especializado)
- Fazer ajuste fino (fine-tune) das incorporações como parte de um modelo de etapa posterior (downstream model) (comum em PLN neural)
Em pipelines modernos de transformadores (transformers), incorporações estáticas de palavras são menos centrais, mas ainda úteis em cenários leves ou restritos por domínio.
Exemplos práticos
Exemplo 1: similaridade de palavras com distância do cosseno (cosine distance)
Uma forma comum de comparar vetores de palavras é a similaridade do cosseno (cosine similarity) (veja Similaridade do Cosseno (Cosine Similarity)):
[ \cos(\theta) = \frac{\mathbf{a}\cdot \mathbf{b}}{|\mathbf{a}||\mathbf{b}|} ]
import numpy as np
def cosine_similarity(a, b):
return (a @ b) / (np.linalg.norm(a) * np.linalg.norm(b))
# Example vectors (toy)
king = np.array([0.2, 0.7, -0.1])
queen = np.array([0.1, 0.75, -0.05])
print(cosine_similarity(king, queen))
Exemplo 2: aritmética vetorial no estilo de analogias (analogy-style vector arithmetic)
Uma demonstração famosa é:
[ \mathbf{v}(\text{king}) - \mathbf{v}(\text{man}) + \mathbf{v}(\text{woman}) \approx \mathbf{v}(\text{queen}) ]
Na prática, você calcula o vetor resultante e busca os vizinhos mais próximos por similaridade do cosseno.
Esses efeitos não são garantidos e variam conforme o corpus, os hiperparâmetros e o método de avaliação — mas ilustram como incorporações podem codificar regularidades lineares.
Exemplo 3: treinando word2vec rapidamente com Gensim
from gensim.models import Word2Vec
sentences = [
["the", "cat", "sat", "on", "the", "mat"],
["the", "dog", "sat", "on", "the", "rug"],
["cats", "and", "dogs", "are", "animals"],
]
model = Word2Vec(
sentences=sentences,
vector_size=100,
window=5,
min_count=1,
sg=1, # 1 = skip-gram, 0 = CBOW
negative=10,
epochs=50
)
print(model.wv.most_similar("cat", topn=3))
Observação: este corpus de brinquedo é pequeno demais para produzir incorporações significativas; é apenas um exemplo de uso.
Como as incorporações de palavras são usadas
Representações de atributos para modelos de etapa posterior
Incorporações estáticas podem ser usadas como:
- Entradas para classificadores CNN/RNN (redes neurais convolucionais/recorrentes; Convolutional/Recurrent Neural Networks) (mais antigos, mas ainda viáveis em cenários restritos)
- Atributos fixos para modelos lineares pela média de vetores de palavras (linha de base de “incorporação de sentença (sentence embedding)”)
- Inicialização para uma camada de incorporação (embedding layer) que recebe ajuste fino durante o treinamento supervisionado
Isso se conecta a Redes Neurais e Retropropagação (Backpropagation): incorporações são parâmetros que podem ser atualizados como quaisquer outros pesos.
Recuperação de informação e busca semântica (leve)
Incorporações dão suporte a:
- Expansão de consulta (encontrar termos semelhantes)
- Similaridade de documentos via média de incorporações
- Agrupamento (clustering) e exploração de tópicos
No entanto, a busca moderna frequentemente prefere incorporações de sentença/documento ou recuperadores baseados em transformadores; vetores de palavras estáticos ainda podem ser uma linha de base rápida.
Recursos lexicais e análise
Incorporações podem ajudar a:
- Descobrir sinônimos e termos relacionados
- Construir vocabulários de domínio
- Detectar mudanças de significado entre corpora (incorporações diacrônicas (diachronic embeddings))
Alinhamento cruzado de línguas (importância histórica)
Ao aprender um mapeamento entre espaços de incorporação, é possível alinhar línguas (útil para léxicos bilíngues). Modelos multilíngues de transformadores reduziram a dependência dessa abordagem, mas ela permanece conceitualmente importante.
Avaliando incorporações de palavras
A avaliação é difícil porque “boas incorporações” dependem da tarefa final.
Avaliação intrínseca (intrinsic evaluation) (rápida, mas limitada)
Conjuntos de dados de similaridade de palavras
- Correlacionar similaridade do cosseno com julgamentos humanos (ex.: “car” vs “automobile”)
- Limitações: humanos discordam; conjuntos são pequenos; contexto importa
Tarefas de analogia de palavras
- “man:king :: woman:queen”
- Funciona melhor para certas relações e pode ser frágil
Inspeção de vizinhança
- Checagem qualitativa de sanidade: vizinhos mais próximos para palavras-chave
- Útil para depurar problemas de domínio e viés
Avaliações intrínsecas são convenientes, mas não predizem de forma confiável o desempenho em tarefas posteriores.
Avaliação extrínseca (extrinsic evaluation) (preferida)
Use incorporações em uma tarefa real e meça o impacto, por exemplo:
- Acurácia em classificação de texto
- F1 em reconhecimento de entidades nomeadas (named entity recognition)
- Métricas de recuperação (retrieval metrics) (MRR, Recall@k)
Isso se conecta a Avaliação de Modelos (Model Evaluation): métricas orientadas à tarefa geralmente são mais significativas.
Limitações das incorporações clássicas de palavras
Um vetor por palavra (sem contexto)
Incorporações estáticas misturam sentidos:
- “bank” (river bank) vs “bank” (financial institution)
O modelo aprende um único vetor de compromisso, frequentemente dominado pelo sentido mais frequente.
OOV e palavras raras
word2vec/GloVe têm dificuldade quando uma palavra não foi vista no treinamento ou aparece raramente. O fastText ajuda via n-gramas de subpalavras, mas não resolve completamente a ambiguidade semântica.
Viés e estereótipos sociais
Incorporações treinadas em grandes corpora frequentemente codificam vieses societais (ex.: associações de gênero ou raça). Isso é uma grande preocupação em sistemas reais. Veja Viés em Aprendizado de Máquina (machine learning).
Mitigações incluem:
- Curadoria dos dados de treinamento
- Métodos de “desenviesamento (debiasing)” por pós-processamento (com ressalvas)
- Uso de avaliações e monitoramento com foco em equidade
Incompatibilidade de domínio
Incorporações treinadas em notícias podem ter desempenho ruim em medicina, direito ou jargão interno de empresas. Treinar ou adaptar incorporações em texto do próprio domínio frequentemente ajuda.
Composicionalidade limitada
Fazer a média de vetores de palavras é um modelo fraco de significado para frases/sentenças:
- “not good” não fica perto de “good”
- a ordem das palavras é em grande parte ignorada
Essa limitação ajudou a motivar modelos contextuais e de sequência.
Incorporações de palavras vs incorporações contextuais (transformadores)
Modelos modernos de transformadores (por exemplo, do tipo BERT (BERT-like)) produzem incorporações contextuais (contextual embeddings), em que a representação de um token depende do texto ao seu redor.
- Estático:
embedding("bank")é fixo - Contextual:
embedding("bank", context)muda com base no contexto
Incorporações contextuais surgem de arquiteturas que usam Mecanismo de Atenção (Attention Mechanism) na Arquitetura Transformer (Transformer Architecture).
Principais diferenças
- Sensibilidade ao contexto: incorporações contextuais lidam naturalmente com polissemia (polysemy)
- Granularidade: transformadores frequentemente usam unidades de subpalavra (subword units) (veja Tokenização e Tokenização em Subpalavras)
- Desempenho: incorporações contextuais tipicamente dominam benchmarks modernos de PLN
- Computação: incorporações estáticas são leves; transformadores são mais pesados no treino e na inferência
Quando incorporações clássicas ainda fazem sentido
Incorporações estáticas ainda podem ser uma boa escolha quando você precisa de:
- Inferência muito rápida em CPU/dispositivos de borda
- Modelos pequenos com memória limitada
- Linhas de base simples ou espaços de similaridade interpretáveis
- Vocabulário específico de domínio com poucos dados rotulados (treinar incorporações em texto não rotulado e, depois, usá-las em um classificador menor)
Em muitos pipelines de produção, uma abordagem híbrida também é comum: usar transformadores para tarefas de alta acurácia e incorporações estáticas para heurísticas rápidas, indexação ou componentes leves.
Orientação prática e boas práticas
Escolhendo um método
- word2vec: linha de base geral forte, eficiente, bom com contexto local
- GloVe: forte ao aproveitar estatísticas globais de coocorrência
- fastText: melhor se palavras OOV/raras e morfologia importam
Armadilhas comuns
- Treinar com pouco texto (incorporações precisam de escala)
- Superinterpretar resultados de analogias
- Ignorar viés e incompatibilidade de domínio
- Usar métricas intrínsecas como único critério
Dicas para usar incorporações pré-treinadas
- Verifique se a tokenização corresponde ao seu pipeline (caixa alta/baixa, pontuação, acentos)
- Considere colocar tudo em minúsculas vs. preservar maiúsculas/minúsculas (depende da tarefa)
- Para texto de domínio, considere treinamento contínuo (se suportado) ou treinar novas incorporações
Resumo
Incorporações de palavras mapeiam palavras para vetores densos que capturam similaridade baseada no uso. Métodos clássicos — word2vec, GloVe e fastText — aprendem essas representações de forma eficiente a partir de grandes corpora não rotulados, viabilizando similaridade semântica, agrupamento e inicialização útil para modelos de PLN em tarefas posteriores.
Sua principal fraqueza é serem estáticas: um vetor por palavra não consegue representar significado dependente de contexto. Sistemas modernos baseados em transformadores produzem incorporações contextuais que, em grande parte, superam vetores estáticos em tarefas complexas de compreensão de linguagem, porém com maior custo computacional. Ainda assim, incorporações clássicas continuam valiosas para sistemas leves, exploração de domínio e como linhas de base fortes e simples dentro do conjunto mais amplo de ferramentas de representação de texto.