Pesquisa de sites

Introdução à Modelação de Tópicos em PLN


A modelação de tópicos é uma técnica em Processamento de Linguagem Natural (PLN) que nos ajuda a descobrir automaticamente temas ou tópicos ocultos dentro de uma grande coleção de documentos de texto. Em vez de ler manualmente milhares ou mesmo milhões de documentos, a modelação de tópicos permite que os computadores analisem o texto e identifiquem padrões ocultos na forma como as palavras aparecem em conjunto. Estes padrões são então agrupados em tópicos, onde cada tópico representa um tema comum discutido em múltiplos documentos.

A ideia principal por trás da modelagem de tópicos é que os documentos geralmente tratam de mais de um assunto, e as palavras tendem a repetir-se de maneiras significativas dependendo do tema em discussão. Por exemplo, documentos sobre desporto podem frequentemente incluir palavras como “jogo”, “equipa” e “pontuação”, enquanto documentos sobre finanças podem incluir palavras como “investimento”, “mercado” e “lucro”. A modelagem de tópicos captura esses padrões de coocorrência de palavras e usa-os para descobrir tópicos latentes (ocultos).

A modelação de tópicos é amplamente utilizada em áreas como clustering de documentos, recomendação de conteúdos, motores de busca, análise de feedback de clientes, análise de artigos científicos e monitorização de redes sociais. É considerada uma técnica de aprendizagem não supervisionada porque não requer dados etiquetados. O modelo aprende os tópicos diretamente a partir do texto bruto.

Principais Conclusões

  • A modelagem de tópicos é o estudo dos padrões de co-ocorrência de palavras em documentos para revelar estruturas temáticas subjacentes que não estão explicitamente etiquetadas ou definidas. Isto torna-a especialmente útil para explorar grandes corpora não estruturados, como artigos de notícias, artigos científicos, avaliações de clientes ou dados de redes sociais.
  • Ao contrário dos modelos de classificação, a modelagem de tópicos não depende de conjuntos de dados pré-anotados/marcados. Em vez disso, aprende diretamente a partir do texto cru, tornando-se uma escolha prática quando os dados etiquetados são insuficientes, caros de criar ou indisponíveis.
  • A modelagem de tópicos reflete o texto do mundo real de forma mais precisa, ao permitir que cada documento seja representado como uma mistura de tópicos em vez de o forçar a uma única categoria. Por exemplo, um artigo pode abordar tanto "aprendizagem automática" como "saúde", com diferentes proporções atribuídas a cada tópico.
  • Cada tópico é definido por um conjunto de palavras relacionadas, onde a cada palavra é atribuída uma probabilidade que indica a sua importância dentro desse tópico. Esta representação probabilística ajuda a interpretar os tópicos e a compreender quais termos contribuem mais fortemente para um determinado tema.
  • O LDA modela documentos como misturas de tópicos e tópicos como misturas de palavras, utilizando uma estrutura probabilística bem definida. A sua capacidade de interpretação, fundamentação matemática e amplo suporte em bibliotecas tornaram-no o padrão de referência para tarefas de modelação de tópicos na investigação e na indústria.

Por que a Modelagem de Tópicos é Necessária

As aplicações modernas geram grandes quantidades de dados textuais não estruturados, como emails, opiniões, artigos, registos de chat e artigos de investigação. Organizar e compreender manualmente estes dados é impraticável. A modelagem de tópicos ajuda a estruturar este texto desorganizado ao identificar temas que surgem repetidamente em documentos.

Outra razão importante pela qual a modelação de tópicos é útil é que a pesquisa tradicional por palavras-chave é muitas vezes limitada. Dois documentos podem abordar a mesma ideia usando palavras diferentes, e os métodos baseados em palavras-chave podem falhar em os conectar. A modelação de tópicos vai além da correspondência exata de palavras e foca-se em padrões semânticos, tornando-se mais eficaz para compreender texto em grande escala.

Conceitos Básicos por Trás da Modelação de Tópicos

Para compreender a modelagem de tópicos, é importante entender como o texto é representado matematicamente. Os dados de texto são primeiro convertidos em forma numérica, geralmente usando uma representação de bolsa de palavras. Nesta representação, um documento é tratado como uma coleção de palavras onde a ordem das palavras é ignorada, mas a frequência das palavras é mantida.

