[PT-BR] Comparando monografias de uma Universidade brasileira e uma Universidade americana utilizando NLP

As pessoas tendem a considerar um trabalho produzido por um estudante de uma Universidade da Ivy League um trabalho muito mias bem produzido do que um feito por um estudante de uma Universidade não tão conceituada.

Mas de que forma esses trabalhos são diferentes? E o que os estudantes podem fazer para produzir trabalhos melhores e consequentemente se destacarem mais?

Medir a qualidade dos trabalhos de uma Universidade é algo bastante complexo e portanto não é o objetivo aqui. Eu sempre tive curiosidade em investigar as diferenças entre trabalhos de instituições diferentes e para iniciar decidi explorar dois fatores envolvendo os trabalhos: a escolha dos temas e a natureza deles.

Neste texto vamos abordar formas de analisar os trabalhos utilizando Processamento de Linguagem Natural. Vamos extrair palavras-chaves utilizando o algoritmo de tf-idf e classificar os trabalhos em clusters utilizando o Latent Semantic Indexing (LSI).

Os Dados

O conjunto de dados é composto por resumos (abstracts) de trabalhos de conclusão de curso de estudantes de uma Universidade brasileira (Universidade Federal de Pernambuco) e de uma Universidade americana (Carnegie Mellon). Todos os trabalhos foram feitos por estudantes de graduação em Ciência da Computação.

Segundo o Times Higher Education World University Rankings a Carnegie Mellon tem o 6ª melhor programa de Ciência da Computação do mundo, enquanto a Universidade Federal de Pernambuco nem aparece nesse ranking. Já no ranking geral a Carnegie Mellon aparece na posição de número 23, enquanto a UFPE aparece na posição 801+.

Todos os trabalhos foram produzidos entre os anos de 2002 e 2016 e cada linha do dataset possui as seguintes informações:

Os trabalhos da Carnegie Mellon podem ser encontrados aqui e os trabalhos da Universidade Federal de Pernambuco podem ser encontrados aqui.

Etapa 1 — Investigando os temas dos trabalhos

Extraindo palavras-chaves (keywords)

Para identificar os temas de cada trabalho a primeira estratégia que vamos utilizar é extrair as keywords. Para isso vamos utilizar o algoritmo de tf-idf.

tf-idf

O que o tf-idf faz é penalizar as palavras que aparecem muito em um documento e que também aparecem muito** nos outros documentos**. Ou seja, se uma palavra é muito recorrente em um texto mas também é muito recorrente em outros ela é penalizada; isto quer dizer que essa palavra não serve para caracterizar o determinado texto (já que ela também caracterizaria todos os outros). Vamos explorar um exemplo para visualizar isso melhor. Este exemplo aparece na página da Wikipedia sobre tf-idf. Para cada documento temos uma palavra e a quantidade de vezes que ela aparece no texto.

Temos o Documento 1:

| Term   | Term Count |
|--------|------------|
| this   |     1      |
| is     |     1      |
| a      |     2      |
| sample |     1      |

E o Documento 2:

| Term    | Term Count |
|---------|------------|
| this    |     1      |
| is      |     1      |
| another |     2      |
| example |     3      |

Primeiro vamos usar a intuição. A palavra this aparece uma vez nos dois documentos. Por aparecer o mesmo número de vezes e em ambos os documentos, temos uma certa intuição de que ela é meio ‘neutra’. Ou seja, ela não serve para identificar os documentos.

Já a palavra example aparece três vezes no Documento 2 e nenhuma vez no Documento 1. Isso é um indicativo de que esse palavra pode servir para caracterizar o Documento 2.

Agora vamos para a parte matemática. Precisamos computar duas métricas: TF (Term Frequency) e IDF (Inverse Document Frequency).

A forma do TF é definida por:

TF(t) = (Número de vezes que o termo t aparece no documento) / (Número total de termos presentes no documento)

Então para as palavras this e example em cada documento, temos:

TF('this',   Documento 1) = 1/5 = 0.2
TF('example',Documento 1) = 0/5 = 0

