Article image
Hugo Milesi
Hugo Milesi13/09/2023 21:20
Compartilhe

Agrupando Documentos com K-means

  • #Python
  • #Machine Learning

Introdução

No campo da ciência de dados, a clusterização ou agrupamento é uma tarefa fundamental que envolve a organização de uma coleção de documentos em grupos com base em seu conteúdo. Buscando aprimorar meus conhecimentos, desenvolvi este projeto objetivando sintetizar meus estudos. O projeto se concentra na clusterização de documentos usando o algoritmo K-means, aproveitando técnicas de Processamento de Linguagem Natural (NLP) e programação em Python. O objetivo principal é extrair informações valiosas de um conjunto de dados composto por postagens de grupos de notícias, demonstrando o poder da aprendizagem não supervisionada na análise de texto.

Visão Geral do Projeto

O projeto começa com a coleta do conjunto de dados "20newsgroups", que contém aproximadamente 18.000 postagens de grupos de notícias categorizadas em 20 tópicos diferentes. O conjunto de dados pode ser obtido pela site da própria biblioteca scikit-learn, uma bilbioteca amplamente difundida na área de ciência de dados.

mais informações: https://scikit-learn.org/0.19/datasets/twenty_newsgroups.html

Pré-processamento de Dados

Para preparar os dados de texto para o agrupamento, é realizado um extenso pré-processamento de dados, incluindo:

  1. Lematização de stopwords: stopwords são palavras que podem ser consideradas irrelevantes para o conjunto de resultados a ser exibido em uma busca realizada em um mecanismo de pesquisa. Exemplos: as, e, os, de, para, com, sem, foi. O processo envolve a remoção de pontuação, dígitos e palavras de parada, ao mesmo tempo em que se lematizam as palavras para reduzí-las às suas formas básicas. Esta etapa pode melhorar significativamente a qualidade dos dados de texto.
  2. Vetorização de Texto: Diferente de nós, humanos, as máquinas trabalham muito melhor com números do que palavras. A vetorização de texto é uma técnica utilizada para converter as palavras em um formato numérico adequado para aprendizado de máquina de forma que cada palavra tenha sua combinação única de números. Existem algumas técnicas conhecidas para realizar o processo de vetorização, eu optei pela técnica Term Frequency-Inverse Document Frequency(TFIDF), que quantifica a importância das palavras nos ocumentos

K-means

O agrupamento k-means é um algoritmo de aprendizado não supervisionado(quando não há categorização ou rotulação de dados.) que requer um número ideal de clusters(grupos) K.

Algumas vezes, o grande desafio é encontrar o bendito do número K de grupos. Para isso utilizei um método conhecido chamado de elbow method ou simplesmente método do cotovelo. O "cotovelo" no gráfico representa o ponto em que adicionar mais clusters deixa de reduzir significativamente a função de erro. Na aprendizagem de máquina buscamos minimizar a função de erro, por isso escolhemos o "cotovelo".

Imagem de exemplo:

image

A imagem acima representa o "cotovelo". Repare que a partir do numero de K maior que 3 o gráfico não apresenta mais uma redução considerável no valor de erro(WCSS), por isso, o valor de K a ser escolhido seria 3.

Mas como nem tudo são flores, o meu elbow method não ficou nítido como o do exemplo acima, me forçando a fazer uso de mais um método chamado de Silhouette Score. Este método mede o quão bem definidos e saparados os clusters estão, ajudando a confirmar a escolha de K. Ao contrário do elbow method em que procuramos reduzir o erro, o silhouette score mede a pontuação, então quanto mais alto melhor.

image

Novamente, o silhouette score também não me deu uma resposta tão clara e bonita quanto a dos livros didáticos, mas repare, que a partir do ponto 4, a pontuação fica bem caótica, tendo picos e fundos sem sentido. Tendo isto dito, eu escolhi o K = 4, pois foi o momento de maior pontuação antes do gráfico ficar caótico.

Resultado

Após a clusterização do K-means, eu extrai as 14 palavras que mais aparecem em cada grupo, são elas:

0 : game, team, player, year, season, play, hockey, win, last, league, fan, good, would, think
1 : god, jesus, christian, one, would, people, bible, say, believe, church, faith, belief, know, think
2 : window, file, thanks, program, driver, anyone, card, know, please, email, use, graphic, image, using
3 : would, people, one, dont, think, like, get, know, right, gun, time, say, government, state

Se Prestarmos atenção, podemos perceber que:

  • "O grupo 1 contém palavras como "game", "player", "league", 'hockey', indicando uma associação com tópicos relacionados esportes."
  • "O grupo 2 contém palavras como "god", "jesus", "cristian", "bible", indicando uma associação com tópicos relacionados à religião."
  • "O grupo 3 contém palavras como "file", "program", "driver" e "card", indicando uma associação com tópicos relacionados à tecnologia e informática."
  • "O grupo 4 contém palavras como "right", "gun", "government", "state", indicando uma associação com tópicos relacionados à política."

Após isso eu renomeei os nomes para : sports, religion, technology e politics respectivamente. Realizei também a contagem das noticias em cada categoria de forma a checar a distribuição dos dados.

image

Principal Component Analysis(PCA)

A Análise de Componentes Principais ou Principal Component Analysis(PCA), é utilizada para visualizar os dados agrupados em um gráfico 2d. Isso ajuda a verificar a qualidade dos resultados do agrupamento além de oferecer uma visualização dos dados através de um gráfico de pontos, dessa forma, poderemos ver se o número de grupos K que escolhemos foi um bom agrupador.

image

Como podemos ver, k=4 parece separar bem as notícias de cada grupo, um resultado ruim seria por exemplo, as cores completamente desorganizadas sem nenhuma percepção de algum grupo.

Conclusão

O agrupamento de documentos com o K-means é uma técnica poderosa para organizar grandes conjuntos de dados de texto em grupos significativos. Este projeto demonstra todo o processo, desde a coleta de dados até a visualização, mostrando o valor da aprendizagem não supervisionada na análise de texto. As informações obtidas neste projeto podem ser inestimáveis para várias aplicações, como recomendação de conteúdo, recuperação de informações e modelagem de tópicos.

Como mencionado na introdução, este projeto é o resultado da síntese do meu estudo, podendo haver erros ou áreas de confusão, qualquer contribuição adicional, correções ou críticas construtivas serão bem vindas.

O código completo deste projeto encontra-se no meu portfolio: https://hugomilesi.github.io/posts/document-clusterization_nlp/

Autor: Hugo Milesi

Meu github: http://github.com/hugomilesi

Compartilhe
Comentários (0)