Cada documento é representado como um vetor de contagem de palavras. Numa coleção de documentos, isto forma uma matriz termo-documento, onde as linhas representam os documentos e as colunas representam as palavras. Os algoritmos de modelação de tópicos analisam esta matriz para encontrar grupos de palavras que aparecem frequentemente em conjunto.

Um tópico na modelação de tópicos não é um único rótulo, mas uma distribuição de probabilidades sobre palavras. De forma semelhante, cada documento é representado como uma distribuição de probabilidades sobre tópicos. Isto significa que um documento pode abordar múltiplos tópicos com proporções diferentes.

Alocação Latente de Dirichlet (LDA)

A Latent Dirichlet Allocation, comumente conhecida como LDA, é o algoritmo de modelagem de tópicos mais popular. A LDA é um modelo generativo probabilístico que assume que os documentos são criados através de um processo oculto envolvendo tópicos.

O LDA assume que cada documento possui uma mistura de tópicos e que cada tópico possui uma mistura de palavras. Ao gerar um documento, o modelo primeiro escolhe um tópico com base na distribuição de tópicos do documento e, em seguida, escolhe uma palavra com base na distribuição de palavras do tópico. Este processo repete-se para cada palavra no documento.

A parte “latente” do LDA refere-se ao facto de que os tópicos estão ocultos e não são observados diretamente. O modelo tenta inferir esses tópicos ocultos a partir das palavras observadas. A parte “Dirichlet” refere-se à distribuição de Dirichlet, que é usada como um pré-requisito para controlar como os tópicos são distribuídos pelos documentos e como as palavras são distribuídas pelos tópicos.

Configurar um pequeno corpus

Suponha um vocabulário muito pequeno de quatro palavras:

w₁="ai " w₂="dados " w₃="pizza " w₄="massa "

Agora, suponhamos que tenhamos três documentos:

Documento 1: “ai data ai” Documento 2: “ai data data” Documento 3: “pizza pasta pizza”

Convertimos este corpus numa matriz documento–termo X utilizando contagens brutas de palavras.

Cada linha é um documento, cada coluna é uma palavra, e cada entrada indica quantas vezes essa palavra aparece nesse documento.

Escolher o número de tópicos

Assuma K=2 tópicos.

O Tópico 1 corresponde aproximadamente a "tecnologia". O Tópico 2 corresponde aproximadamente a "alimentação".

O LDA não sabe isto de antemão. Estamos a assumir isto aqui apenas para ilustrar as matrizes aprendidas.

Matriz tópico–palavra Φ (K × V)

Φ contém as probabilidades de palavras para cada tópico. Cada linha soma 1.

Interpretação:

Para o Tópico 1 (tecnologia): P(ai)=0,45, P(data)=0,45, P(pizza)=0,05, P(pasta)=0,05

Para o Tópico 2 (comida): P(ai)=0,05, P(dados)=0,05, P(pizza)=0,45, P(massa)=0,45

Esta matriz responde à pergunta: dado um tema, quão provável é cada palavra?

Matriz documento-tópico Θ (D × K)

Θ contém as proporções de tópicos para cada documento. Cada linha soma 1.

Interpretação:

O Documento 1 é 90% assunto 1 e 10% assunto 2. O Documento 2 é 85% assunto 1 e 15% assunto 2. O Documento 3 é 10% assunto 1 e 90% assunto 2.

Esta matriz responde à pergunta: dado um documento, quanto contribui cada tópico?

Multiplicação de matrizes: reconstruindo o corpus

O LDA assume que a distribuição esperada de palavras por documento provém de:

Vamos calcular isto explicitamente.

Multiplicação linha a linha

Para o Documento 1:

=[0,9(0,45)+0,1(0,05), 0,9(0,45)+0,1(0,05), 0,9(0,05)+0,1(0,45), 0,9(0,05)+0,1(0,45)] =[0,41, 0,41, 0,09, 0,09]= [0,41, 0,41, 0,09, 0,09]=[0,41, 0,41, 0,09, 0,09]

Isto significa que o documento 1 deverá favorecer fortemente “ai” e “data”.

Para o Documento 2:

Novamente, um forte sinal de tecnologia com um pequeno componente alimentar.

Para o Documento 3:

Claramente dominado por palavras relacionadas com comida.

Matriz final reconstruída

Esta matriz é uma aproximação probabilística da matriz de contagem original X. O LDA está, efetivamente, a realizar uma fatorização de matriz com restrições, onde todas as entradas são não negativas, e as linhas de Θ e Φ são distribuições de probabilidade.