TF('this',   Documento 2) = 1/7 = 0.14
TF('example',Documento 2) = 3/7 = 0.43

Já a fórmula do IDF é definida por:

IDF(t) = log_e(Número total de documentos / Número de documentos com o termo t presente)

Por que a fórmula tem essa operação de logaritmo? Porque o tf-idf é uma heurística.

A intuição é de que um termo presente em muitos documentos não é bom para discriminar o documento, e deve ter um peso menor do que um termo que ocorre em poucos documentos. A fórmula é uma implementação heurística desta intuição. — Stephen Robertson

Como o usεr11852 explica no StackExchange:

O aspecto enfatizado pelo logaritmo é que a relevância de um termo ou de um documento não aumenta proporcionalmente com a frequência do termo (ou do documento). Usando uma função sub-linear ajuda a diminuir esse efeito. Além disso a influência de valores muito altos ou valores muito baixos (palavras muito raras, por exemplo) também é amortizada. — Fonte

Agora vamos aplicar a fórmula:

IDF('this',   Documentos) = log(2/2) = 0

IDF('example',Documentos) = log(2/1) = 0.30

Finalmente, no final nos temos:

TF-IDF('this',   Documento 1) = 0.2 x 0  = 0
TF-IDF('this',   Documento 2) = 0.14 x 0 = 0

TF-IDF('example',Documento 2) = 0.43 x 0.30 =

Para cada abstract dos trabalhos das Universidades eu usei o tf-idf para identificar as 4 palavras com os scores mais altos do tf-idf. Eu utilizei o CountVectorizer e o TfidfTransformer do scikit-learn. Você pode ver o notebook com o código aqui.

Com as 4 keywords para cada trabalho, utilizei o WordCloud para visualizar as palavras, e os resultados foram:

Keywords da UFPE

Keywords da Carnegie Mellon


Agrupando os trabalhos em clusters

A segunda estratégia utilizada para explorar os temas dos trabalhos foi a modelagem de tópicos. Nesta etapa o algoritmo utilizado foi o Latent Semantic Indexing (LSI).

Latent Semantic Indexing

O algoritmo utiliza os dados do tf-idf e faz uma decomposição de matrizes para agrupar os textos em tópicos. Como Ian Soboroff mostra nos slides do curso de Information Retrieval:

Para entender melhor vamos utilizar os seguintes títulos de documentos de dois domínios (Interação Humano Computador e Teoria dos Grafos). Esses exemplos foram retirados do artigo An Introduction to Latent Semantic Analysis.

c1:
 machine
 for ABC
 applications
c2: A
 of
 opinion of
 response time
c3:
 and
 engineering testing of EPS

m1: The generation of random, binary, ordered

m2: The intersection
 of paths in

m3:
: A

O primeiro passo é criar a matriz com a quantidade de vezes que cada termo aparece (já removemos as stop-words e utilizamos apenas os termos mais importantes de cada título):

| termo     | c1 | c2 | c3 | m1 | m2 | m3 |
|-----------|----|----|----|----|----|----|
| human     | 1  | 0  | 1  | 0  | 0  | 0  |
| interface | 1  | 0  | 0  | 0  | 0  | 0  |
| computer  | 1  | 1  | 0  | 0  | 0  | 0  |
| user      | 0  | 1  | 0  | 0  | 0  | 0  |
| system    | 0  | 1  | 2  | 0  | 0  | 0  |
| survey    | 0  | 1  | 0  | 0  | 0  | 1  |
| trees     | 0  | 0  | 0  | 1  | 1  | 0  |
| graph     | 0  | 0  | 0  | 0  | 1  | 1  |
| minors    | 0  | 0  | 0  | 0  | 0  | 1  |

Após a aplicação dos cálculos da técnica nós calculamos as coordenadas de cada termo e cada documento. O resultado é:

human     = (-1.031, 0.440)
interface = (-0.318, 0.109)
computer  = (-0.922, -0.123)
user      = (-0.604, -0.232)
system    = (-2.031, -0.232)
survey    = (-0.759, -0.988)
trees     = (-0.035, -0.637)
graph     = (-0.184, -1.231)
minors    = (-0.152, -0.758)

