Phase 05: NLP: Foundations to Advanced

Modelagem de tópicos LDA e BERTopic

LDA: documentos são misturas de tópicos, tópicos são distribuições sobre palavras. BERTopic: documentos em aglomeração em espaço de inserção, aglomerações são tópicos.

Type: Learn

Languages: Python

Prerequisites: Phase 5 · 02 (BoW + TF-IDF), Phase 5 · 03 (Word2Vec)

Time: ~45 minutes

O problema

Você tem 10.000 ingressos de suporte ao cliente, 50.000 artigos de notícias ou 200.000 tweets. Você precisa saber sobre o que a coleção é sem lê-la. Você não tem categorias rotuladas. Você nem sabe quantas categorias existem.

A modelagem de tópicos responde a isso sem supervisão. Dê-lhe um corpus, retome um pequeno conjunto de tópicos coerentes e, para cada documento, uma distribuição sobre esses tópicos.

Dois famílias algorítmicas dominam. LDA (2003) trata cada documento como uma mistura de tópicos latentes e cada tópico como uma distribuição sobre palavras.

O BERTopic (2020) codifica documentos com BERT, reduz a dimensionalidade com UMAP, agrupa com HDBSCAN e extrai palavras tópicas através de TF-IDF baseado em classe. Ganha no texto curto, mídias sociais e em qualquer coisa onde a semântica semelhante importa mais do que a sobreposição de palavras. Um documento recebe um tópico, que é uma limitação para o conteúdo de formato longo.

Esta lição constrói a intuição para ambos e nomes para escolher para um determinado corpo.

O conceito

!LDA mixture model vs BERTopic clustering

LDA generative story.Cada tópico é uma distribuição sobre palavras. Cada documento é uma mistura de tópicos. Para gerar uma palavra em um documento, amostre um tópico da mistura do documento, em seguida, amostre uma palavra da distribuição desse tópico. Inferência inverte isso: dada palavras observadas, infer a distribuição do tópico por documento e a distribuição da palavra por tópico.

A saída de LDA chave:

  • doc_topic: matriz (n_docs, n_topics), cada linha é de 1 (mistura de tópicos do documento).
  • topic_word: matriz (n_topics, vocab_size), cada linha é de 1 (distribuição de palavras do tópico).