Durante o treino, o LDA não calcula diretamente Θ × Φ de uma só vez. Em vez disso, atualiza repetidamente as atribuições de tópicos para ocorrências individuais de palavras, de modo que o Θ e o Φ implícitos tornem X provável sob o modelo generativo. A inferência variacional atualiza Θ e Φ diretamente através da otimização.

Ambos os métodos têm como objetivo encontrar Θ e Φ de forma que ΘΦ explique bem X.

Demonstração de Python com matrizes impressas

Aqui está um exemplo em Python que imprime explicitamente Θ e Φ para que possa inspecioná-los.

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

docs = [
    "ai data ai",
    "ai data data",
    "pizza pasta pizza"
]

vectorizer = CountVectorizer()
X = vectorizer.fit_transform(docs)

lda = LatentDirichletAllocation(
    n_components=2,
    random_state=0,
    max_iter=50
)

lda.fit(X)

# Document-topic matrix Θ
Theta = lda.transform(X)

# Topic-word matrix Φ (normalize rows)
Phi = lda.components_ / lda.components_.sum(axis=1)[:, None]

print("Vocabulary:", vectorizer.get_feature_names_out())
print("\nDocument-Term Matrix X:")
print(X.toarray())

print("\nDocument-Topic Matrix Θ:")
print(Theta)

print("\nTopic-Word Matrix Φ:")
print(Phi)

print("\nReconstructed X (Θ × Φ):")
print(np.dot(Theta, Phi))

Verá que Θ × Φ corresponde de perto à estrutura de X, mesmo que os valores sejam probabilidades em vez de contagens brutas.

Análise Semântica Latente Probabilística (PLSA)

A Análise Semântica Latente Probabilística (PLSA) expande a ideia de estrutura semântica latente ao introduzir um modelo de variável latente probabilística explícito sobre documentos e palavras. Dado um documento ddd e uma palavra w, a PLSA assume que a sua coocorrência é gerada através de uma variável de tópico latente z. A probabilidade conjunta é definida como:

que também pode ser escrito na forma condicional como:

Aqui, P(w∣z) representa a distribuição de palavras por tópico e P(z∣d) representa quão fortemente um tópico contribui para um documento. Os parâmetros do modelo são aprendidos ao maximizar a verossimilhança logarítmica das contagens observadas de palavras por documento n(d,w):

Como a variável de tópico z não é observada, o PLSA utiliza o algoritmo de Expectativa-Maximização (EM). No passo E, as atribuições de tópicos posteriores são calculadas da seguinte forma:

Na etapa M, as distribuições tópico–palavra e documento–tópico são atualizadas usando estes pós-erros, por exemplo:

A PLSA também pode ser vista como uma factorização matricial probabilística da matriz de distribuição documento–palavra P(d,w) em factores de menor dimensão correspondentes a tópicos, semelhante em espírito à LSA, mas baseada na maximização da verosimilhança em vez de SVD.

Modelo de Tópicos Simples com BERT

Modelos de tópicos tradicionais como o LDA baseiam-se em contagens de palavras e pressupostos probabilísticos. A modelagem de tópicos baseada no BERT funciona de forma muito diferente.

Em vez de modelar documentos como conjuntos de palavras, usamos primeiro um modelo BERT pré-treinado para converter cada documento num vetor semântico denso (embedding). Documentos com significados semelhantes acabam por ficar próximos uns dos outros no espaço vetorial. Depois de termos estes embeddings, agrupamo-los para encontrar grupos de documentos semanticamente semelhantes. Por fim, extraímos palavras representativas de cada grupo para descrever o tema.

O BERTopic combina quatro ideias:

Embeddings BERT para captar semântica UMAP para reduzir a dimensionalidade HDBSCAN para agrupar documentos TF-IDF baseado em classes (c-TF-IDF) para extrair palavras-chave dos tópicos

Instalando bibliotecas necessárias

Certifica-te de que tens isto instalado primeiro.

pip install bertopic sentence-transformers scikit-learn datasets umap-learn hdbscan

Conjunto de Dados: 20 Novas Notícias (texto do mundo real)

Vamos utilizar um subconjunto do conjunto de dados 20 Newsgroups, que é comumente usado para modelagem de tópicos e classificação de textos.

