Sumário
Introdução
A análise sistemática da produção acadêmica institucional representa um desafio fundamental para a compreensão das tendências de pesquisa, áreas de interesse e evolução do conhecimento em universidades. No contexto da Universidade Estadual Paulista (Unesp), com múltiplos campi distribuídos pelo estado de São Paulo, essa tarefa torna-se ainda mais complexa devido ao volume e diversidade da produção científica.
O presente trabalho aborda a questão central: "O que os alunos de graduação da Unesp produziram nos últimos 10 anos?". Esta pergunta desdobra-se em questões específicas sobre preferências disciplinares, evolução temporal de tópicos de pesquisa, distribuição geográfica de áreas de interesse e padrões emergentes na produção acadêmica.
Para responder a essas questões, desenvolveu-se um sistema computacional que integra a metodologia clássica de Análise de Conteúdo proposta por Laurence Bardin1 com técnicas atuais de aprendizado profundo e processamento de linguagem natural (PLN). Esta abordagem híbrida permite manter o rigor metodológico da análise qualitativa tradicional, ao mesmo tempo em que viabiliza o processamento de grandes volumes de dados através de algoritmos automatizados.
O objetivo principal deste trabalho é desenvolver e validar o sistema aplicado à produção acadêmica da Unesp, especificamente os trabalhos de conclusão de curso (TCCs) produzidos entre 2015 e 2024.
De maneira específica, os autores buscam (a) implementar computacionalmente as três fases da metodologia de Bardin através de técnicas de PLN e aprendizado de máquina, (b) identificar e caracterizar os principais tópicos de pesquisa presentes nos TCCs através de modelagem automática de tópicos, (c) analisar a evolução temporal dos tópicos identificados, detectando tendências emergentes e declinantes, e (d) mapear a distribuição geográfica e disciplinar dos tópicos entre os diferentes campi e cursos.
Revisão de Literatura
Análise de Conteúdo de Bardin
A Análise de Conteúdo, conforme sistematizada por Laurence Bardin1, constitui-se como "um conjunto de técnicas de análise das comunicações visando obter por procedimentos sistemáticos e objetivos de descrição do conteúdo das mensagens indicadores (quantitativos ou não) que permitam a inferência de conhecimentos relativos às condições de produção/recepção (variáveis inferidas) dessas mensagens".
A metodologia estrutura-se em três fases fundamentais:
Pré-análise: Organização do material e sistematização das ideias iniciais. Inclui a leitura flutuante, escolha dos documentos, formulação de hipóteses e objetivos, e elaboração de indicadores.
Exploração do material: Aplicação sistemática das decisões tomadas na pré-análise. Consiste essencialmente em operações de codificação, decomposição ou enumeração, em função de regras previamente formuladas.
Tratamento dos resultados e interpretação: Os resultados brutos são tratados de maneira a serem significativos e válidos. Operações estatísticas simples ou complexas permitem estabelecer quadros de resultados, diagramas, figuras e modelos.
Topic Modeling e BERTopic
Topic modeling refere-se a uma família de algoritmos de aprendizado de máquina não supervisionado destinados a descobrir estruturas temáticas latentes em grandes coleções de documentos2. Tradicionalmente, métodos como Latent Dirichlet Allocation (LDA) dominam o campo, modelando documentos como misturas probabilísticas de tópicos.
BERTopic, introduzido por Grootendorst3, representa uma evolução significativa nessa área, combinando embeddings de linguagem pré-treinados com técnicas de clustering para criar representações de tópicos mais coerentes e interpretáveis. O algoritmo segue uma pipeline modular:
Geração de Embeddings: Utilização de modelos de linguagem pré-treinados (BERT, Sentence-BERT) para criar representações vetoriais densas dos documentos.
Redução Dimensional: Aplicação de Uniform Manifold Approximation and Projection (UMAP) para reduzir a dimensionalidade dos embeddings, preservando estruturas locais e globais4.
Clustering: Uso de Hierarchical Density-Based Spatial Clustering of Applications with Noise (HDBSCAN) para identificar clusters de documentos semanticamente similares5.
Representação de Tópicos: Extração de palavras representativas através de class-based TF-IDF (c-TF-IDF), uma variação do TF-IDF tradicional6 adaptada para contextos de clustering3.
Processamento de Linguagem Natural em Português
O processamento de textos em português apresenta desafios específicos relacionados à morfologia rica da língua7, incluindo conjugações verbais complexas, concordância de gênero e número, e uso extensivo de clíticos. Para este trabalho, utilizou-se o modelo spaCy pt_core_news_lg, treinado especificamente para português brasileiro, oferecendo capacidades de tokenização, lematização, análise morfossintática e reconhecimento de entidades nomeadas8.
Fundamentos Matemáticos dos Algoritmos
Processamento Linguístico com spaCy
O spaCy implementa um pipeline de processamento linguístico baseado em redes neurais convolucionais (CNN). As principais operações realizadas são:
Tokenização: Segmentação do texto em tokens utilizando regras linguísticas específicas do português e padrões de expressões regulares. Cada documento \(D\) é transformado em uma sequência de tokens \(T = {t_1, t_2, ..., t_n}\).
Lematização: Redução de cada token à sua forma canônica (lema) através de um modelo estatístico treinado. Para cada token \(t_i\), a lematização mapeia \(\text{lemma}(t_i) = l_i\), onde \(l_i\) representa a forma base da palavra, removendo flexões verbais, plurais e outras variações morfológicas.
Part-of-Speech (POS) Tagging: O spaCy utiliza uma rede neural convolucional para classificar cada token em categorias gramaticais. A probabilidade de um token \(t_i\) pertencer à classe POS \(c_j\) é calculada através de \(P(c_j \mid t_i) = \text{softmax}(\mathbf{W} \cdot \text{CNN}(t_i) + \mathbf{b})_j\), onde \(\mathbf{W}\) são os pesos da camada de classificação, \(\text{CNN}(t_i)\) é a representação vetorial do token, e \(\mathbf{b}\) é o vetor de bias.
Term Frequency-Inverse Document Frequency (TF-IDF)
O TF-IDF é uma medida estatística que avalia a importância de um termo em um documento dentro de um corpus. É calculado como o produto de duas componentes:
Frequência do Termo (TF):
\[ \text{TF}(t, d) = \frac{f_{t,d}}{\sum_{t' \in d} f_{t',d}} \]
onde \(f_{t,d}\) é a frequência bruta do termo \(t\) no documento \(d\).
Frequência Inversa de Documento (IDF):
\[ \text{IDF}(t, D) = \log\left(\frac{N}{\mid{d \in D : t \in d}\mid}\right) \]
onde \(N\) é o número total de documentos e \(\mid{d \in D : t \in d}\mid\) é o número de documentos contendo o termo \(t\).
O TF-IDF final, é, portanto, obtido com \(\text{TF-IDF}(t, d, D) = \text{TF}(t, d) \times \text{IDF}(t, D)\). Esta métrica penaliza termos muito frequentes (como stopwords) e valoriza termos distintivos de documentos específicos.
Embeddings Semânticos (Sentence-Transformers)
O modelo paraphrase-multilingual-mpnet-base-v2 utiliza uma arquitetura transformer9 com mean pooling para gerar representações vetoriais densas de sentenças. Para uma sequência de entrada \(\mathbf{X} = [\mathbf{x}_1, ..., \mathbf{x}_n]\), o mecanismo de atenção multi-cabeças calcula:
\[ \text{Attention}(\mathbf{Q}, \mathbf{K}, \mathbf{V}) = \text{softmax}\left(\frac{\mathbf{Q}\mathbf{K}^T}{\sqrt{d_k}}\right)\mathbf{V} \]
onde \(\mathbf{Q}\) (queries), \(\mathbf{K}\) (keys) e \(\mathbf{V}\) (values) são projeções lineares da entrada, e \(d_k\) é a dimensão das keys.
A representação final do documento é obtida pela média das representações de todos os tokens,
\[ \mathbf{e}_d = \frac{1}{n}\sum_{i=1}^{n} \mathbf{h}_i \]
onde \(\mathbf{h}_i\) é a representação contextualizada do token \(i\) na última camada do transformer, e \(\mathbf{e}_d \in \mathbb{R}^{384}\) é o embedding final do documento.
Uniform Manifold Approximation and Projection (UMAP)
O UMAP reduz a dimensionalidade dos embeddings preservando estruturas topológicas locais e globais. O algoritmo baseia-se na teoria de variedades Riemannianas e topologia algébrica4. Para cada ponto \(x_i\), define-se uma distância normalizada aos \(k\) vizinhos mais próximos,
\[ d_i(x_i, x_j) = \max\left(0, \frac{\Vert x_i - x_j \Vert - \rho_i}{\sigma_i}\right) \]
onde \(\rho_i\) é a distância ao vizinho mais próximo e \(\sigma_i\) é um fator de normalização.
A probabilidade de conexão entre \(x_i\) e \(x_j\) no espaço de alta dimensão é
\[ w_{ij} = \exp(-d_i(x_i, x_j)) \]
O UMAP minimiza a divergência de entropia cruzada entre os grafos de alta e baixa dimensão via
\[ \mathcal{L} = \sum_{i,j} w_{ij} \log\left(\frac{w_{ij}}{v_{ij}}\right) + (1-w_{ij})\log\left(\frac{1-w_{ij}}{1-v_{ij}}\right) \]
onde \(v_{ij}\) são os pesos no espaço de baixa dimensão, calculados analogamente.
Hierarchical DBSCAN (HDBSCAN)
O HDBSCAN é um algoritmo de clustering hierárquico baseado em densidade que identifica clusters de diferentes densidades e tamanhos5. Para dois pontos \(x_i\) e \(x_j\), a distância de alcance mútua é definida como
\[ d_{\text{mreach}-k}(x_i, x_j) = \max \left\{ \text{core}_k(x_i), \text{core}_k(x_j), d(x_i, x_j) \right\} \]
onde \(\text{core}_k(x_i)\) é a distância ao \(k\)-ésimo vizinho mais próximo de \(x_i\) (com \(k\) = min_cluster_size).
O algoritmo constrói uma árvore de spanning mínima (MST) sobre o grafo completo com pesos \(d_{\text{mreach}-k}\). A MST minimiza
\[ \sum_{(i,j) \in \text{MST}} d_{\text{mreach}-k}(x_i, x_j) \]
Em seguida, remove-se iterativamente arestas da MST em ordem decrescente de peso, criando uma hierarquia de clusters. Para cada nível \(\epsilon\), um cluster é estável se sua "persistência" (número de pontos multiplicado pelo tempo de vida) é alta.
O método Excess of Mass (EOM) seleciona clusters que maximizam:
\[ \text{Estabilidade}(C) = \sum_{x_i \in C} (\lambda_{x_i} - \lambda_{\text{birth}}) \]
onde \(\lambda = 1/\epsilon\) é o parâmetro de densidade inversa, e \(\lambda_{\text{birth}}\) é a densidade quando o cluster nasce na hierarquia.
Pontos que não pertencem a nenhum cluster estável são classificados como outliers.
Class-based TF-IDF (c-TF-IDF)
O BERTopic utiliza uma variação do TF-IDF tradicional adaptada para contexto de clusters. Enquanto o TF-IDF tradicional opera em nível de documento, o c-TF-IDF trata cada cluster como um único "documento":
\[ W_{t,c} = tf_{t,c} \times \log\left(\frac{m}{df_t}\right) \]
onde \(W_{t,c}\) é peso do termo \(t\) no cluster \(c\), \(tf_{t,c}\) é a soma das frequências do termo em todos os documentos do cluster, \(m\) é o número total de clusters, e \(df_t\) é número de clusters contendo o termo \(t\).
Esta abordagem permite extrair termos que são distintivos de cada cluster, gerando representações interpretáveis dos tópicos identificados.
Metodologia
Arquitetura do Sistema
O sistema desenvolvido implementa uma arquitetura modular baseada em pipeline, organizada em cinco estágios distintos que correspondem às fases da metodologia de Bardin adaptadas ao contexto computacional:
stateDiagram-v2
[*] --> Coleta
Coleta: Coleta de dados
state Coleta {
[*] --> CriaDB
CriaDB --> Pagina
Pagina --> ExtraiMeta
ExtraiMeta --> Normaliza
Normaliza --> SalvaDB
Normaliza --> SalvaJSON
SalvaDB --> [*]
SalvaJSON --> [*]
CriaDB: Cria database vazio
Pagina: Requisição HTTP com paginação e retry
ExtraiMeta: Extrai metadados JSON da API
Normaliza: Normaliza valores
SalvaDB: Salva metadados no database relacional
SalvaJSON: Salva backup de metadados em JSON
}
Coleta --> Preprocessamento
Preprocessamento: Pré-processamento
state Preprocessamento {
[*] --> CarregaDB
CarregaDB --> DetectaLingua
DetectaLingua --> FiltraPortugues
FiltraPortugues --> LimpezaTexto
LimpezaTexto --> Vetorizacao
Vetorizacao --> SalvaCorpus
SalvaCorpus --> [*]
CarregaDB: Carrega TCCs do database
DetectaLingua: Detecta idioma com confiança
FiltraPortugues: Filtra apenas português
LimpezaTexto: Tokenização + Lematização + Remoção de stopwords
Vetorizacao: Cria matriz TF-IDF (unigramas, bigramas, trigramas)
SalvaCorpus: Salva corpus processado + vetorizador
}
Preprocessamento --> PreAnalise
PreAnalise: FASE 1 BARDIN - Pré-análise
state PreAnalise {
[*] --> CarregaCorpus1
CarregaCorpus1 --> EstatisticasDesc
EstatisticasDesc --> AnaliseTemp
EstatisticasDesc --> AnaliseGeo
EstatisticasDesc --> AnaliseLex
AnaliseTemp --> GeraViz1
AnaliseGeo --> GeraViz1
AnaliseLex --> GeraViz1
GeraViz1 --> GeraRelat1
GeraRelat1 --> [*]
CarregaCorpus1: Carrega corpus processado
EstatisticasDesc: Calcula estatísticas descritivas
AnaliseTemp: Distribuição temporal por ano/curso
AnaliseGeo: Distribuição por campus e curso
AnaliseLex: Frequência de palavras e vocabulário
GeraViz1: Gera visualizações
GeraRelat1: Gera relatório textual de pré-análise
}
PreAnalise --> TopicModeling
TopicModeling: FASE 2 BARDIN - Exploração do Material
state TopicModeling {
[*] --> CarregaCorpus2
CarregaCorpus2 --> GeraEmbeddings
GeraEmbeddings --> ReducaoDim
ReducaoDim --> Clustering
Clustering --> ExtraiTopicos
ExtraiTopicos --> AtribuiTopicos
AtribuiTopicos --> GeraViz2
GeraViz2 --> SalvaModelo
SalvaModelo --> [*]
CarregaCorpus2: Carrega corpus processado
GeraEmbeddings: Gera embeddings semânticos dos documentos
ReducaoDim: Redução dimensional com UMAP (5D, cosine)
Clustering: Clustering hierárquico com HDBSCAN
ExtraiTopicos: Extrai palavras-chave com c-TF-IDF
AtribuiTopicos: Atribui tópico a cada documento
GeraViz2: Gera visualizações
SalvaModelo: Salva modelo + corpus com tópicos
}
TopicModeling --> Interpretacao
Interpretacao: FASE 3 BARDIN - Interpretação
state Interpretacao {
[*] --> CarregaTopicos
CarregaTopicos --> AnaliseTemporal
CarregaTopicos --> AnaliseGeografica
CarregaTopicos --> AnaliseCurso
AnaliseTemporal --> IdentTendencias
IdentTendencias --> TestaSignificancia
AnaliseGeografica --> TestaSignificancia
AnaliseCurso --> SinteseInterpret
TestaSignificancia --> SinteseInterpret
SinteseInterpret --> GeraViz3
GeraViz3 --> GeraRelat3
GeraRelat3 --> [*]
CarregaTopicos: Carrega corpus com tópicos + modelo
AnaliseTemporal: Agrupa por ano + tópico
IdentTendencias: Regressão linear (emergentes/declinantes)
AnaliseGeografica: Matriz contingência campus×tópico
TestaSignificancia: Teste chi-square de independência
AnaliseCurso: Análise de tópicos por curso específico
SinteseInterpret: Cruza análises temporais + geográficas
GeraViz3: Gera visualizações
GeraRelat3: Gera relatório interpretativo final
}
Interpretacao --> [*]
Coleta de Dados
A coleta de dados foi realizada através da API do repositório institucional da Unesp, implementando-se um cliente HTTP com tratamento de erros e retry automático. Utilizamos exclusivamente os resumos dos trabalhos. Os parâmetros de busca incluíram:
- Tipo de documento: "Trabalho de conclusão de curso"
- Idioma: Português (por)
- Período: 2015-2024
- Campos extraídos: UUID, handle, título, resumo, data de publicação, campus, curso, autores, orientadores, palavras-chave