BERTopic pipeline.

  1. Cada documento é codificado com um transformador de frases (por exemplo, all-MiniLM-L6-v2(v. 384) vectores de dimensão 384.
  2. Reduzir a dimensionalidade com UMAP para ~ 5 dimensões. Embedments BERT são muito escuras para agrupamento.
  3. Cluster com HDBSCAN. Baseado na densidade, produz clusters de tamanho variável e um rótulo "outlier".
  4. Para cada cluster, calcular TF-IDF baseado em classe sobre os documentos do cluster para extrair as principais palavras.

A saída é um tópico por documento (mais um -1 outlier label). Opcionalmente, uma adesão suave através do vetor de probabilidade do HDBSCAN.

Construí-lo

Passo 1: LDA via scikit-learn

pythonfrom sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
import numpy as np


def fit_lda(documents, n_topics=5, max_features=1000):
    cv = CountVectorizer(
        max_features=max_features,
        stop_words="english",
        min_df=2,
        max_df=0.9,
    )
    X = cv.fit_transform(documents)
    lda = LatentDirichletAllocation(
        n_components=n_topics,
        random_state=42,
        max_iter=50,
        learning_method="online",
    )
    doc_topic = lda.fit_transform(X)
    feature_names = cv.get_feature_names_out()
    return lda, cv, doc_topic, feature_names


def print_top_words(lda, feature_names, n_top=10):
    for idx, topic in enumerate(lda.components_):
        top_idx = np.argsort(-topic)[:n_top]
        words = [feature_names[i] for i in top_idx]
        print(f"topic {idx}: {' '.join(words)}")

Nota: palavras de parada removidas, min_df e max_df filtros termos raros e onipresentes, CountVectorizer (não TfidfVectorizer) porque LDA espera contagens brutas.

Passo 2: BERTopic (produção)

pythonfrom bertopic import BERTopic

topic_model = BERTopic(
    embedding_model="sentence-transformers/all-MiniLM-L6-v2",
    min_topic_size=15,
    verbose=True,
)

topics, probs = topic_model.fit_transform(documents)
info = topic_model.get_topic_info()
print(info.head(20))
valid_topics = info[info["Topic"] != -1]["Topic"].tolist()
for topic_id in valid_topics[:5]:
    print(f"topic {topic_id}: {topic_model.get_topic(topic_id)[:10]}")

O filtro ligado .Topic != -1elimina o bucket de outlier do BERTopic (documentos que o HDBSCAN não pôde agrupar). min_topic_sizeO sistema de controle de dados HDBSCAN controla o tamanho mínimo do cluster; a biblioteca padrão do BERTopic é 10. Este exemplo define-o explicitamente em 15 para a escala da lição. Para corpora acima de 10.000 documentos, aumentar para 50 ou 100.

Passo 3: Avaliação

Os dois métodos produzem palavras temáticas.

  • Topic coherence (c_v).Combina NPMI (informação mútua pontual normalizada) de pares de palavras principais em contextos de janela deslizante, agrega as pontuações em vetores de tópicos e compara esses vetores através de semelhança cosínica.gensim.models.CoherenceModelcomcoherence="c_v"- Não .
  • Topic diversity.Fração de palavras únicas em todas as principais palavras de todos os tópicos.
  • Qualitative inspection.Leia as palavras principais de cada tópico.

Quando escolher qual

SituationPick
Short text (tweets, reviews, headlines)BERTopic
Long documents with topic mixturesLDA
No GPU / limited computeLDA or NMF
Need document-level multi-topic distributionsLDA
LLM integration for topic labelingBERTopic (direct support)
Resource-constrained edge deploymentLDA
Max semantic coherenceBERTopic

A maior consideração prática é o comprimento do documento. Embedings BERT truncate; LDA conta trabalho em qualquer comprimento. Para documentos mais longos do que o contexto do modelo de embebimento, seja chunk + agregado ou use LDA.

Usá-lo

A pilha de 2026:

  • BERTopic.Default para texto curto e qualquer coisa que seja semântica.
  • gensim.models.LdaModel.LDA clássico para produção, maduro, testado em batalha.
  • sklearn.decomposition.LatentDirichletAllocation.LDA fácil para experimentos.
  • NMF.Factorization de matriz não negativa, alternativa rápida à LDA, qualidade comparável em texto curto.
  • Top2Vec.Design semelhante ao BERTopic, comunidade menor, mas boa em alguns pontos de referência.
  • FASTopic.Mais novo, mais rápido do que o BERTopic em corpora muito grandes.
  • LLM-based labeling.Execute qualquer agrupamento, e depois peça a um modelo para nomear cada agrupamento.

Envia-o

Salva comooutputs/skill-topic-picker.md- Não .

markdown---
name: topic-picker
description: Pick LDA or BERTopic for a corpus. Specify library, knobs, evaluation.
version: 1.0.0
phase: 5
lesson: 15
tags: [nlp, topic-modeling]
---

Given a corpus description (document count, avg length, domain, language, compute budget), output:

1. Algorithm. LDA / NMF / BERTopic / Top2Vec / FASTopic. One-sentence reason.
2. Configuration. Number of topics: `recommended = max(5, round(sqrt(n_docs)))`, clamped to 200 for corpora under 40,000 docs; permit >200 only when the corpus is genuinely large (>40k) and note the increased compute cost. `min_df` / `max_df` filters and embedding model for neural approaches also belong here.
3. Evaluation. Topic coherence (c_v) via `gensim.models.CoherenceModel`, topic diversity, and a 20-sample human read.
4. Failure mode to probe. For LDA, "junk topics" absorbing stopwords and frequent terms. For BERTopic, the -1 outlier cluster swallowing ambiguous documents.

Refuse BERTopic on documents longer than the embedding model's context window without a chunking strategy. Refuse LDA on very short text (tweets, reviews under 10 tokens) as coherence collapses. Flag any n_topics choice below 5 as likely wrong; flag >200 on corpora under 40k docs as likely over-splitting.

Exercícios

  1. Easy.Aplique LDA com 5 tópicos no conjunto de dados de 20 Newsgroups. Imprima as 10 principais palavras por tópico. Etiquete cada tópico à mão. O algoritmo encontrou as categorias reais?
  2. Medium.Compare o número de tópicos encontrados, palavras principais e coerência qualitativa com a LDA. Qual superficia as categorias reais de forma mais limpa?
  3. Hard.Calcule a coerência c_v para tanto LDA quanto BERTopic no seu corpus. Execute cada um com 5, 10, 20, 50 tópicos. Conserva a coerência versus a contagem de tópicos. Relate qual método é mais estável em todas as contagens de tópicos.

Termos-chave

TermWhat people sayWhat it actually means
TopicA thing the corpus is aboutA probability distribution over words (LDA) or a cluster of similar documents (BERTopic).
Mixed membershipDoc is multiple topicsLDA assigns each document a distribution over all topics.
UMAPDimensionality reductionManifold learning that preserves local structure; used in BERTopic.
HDBSCANDensity clusteringFinds variable-size clusters; produces "noise" label (-1) for outliers.
c_v coherenceTopic quality metricAverage pointwise mutual information of top topic words within sliding windows.

Mais leitura

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.