from bertopic import BERTopic
from sentence_transformers import SentenceTransformer
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd

Passo 1: Carregar um conjunto de dados real

docs = fetch_20newsgroups(
    subset="train",
    remove=("headers", "footers", "quotes")
).data
docs[0]

Neste ponto, docs é uma lista de documentos de texto cru. Cada documento pode tratar de tecnologia, desporto, religião, política ou ciência.

Estava a perguntar-me se alguém por aí poderia esclarecer-me sobre este carro que vi outro dia. Era um carro desportivo de 2 portas, parecia ser do final dos anos 60/quase 70. Chamava-se Bricklin. As portas eram muito pequenas. Além disso, o para-choques dianteiro estava separado do resto da carroçaria. Isto é tudo o que sei. Se alguém puder dizer-me o nome do modelo, especificações do motor, anos de produção, onde este carro foi fabricado, história ou qualquer outra informação que tenham sobre este carro de aparência estranha, por favor envie um e-mail.

Passo 2: Carregar um modelo de embeddings BERT

embedding_model = SentenceTransformer("all-MiniLM-L6-v2")

Este modelo converte cada documento num vetor denso de 384 dimensões. Estas representações captam o significado semântico, não apenas a sobreposição de palavras.

Passo 3: Inicializar o BERTopic

topic_model = BERTopic(
    embedding_model=embedding_model,
    vectorizer_model=CountVectorizer(stop_words="english"),
    language="english",
    calculate_probabilities=True,
    verbose=True
)

Isto é o que está a acontecer conceptualmente:

O modelo BERT gera embeddings de documentos UMAP reduz as dimensões dos embeddings HDBSCAN agrupa os documentos TF-IDF extrai palavras representativas dos tópicos

Passo 4: Ajustar o modelo de tópicos

topics, probs = topic_model.fit_transform(docs)

Esta única linha faz muito trabalho:

Cada documento é incorporado usando BERT. Os documentos são agrupados com base na semelhança semântica. Cada documento recebe um ID de tópico. As probabilidades dos tópicos são calculadas.

topics contêm um rótulo de tópico por documento.

Passo 5: Inspecionar tópicos descobertos

topic_info = topic_model.get_topic_info()
print(topic_info.head(10))

Isto mostra:

ID do Tópico Número de documentos no tópico Palavras representativas principais

O tópico -1 representa outliers (documentos que não se enquadram bem em nenhum tópico).

  Topic  Count                           Name  \
0     -1   3604             -1_god_db_like_don   
1      0   1074       0_team_game_season_games   
2      1    514  1_patients_msg_medical_health   
3      2    394      2_space_launch_nasa_orbit   
4      3    359  3_key_clipper_chip_encryption   
5      4    261       4_card_monitor_video_vga   
6      5    239     5_israel_israeli_arab_jews   
7      6    185             6_jpeg_image_cx_c_   
8      7    167     7_fbi_koresh_batf_compound   
9      8    160    8_motherboard_ram_card_sale   

                                      Representation  \