O processo resultou na coleta de 13.213 documentos, armazenados em banco de dados SQLite com esquema normalizado para garantir integridade referencial. Destes, 13.112 possuem resumos e títulos em português, e puderam ser utilizados neste estudo.
Implementação das Fases de Bardin
Pré-Análise
A pré-análise computacional incluiu:
- Estatísticas Descritivas: Total de documentos, período temporal, distribuição por campus/curso
- Análise Exploratória: Visualizações de distribuições temporais, geográficas e disciplinares
- Nuvem de Palavras: Representação visual das palavras mais frequentes no corpus
Exploração do Material
A modelagem de tópicos foi realizada através do BERTopic com os seguintes hiperparâmetros:
Embeddings:
- Modelo:
paraphrase-multilingual-mpnet-base-v2 - Dimensão: 384
UMAP:
n_neighbors= 15n_components= 5min_dist= 0.0metric= 'cosine'
HDBSCAN:
min_cluster_size= 10metric= 'euclidean'cluster_selection_method= 'eom'
Tratamento e Interpretação
A interpretação dos resultados envolveu três análises principais:
- Análise Temporal: Identificação de tendências através de regressão linear para cada tópico. O coeficiente normalizado é calculado como
\[ \beta_{norm} = \frac{\beta_1}{\bar{y}} \]
O sistema classifica os tópicos com base no coeficiente normalizado para identificar tendências emergentes, estáveis ou declinantes.
- Análise Geográfica: teste qui-quadrado de independência entre campus e tópico:
\[ \chi^2 = \sum_{i,j} \frac{(O_{ij} - E_{ij})^2}{E_{ij}} \]
onde \(O_{ij}\) é a frequência observada e \(E_{ij}\) é a frequência esperada sob a hipótese de independência.
- Análise por Curso: Identificação dos tópicos predominantes em cada programa de graduação através de análise de frequências relativas.
Referências
BARDIN, L. Análise de conteúdo. São Paulo: Edições 70, 2016. ↩ ↩2
BLEI, D. M.; NG, A. Y.; JORDAN, M. I. "Latent Dirichlet Allocation". Journal of Machine Learning Research, vol. 3, 993-1022, 2003. ↩
GROOTENDORST, M. "BERTopic: Neural topic modeling with a class-based TF-IDF procedure". 10.48550/arXiv.2203.05794, 2022. ↩ ↩2
McINNES, L.; HEALY, J.; MELVILLE, J. "UMAP: Uniform Manifold Approximation and Projection for Dimension Reduction". arXiv preprint arXiv:1802.03426, 2018. ↩ ↩2
CAMPELLO, R. J. G. B.; MOULAVI, D.; SANDER, J. "Density-Based Clustering Based on Hierarchical Density Estimates". In: Advances in Knowledge Discovery and Data Mining. PAKDD 2013. Lecture Notes in Computer Science, vol. 7819. Berlim, Heidelberg: Springer, 2013. ↩ ↩2
SALTON, G.; BUCKLEY, C. "Term-weighting approaches in automatic text retrieval". Information Processing & Management, vol. 24, no. 5, pp. 513-523, 1988. ↩
AIRES, R. V. X. Implementação, adaptação, combinação e avaliação de etiquetadores para o português do Brasil. Dissertação (Mestrado). Universidade de São Paulo, São Carlos, 2000. ↩
HONNIBAL, M.; MONTANI, I.; VAN LANDEGHEM, S.; BOYD, A. "spaCy: Industrial-strength Natural Language Processing in Python". Zenodo. https://doi.org/10.5281/zenodo.1212303, 2020. ↩
VASWANI, A.; SHAZEER, N.; PARMAR, N.; USZKOREIT, J.; JONES, L.; GOMEZ, A. N.; KAISER, Ł.; POLOSUKHIN, I. "Attention is all you need". In: Advances in Neural Information Processing Systems (NeurIPS), vol. 30, pp. 5998-6008, 2017. ↩