Eu li 3942 textos da New Order! Parte02 — Topic Modelling

Veja aqui tudo o que eu aprendi enquanto me aventurava por eles!

Giovani Ferreira
Data Hackers
7 min readSep 13, 2020

--

Não leu a Parte 01? Comece aqui:

Leu, mas precisa de uma relembrada? Vem comigo:
Na primeira parte dessa série eu contei um pouco sobre meu interesse em dados e como eu coletei os textos da revista para análise.

Lá eu optei por começar a análise investigando quais são as Tags mais utilizadas pelos colaboradores da New Order.

Num segundo momento utilizei um algoritmo word2vec para entender a relação entre as tags e tentar responder a pergunta “quais tags normalmente estão acompanhadas de quais tags?” (gráfico ali de cima)

A busca dessa série é por aplicar métodos estatísticos e de aprendizado de máquina para compreender o conteúdo do corpus (textos da revista) sem necessariamente ler todos.

Se na primeira parte a gente “leu” todas as tags, nessa vamos “ler” os textos;

Lá eu fui um pouco menos técnico, nessa eu me aprofundo um pouco mais no algoritmo utilizado antes de chegar no resultado final.
Se você está interessado no resultado da análise, role a página até encontrar a parte “Nomear os Tópicos”.

Esse é um texto sobre Topic Modelling, um técnica de aprendizado de máquina que busca responder outra pergunta: quantos assuntos (tópicos) diferentes existem nesse corpus e quão associado a cada tópico cada texto está.

Para quem tiver interesse no código, todos os scripts de R que utilizei estão no meu Git Hub. Gosto de acreditar que são “auto-explicativos”, mas se não forem e quiser conversar, entra em contato!

É claro que a trajetória não foi tão linear quanto eu descrevo aqui e envolveu muita exploração, testes com diferentes técnicas e bibliotecas, muita leitura e perguntas no twitter, muitos testes com parâmetros diferentes, muitas “refações”.

O primeiro passo foi criar um data.frame com as informações que eu precisava.

Nesse data.frame eu tenho:

  • 3689 linhas, sendo uma para cada texto utilizado no treinamento (contra os 3942 textos que eu scrapeei — a diferença vem de alguns filtros como textos com poucas palavras ou sem nenhuma Tag);
  • 5 colunas, uma para cada informação que preciso dos textos: ID, para cruzar com outras informações sobre os textos mais tarde; Dia em que o texto foi publicado, sendo 1 para os textos do primeiro dia, 2 para os do segundo e assim sucessivamente; A primeira Tag que o autor utilizou no texto (são possíveis 5 hoje, antigamente o Medium permitia apenas 3, porém optei por utilizar somente a primeira pois nem todos os textos têm mais de 1 Tag e isso reduziria ainda mais o corpus); E, por fim, o texto propriamente dito.

O segundo passo é descobrir quantos tópicos diferentes são bons/ótimos/suficientes para entendermos os textos.
Não existe uma ciência exata para definir essa variável (número de tópicos).

Aqui é um monte de tentativa e erro, estatística e conhecimento do corpus…
O fato de eu ser leitor da revista ajudou bastante!
Treinei 40 diferentes modelos variando o número de tópicos (4, 8, 12, 16, 20, 21, 22, 23, … , 44, 45, 46, 50, 54, 58, 62, 66, 70, 74, 78 e 82) para escolher com qual modelo trabalhar.

Eu comecei a estudar treinamento e avaliação de topic models com o que está muito bem explicado aqui:

O importante é que no final decidi (e essa parte é levemente arbitrária) que o modelo de 24 tópicos era o que melhor explicava os textos.

Decidido que esse seria o modelo, o terceiro passo é explorar o resultado desse modelo.

Para esse estudo escolhi o algoritmo STM (Structural Topic Model).
Esse algoritmo segue os mesmos princípios do LDA (Latent Dirichlet Allocation):

  • Cada texto é constituído por múltiplos tópicos e;
  • Cada tópico é uma mistura de múltiplas palavras.

Além desses dois princípios, o STM traz para o LDA a possibilidade de usar “metas” (outras informações além do texto em si, aquelas que separei no meu data.frame) para a compreensão dos tópicos.

Tanto o LDA quanto o STM nos dá dois resultados importantes β (“beta”) e γ (“gamma”):

β é a probabilidade de uma palavra estar associada a um dos tópicos;

Com essa informação sabemos quais são as palavras mais predominantes em cada tópico (sobre o que fala cada tópico).

γ é a probabilidade das palavras de um documento estarem associadas a um tópico.