0  [god, db, like, don, edu, know, just, use, doe...   
1  [team, game, season, games, hockey, play, play...   
2  [patients, msg, medical, health, disease, doct...   
3  [space, launch, nasa, orbit, lunar, satellite,...   
4  [key, clipper, chip, encryption, keys, escrow,...   
5  [card, monitor, video, vga, drivers, diamond, ...   
6  [israel, israeli, arab, jews, arabs, palestini...   
7  [jpeg, image, cx, c_, gif, files, format, file...   
8  [fbi, koresh, batf, compound, gas, children, w...   
9  [motherboard, ram, card, sale, price, offer, m...   

                                 Representative_Docs  
0  [This is a periodic posting intended to answer...  
1  [NHL RESULTS FOR GAMES PLAYED 4/14/93.\n\n----...  
2  [\n\nSo just what was it you wanted to say?\n\...  
3  [Archive-name: space/probe\nLast-modified: $Da...  
4  [Here are some corrections and additions to He...  
5  [ and  A VGA monitor..\ne-mail\n, Does anyone ...  
6  [\nThis a "tried and true" method utilized by ...  
7  [Archive-name: graphics/resources-list/part2\n...  
8  [...\n\n\tIt's amazing how everyone automatica...  
9  [NEW POSTING, LOWER PRICES!!  MAKE OFFERS ON A... 

Passo 6: Ver palavras que definem um tópico específico

topic_id = 0
print(topic_model.get_topic(topic_id))

Isto devolve uma lista de pares (palavra, pontuação_de_importância). Estas palavras não são simplesmente palavras frequentes; elas são distintivas para esse tema em relação a todos os outros.

Passo 7: Atribuir tópicos de volta aos documentos

df = pd.DataFrame({
    "document": docs[:10],
    "topic": topics[:10]
})

print(df)

Agora pode ver a que tópico pertence cada documento.

                                           document  topic  
0  I was wondering if anyone out there could enli...     18  
1  A fair number of brave souls who upgraded thei...     13  
2  well folks, my mac plus finally gave up the gh...     \-1  
3  \\nDo you have Weitek's address/phone number?  ...     \-1  
4  From article \<C5owCB.n3p@world.std.com\>, by to...    105  
5  \\n\\n\\n\\n\\nOf course.  The term must be rigidly...     \-1  
6  There were a few people who responded to my re...     \-1  
7                                                ...     33  
8  I have win 3.0 and downloaded several icons an...      6  
9  \\n\\n\\nI've had the board for over a year, and ...     26

Passo 8: Reduzir tópicos (opcional, mas útil)

O BERTopic pode fundir automaticamente tópicos semelhantes.

topic_model.reduce_topics(docs, nr_topics=10)

Isto ajuda a produzir resultados mais claros e interpretáveis.

fig = topic_model.visualize_barchart(top_n_topics=8)
fig.show()

fig = topic_model.visualize_documents(docs)
fig.show()

Os modelos LDA contabilizam palavras de forma probabilística e assumem que os documentos são misturas de tópicos. A modelação de tópicos baseada em BERT não assume qualquer processo generativo. Em vez disso, baseia-se em embeddings semânticos e clustering. O LDA funciona bem para vocabulários curtos e matemática interpretável. A modelação de tópicos baseada em BERT destaca-se a capturar contexto, sinónimos e similaridade semântica.

Perguntas Frequentes

Qual é a diferença entre modelação de tópicos e classificação de texto? A modelação de tópicos é não supervisionada e descobre tópicos automaticamente sem dados rotulados, enquanto a classificação de texto é supervisionada e atribui etiquetas predefinidas aos documentos com base em exemplos de treino.

Um documento pode pertencer a mais de um tópico? Sim, a maioria dos métodos de modelagem de tópicos assume que os documentos contêm múltiplos tópicos, cada um com uma certa probabilidade ou proporção.

Quantos tópicos devo escolher? Não existe uma regra fixa. O número de tópicos depende do tamanho do conjunto de dados, do domínio e do caso de uso. A experimentação e a avaliação da coerência são geralmente utilizadas para encontrar um número adequado.

A modelação de tópicos é o mesmo que clustering? A modelação de tópicos e o clustering estão relacionados, mas não são idênticos. O clustering atribui cada documento a um único grupo, enquanto a modelação de tópicos representa os documentos como misturas de múltiplos tópicos.

A modelação de tópicos compreende o significado? A modelação de tópicos não compreende verdadeiramente a linguagem no sentido humano. Identifica padrões estatísticos na utilização de palavras, que muitas vezes se alinham bem com temas interpretáveis por humanos.

Conclusão

A modelagem de tópicos é um dos algoritmos essenciais que ajuda a compreender o crescente volume de dados de texto não estruturados. Entender padrões ocultos através da co-ocorrência de palavras permite-nos ir além da análise superficial de palavras-chave e obter uma compreensão mais holística de grandes coleções de documentos. Abordagens como Latent Dirichlet Allocation, Fatoração de Matrizes Não Negativa e Análise Semântica Latente Probabilística abordam este desafio a partir de diferentes perspetivas matemáticas e probabilísticas, oferecendo flexibilidade consoante a natureza dos dados e o problema em questão.

Embora nenhum método funcione para todos, escolher o modelo certo e ajustá-lo de forma cuidadosa pode revelar insights ricos e interpretáveis que seriam difíceis de obter manualmente. Quando usado com conhecimento do domínio e avaliação cuidadosa, a modelagem de tópicos não só agiliza os fluxos de trabalho de análise de texto, como também serve de base poderosa para tarefas subsequentes, como agrupamento de documentos, recuperação de informações e análise exploratória de dados.

Obrigado por aprender com a comunidade Linux-Console.net.