c1        = (-0.850, 0.214)
c2        = (-1.614, -0.458)
c3        = (-1.905, 0.658)
m1        = (-0.013, -0.321)
m2        = (-0.083, -0.942)
m3        = (-0.409, -1.501)

Usando o matplotlib para visualizar isso graficamente, temos:

O resultado para os termos e documentos

Legal né? Os vetores em vermelho são os documentos de Interação Humano Computador e os documento em azul são de Teoria dos Grafos.

Para modelar os tópicos dos trabalhos das Universidades eu utilizei o gensim. Nos poucos testes que fiz variando as dimensões eu não encontrei muitas diferenças entre os trabalhos das Universidades (todos pareciam pertencer ao mesmo cluster). O tópico que mais diferenciou os trabalhos das Universidades foi esse:

y topic:
[('object', 0.29383227033104375),
 ('software', -0.22197520420133632),
 ('algorithm', 0.20537550622495102),
 ('robot', 0.18498675015157251),
 ('model', -0.17565360130127983),
 ('project', -0.164945961528315),
 ('busines', -0.15603883815175643),
 ('management', -0.15160458583774569),
 ('process', -0.13630070297362168),
 ('visual', 0.12762128292042879)]

Visualmente, o resultado foi:

Visualização da UFPE e da Carnegie Mellon para o tópico y

Na imagem o tópico y é representado no eixo y. É possível ver que os trabalhos da Carnegie Mellon estão mais associados a ‘object’, ‘robot’ e ‘algorithm’ e os trabalhos da UFPE estão mais associados a ‘software’, ‘project’ e ‘business’.

Você pode ver o netbook com o código aqui.


Etapa 2 — Investigando a natureza dos trabalhos

Eu sempre tive a impressão de que no Brasil eram produzidos muitos trabalhos sobre review de literatura, enquanto nas outras Universidades do mundo se produzia poucos trabalhos como esses. Para investigar isso resolvi analisar os títulos dos trabalhos.

Normalmente quando um trabalho é um review de literatura a palavra ‘study’ aparece no título. Eu peguei então todos os títulos dos trabalhos e contabilizei as palavras que mais aparecem, para cada uma das Universidades. Os resultados foram:

Palavras que mais aparecem nos títulos dos trabalhos da UFPE

Palavras que mais aparecem nos títulos dos trabalhos da Carnegie Mellon

Você pode ver o notebook com o código aqui.


Resultados

A partir da análise foi possível observar que os temas dos trabalhos não diferem muito, mas deu para visualizar o que parece ser as especialidades de cada instituição. A Universidade Federal de Pernambuco produz mais trabalhos relacionados a projetos e negócios e a Carnegie Mellon se produz mais trabalhos relacionados a robôs e algoritmos. Ao meu ver essa diferença de especialidades não é algo ruim, simplesmente cada universidade é especializada em determinadas áreas.

Não foi possível observar de fato a qualidade dos trabalhos, mas um takeaway foi de que no Brasil a gente precisa produzir mais conhecimento em vez de só fazer review de literatura.

Algo importante de ser pontuado é que apenas ter os melhores trabalhos não basta. O objetivo principal no início da análise era entender porque eles “são melhores” e o que nós podemos fazer para chegar lá, mas me toquei que talvez um caminho para isso seja simplesmente mostrar mais nosso trabalho e trocar mais conhecimentos com eles. Porque isso pode nos forçar a produzir coisas mais relevantes e até nos tornar melhores a partir do feedback deles.

Acho que isso serve para todos, tanto para estudantes da universidades quanto para nós profissionais mesmo. Austin Klaeton tem uma frase que resume bem isso:

It’s not enough to be good. In order to be found, you have to be findable. — Austin Kleon

Eu apresentei essa análise na edição de 2017 da The Developer Conference em Florianópolis. Você pode ver todos os códigos e os slides aqui.