Cruzando essas duas informações, conseguimos entender a prevalência dos tópicos e quais palavras contribuem para casa tópico.

Assim:

Também conseguimos visualizar a distribuição dessas palavras dentro de cada tópico, assim:

Estamos mais próximos de conseguir descrever o conteúdo da publicação.

O quarto passo é:

Nomear os Tópicos!

Especialmente para você que pulou as partes anteriores e escrolou até aqui, vamos direto ao ponto.

Esses são os 24 tópicos que descrevem a New Order, ordenados por prevalência e acompanhados dos nomes que dei para cada um deles.

Se compararmos os nomes com as palavras que contribuiram para cada tópico (gráfico anterior parecido com esse) encontraremos similaridades e também algumas diferenças.

A seguir explico como cheguei nesses nomes e quais informações colaboraram.

Começando pelo mais fácil, para nomear os tópicos o pacote que utilizei para essa análise conta com uma função labelTopics().
Essa função gera uma série de palavras que descrevem cada tópicos. Para isso ela usa diversos algoritmos de nomeação:

  • Highest Prob: Palavras com maior probabilidade em cada tópico;
  • FREX: Palavras que são ao mesmo tempo frequentes e exclusivas, identificando palavras que ajudam a distinguir tópicos;
  • Score (do pacote lda) e Lift (do pacote maptpx).

O resultado dessa função é uma lista como essa, mas para cada um dos tópicos:

Uma outra função, findThoughts(), cujo resultado são os textos mais representativos de um determinado tópico, se mostrou bastante útil.

Com ela gerei essa longa lista dos 5 textos mais representativos de cada tópico, que coloquei num post separado, aqui:

Munido das palavras e do link para os textos mais representativos foi fácil criar aqueles nomes.
A maioria deles é uma combinação das palavras dos diferentes algoritmos de nomeação com as palavras da URL. Em alguns casos eu li parte dos textos para validar o nome que eu tinha atribuído.

Por fim, um último gráfico que podemos analisar para entender a publicação.

A correlação entre os tópicos indica quais tópicos comumente são discutidos nos mesmos documentos.

É mais ou menos assim que a gente pode ler o gráfico acima:

Começando com qualquer um dos 5 isolados lá em cima. São assuntos que normalmente acontecem sozinhos.

Agora Política Nacional, no canto inferior direito.
Acho interessante como política se conecta com Cidades/Centros Urbanos, com Sociedade/Economia mas também com Jornalismo e Fake News (intimamente ligado com Redes Sociais)

Fica bastante evidente também que os assuntos conectados a amor, bem estar e saúde mental estão todos bem “emaranhados” , interconectados, no lado esquerdo.

Se você nunca leu nenhum texto da revista agora já tem uma imagem bem clara do que encontraria nela. Tem ainda uma lista de assuntos com os textos mais relevantes em cada um deles, caso queira ler um pouco mais.

No fim, conseguimos resumir e explicar um corpus de 3942 textos!

O que esperar dos próximos posts:

  • Na próxima parte vou cruzar os tópicos extraídos aqui com os outros dados coletados, não textuais, para entender um pouco mais sobre a publicação. Desde prevalência de tópicos ao longo do tempo até a relação entre engajamento e assuntos.
  • Por fim vou tentar estabelecer uma métrica de sucesso (uma combinação de Palmas Totais, Únicas e Respostas) e procurar correlações entre os dados coletados e essa métrica de sucesso. Mais do que tentar prever a probabilidade de sucesso de determinado texto, vamos explorar quais variáveis mais contribuem para esse sucesso.

Em 2019 o projeto Burn That Ad, campanha para o Burger King onde atuei como Diretor de Tecnologia e Diretor (duplando com o genial Luiz Evandro), ganhou Grand Prix WAVE Festival, 9 Cannes Lions (1 Gold, 3 Silver e 4 Bronze) e 3 Clio Awards (1 Silver, 2 Bronze).

Na vzlab eu lidero e conecto um time bastante diverso e talentoso de mais de 15 desenvolvedores com stakeholders internos e externos e também com outros times (atendimento, operações, projetos, ux/cx, criação, arte, redação, pesquisa, analytics e dados).

Nesse time trabalhamos com R&D & Pipeline, Sistemas Internos, Web (Front and Backend), WebGL/WebAR, Unity/Real Time, Processing/Creative Coding/IoT.

Eu falo negócios, mas também programação, arte, design, dados.

Vamos papear!
Linkedin. Twitter.GitHub.

--

--

Giovani Ferreira
Data Hackers

Innovation & New Tech team leader, data hobbyist art driven photographer.