Mineração de Texto — Framework de Prospecção de Categorias



Original Source Here

Este artigo inaugura uma série de postagens sobre tópicos avançados em Mineração de Texto e Processamento de Linguagem Natural. Objetivo da série é apresentar como conceitos teóricos e abstratos podem ganhar vida prática no cotidiano de um cientista de dados.

INTRODUÇÃO

Onipresença. Com esta única palavra pode-se defender a importância de dados textuais. Texto está em todo lugar, desde redes sociais, descrições de produtos e feedback de usuário em e-commerces, chats, e-mails entre tantos outros.

No tocante à estrutura, um texto pode ser considerado um dado não estruturado, cujo as informações não são registradas em estruturas rígidas e previamente definidas, mas registradas livremente ao longo do texto, em idioma natural. Esta característica provoca a necessidade de técnicas de processamento e de mineração específicas, diferentes daquelas utilizadas em dados estruturados.

Esta série aborda diversas técnicas para extração de informação em dados textuais de maneira não supervisionada, especificamente neste artigo, apresenta-se, de maneira prática, o por mim denominado Framework de Prospecção de Categorias. Os artigos seguintes aprofundam-se nos aspectos metemáticos das técnicas de mineração de texto utilizadas no Framework.

FUNDAMENTOS ESSENCIAIS

Bag-of-Words

Considerando um arquivo de texto como uma cadeia de caracteres, é facil entender que um texto cru não pode ser utilizado diretamente como entrada para algoritmos de mineração de dados. É necessário algum tratamento que forneça uma representação numérica para os documentos de um corpus.

Para este propósito, utiliza-se normalmente a técnica Bag-of-Words (BOW) que consiste em representar cada documento como uma simples coleção de palavras chaves, ignorando qualquer ordem ou estrutura linguística. Essa noção de palavras chaves pode ser expandida naturalmente para N-gramas.

A partir do BOW e da definição e indexação de um vocabulário, pode-se montar uma Matriz de Frequência de Termos (TF, do inglês Term Frequency), que indica a frequência de uma palavra num documento. As normalizações TF-IDF e BM25 melhoram a representação TF, penalizando palavras mais comuns no corpus e dando maior relevância para as palavras características dos documentos.

Uma discussão que introduzo brevemente aqui, mas que será minuciosamente abordada no próximo artigo da série, é que, na minha visão, matrizes TF, TFIDF e afins não devem ser vistas como representações vetoriais, embora indicado por muito dos principais autores de Information Retrieval e Processamento de Linguagem Natural. Essas matrizes devem ser encaradas como simples representações em elementos discreto e totalmente distintos. Para gerar representações vetorias de documentos, deve ser aplicado algum modelo de tópico.

Modelagem de Tópicos

Pode-se definir Modelagem de Tópicos como um método de Mineração de Texto para representar documentos por soft-clusters de palavras (isto é, tópicos). Os documentos continuam sendo representados como matrizes, cujos valores representam os graus de associação dos documentos aos tópicos, que podem ser vistos como features.

Os tópicos são formados pela clusterização de palavras que tem como critério de similaridade a coocorrência em documentos. Pelo fato de que palavras que ocorrem juntas tendem a ser do mesmo assunto, os clusters formados são geralmente de palavras de uma mesma temática. Tais representações podem, e devem, ser tratadas como vetoriais, nas quais os tópicos são as dimensões.

Quando se fala em algoritmos de modelagem de tópicos, o Latent Dirichlet Allocation (LDA) é de longe o mais comentado e difundido, pelo fato de ter figurado o estado de arte da técnica por vários anos.

Semantic Non-Negative Weighted Alternative Least Square (SNN-WALS)

Como uma das principais contribuições da série, apresento o SNN-WALS um algoritimo de modelagem de tópicos que sempre superou os mais famosos em minhas aplicações de modelagem semântica.

Trata-se de uma versão adaptada do Weighted Alternative Least Square (WALS), consagrado método de fatoração de matrizes para filtragem colaborativa de sistemas de recomendação. Tal adaptação foi formulada pelo meu grande amigo David Pinto quando trabalhamos juntos num mesmo projeto.

O resultado é uma fatoração de matrizes não negativa com características bem diferentes das fatorações não negativas clássicas (esparsidade extremamente baixa é uma delas), surpreendendemente boa e de rápida execução. Para se ter uma noção, para centenas de milhares de documentos o algorítimo roda em cerca de 8 a 10 minutos, em um computador pessoal médio.

A implementação do SNN-WALS está disponivel no repositório do experimento e será melhor abordada nos artigos seguintes.

Clusterização Rígida:

Trata-se da atividade de agrupar instâncias de um conjuntos de dados segundo critérios de similaridade. Cada instância é atribuida a um único grupo (cluster). Um modelo de clusterização básico deve atender duas principais hipóteses:

  • Similaridade intra-cluster: instâncias de um mesmo cluster são similares entre si.
  • Dissimilaridade inter-cluster: instâncias de clusters distintos são dissimilares entre sí.
Clusterização Rígida — Distância Euclidiana como Critério de Similaridade. Fonte: Autor.

Considerando válidas as hipóteses apresentadas, a clusterização rígida de documentos deve fornecer um agrupamento segundo as categorias textuais do corpus.

Um problema que surge é que os principais algoritmos de clusterização rígida normalmente necessitam da representação dos dados em apaço vetorial euclideano. Como mencionado, os modelos de tópicos são muito úteis para isso.

Um cuidado que deve ser tomado aqui é em relação aos modelos de tópicos muito esparsos como LDA e NMF. Essa condição de alta esparsidade atribui os documentos fortemente a um único tópico, que como já mencionado é um soft-cluster. Nesses casos, a clusterização rígida não tem tanta flexibilidade para criar agrupamentos de maneira espontânea.

No caso especial do SNN-WALS, têm-sem, ao mesmo tempo, uma representação espacial semanticamente muito coerente e de baixíssima esparsidade, a combinação ideal para o Framework de Prospecção de Categorias.

Resumo dos Clusters

Uma vez realizada a clusterização, faz-se necessário avaliar cada um dos clusters para a identificação de categorias. Fazer isso a nível de instâncias é totalmente inviável, imagina abrir amostras de documentos de cada um dos clusters e conferir as categorias por seu conteúdo textual? Para isso trago uma técnica mais eficiente, baseada em palavras características.

Mais uma vez, se um cluster é um conjunto de documentos, e um documento é um conjunto de palavras, podemos dizer que um cluster é um superconjunto de palavras, composto pela união das palavras dos documentos. Dessa forma uma matriz Cluster x Palavras pode ser construída a partir da matriz de frequência de termos, onde cada valor representa a frequência das palavras (colunas) nos clusters (linhas). É uma matriz TF para os clusters.

A eficácia da abordagem se dá pelo fato de que o SNN-WALS fornece um espaço vetorial semanticamente coerente. Pela hipótese de similaridade intra-cluster, tem-se que as instâncias de cada cluster são similares semanticamente entre sí. Se são semanticamente similares, suas palavras tem forte relação entre sí.

Dessa maneira, avaliar as palavras mais frequentes nos clusters dá uma boa visão à respeito do conteúdo dos documentos, e isso eu posso confirmar após longas jornadas de observação empírica.

Uma evolução para a visualização de palavras mais frequêntes é a abordagem de relevância, que dá um peso maior para as palavras mais característica do cluster, penalizando as palavras mais genéricas. Fiz isso inspirado na índice de relevância de Sievert e Illvi (2014), como apresentado abaixo:

A aplicação de ambas abordagens é ilustrada na figura abaixo. Nota-se que as principais palavras de cada cluster são bem coerentes entre si e, aparentemente, fornecem uma boa visão do conteúdo de seus documentos.

O PROBLEMA DA CLASSIFICAÇÃO DE TEXTO

Já se deparou com a necessidade de extrair informação de uma grande massa de texto? E sobre a necessidade de classificar documentos dentro de um corpus extensivo?

Formalmente, a Classificação de Texto representa um problema clássico de NLP, cujo objetivo é atribuir categorias (rótulos ou tags) à unidades textuais dentro de uma massa textual. No caso, em específico, iremos tratar da classificação de documentos (unidade textual) dentro de um corpus (massa textual).

Este problema tem diversas aplicações práticas dentre algumas, análise de sentimento, detecção de spam, categorização de produtos em marketplaces, detecção de assuntos em redes sociais e categorização de notícias. Esta última aplicação é o alvo do experimento apresentado aqui.

A classificação de texto pode ser realizada de maneira manual ou automática. Com o crescimento da escala de utilização dos dados textuais, as técnicas de classificação automática crescem em importância, e sobre elas existem dois principais paradigmas: métodos baseados em regras e métodos baseados em machine learning (Minaee Et al., 2020).

Sendo o foco do presente artigo, os métodos baseados em machine learning, são, na maioria das aplicações, do domínio de aprendizado supervisionado, necessitando assim, de uma base de dados de treinamento previamente rotulada.

Partindo do início do problema, faz-se necessário não somente rotular os dados da base de treinamento, como também definir os rótulos. A definição de categorias pode naturalmente ser realizada com base no conhecimento do domínio da aplicação e do curpus.

Apesar disso, apresento aqui uma estratégia baseada em dados que é extremamente robusta, sobretudo em situações onde o corpus é totalmente desconhecido pelo analista. Essa estratégia é o que denomino por Framework de Prospecção de Categorias que, alinhando técnicas automatizadas e manuais, é bastante eficaz para o levantamento de categorias de documentos de um corpus definido.

A BIBLIOTECA TEXT MINING

Para facilitar a vida de quem for replicar o Framework completo, ou deseja aplicar apenas alguma das técnicas utilizadas nele, estou fornecendo uma simples biblioteca com implementação dos principais algoritmos mencionados e utilizados aqui.

O código completo da biblioteca estará disponível no repositório do experimento no meu github.

DATASET UTILIZADO

Para ilustrar os passos do Framework, foi utilizado o dataset News of the Brazilian Newspaper, que consiste em mais de 167.000 notícias da Folha de São Paulo.

Uma visão do dataset é apresentada abaixo, para mais informações, consultar sua página no kaggle.

O FRAMEWORK DE PROSPECÇÃO DE CATEGORIAS

O termo prospecção remonta aos estudos de jazidas de minerais como o petróleo, e trata-se como o conjunto de atividades que visa conhecer, detectar e estimar preliminarmente reservas de um mineral específico com técnicas não intrusivas, sem amostragem (aqui falo como Engenheiro de Petróleo).

Método Sísmico de Prospecção de Petróleo: uma espécie de diagnóstico de imagens das jazidas. Fonte: SCISNACK

Semelhantemente, o Framework de Prospecção de categorias visa conhecer, detectar e estimar preliminarmente as classes de documentos dentro de um corpus, utilizando técnicas automatizadas, sem necessidade de amostrar documentos e observá-los um a um (analogia à técnicas intrusivas). Ou seja, é uma metodologia de mineração de texto.

Sendo assim, o framework não visa recuperar todas as classes existentes, mas sim detectar grande parte delas, as que apresentam relevância quantitativa surgindo espontaneamente nos dados, e estimando-as previamente.

As etapas da prospecção de categorias são:

  1. Limpeza e Pré-Processamento de Texto
  2. Bag-of-Words
  3. Modelagem de Tópicos com SNN-WALS
  4. Clusterização de Busca Extensiva e de Busca Intensiva
  5. Resumo da Clusterizações
  6. Diagnóstico de Categorias

Limpeza e Pré-Processamento de Texto:

Antes da criação dos modelos de mineração faz-se necessário o tratamento prévio dos conjuntos de texto que, invariavelmente, são repletos de ruídos intrínsecos, sejam explícitos ou implícitos. Aqui apresento alguns dos principais pré-processamentos para ruídos explícitos, que foram aplicados no experimento:

  • Limpeza de HTML;
  • Remoção de Stopwords;
  • Remoção de Pontuação e Acentuação;
  • Remoção de Algarismos;
  • Transformação para caixa baixa.

Esses pré-processadores estão disponíveis na biblioteca Text Mining, e podem ser aplicados da seguinte maneira:

Nesse estágio você pode está se perguntando sobre a aplicação de Normalizadores de Palavras como Lematizador e Stemmer. E de fato, estas técnicas podem ser muito úteis em alguns cenários. Todavia, a normalização de palavras implica na perda de informação que pode ser útil em muitas aplicações, como geralmente é nas atividades de mineração de texto.

A conveniência desses normalizadores de palavras deve ser considerada de acordo com a atividade de mineração a ser realizada, tamanho do corpus, tamanho do vocabulário, e características linguísticas do corpus no tocante à importância da flexão de palavras. No contexto do Português Brasileiro, onde a flexão de grau é muito comum na linguagem informal, diversas situações críticas são muito comuns. Como exemplo:

  • Calça, calcinha, calção: ‘gênero’ de substantivo representado como grau.
  • Santa, santinha: ironia, provocando inversão total de sentido.

Finalmente, em atividades de mineração baseadas em modelagem de tópicos, não vejo valor da Lematização e do Stemmer, exceto se houver uma enorme necessidade de reduzir tamanho do vocabulário. Este assunto pode ser tema de um novo artigo, mas se quiser avaliar um pouco do efeito, siga esses passos:

  • Cria qualquer tipo de representação vetorial de palavras sem a normalização (word embeddings, modelagem de tópicos…);
  • Aplica a normalização no vocabulário completo;
  • Verificar os radicais cujo os derivados apresentam maior distância entre-si;

Olha inicialmente para Calça, Santa e suas flexões no espaço de palavras e entenda o que eu estou falando!!!

Bag-of-Words:

O segundo passo nada mais é que a aplicação direta do BOW para criação das matrizes TF e TFIDF pelo Scikit Learn, como representado no código: O Framework de Prospecção de Categorias

Segundo minha experiência, para as atividades de mineração baseadas em modelagem de tópicos, trabalhar com unigramas é a melhor opção por diversos fatores: melhor interpretabilidade, menor custo computacional e melhor correspondência para os modelos de coocorrência dos tópicos (bigramas e seus unigramas formadores são uma coocorrência em documentos falsa).

Modelagem de Tópicos com SNN-WALS

A terceira etapa é o coração do Framework, a modelagem de tópicos com SNN-WALS. Fazer isso com a Text_Mining é extremamente simples e rápido, com uma único comando.

Sobre os principais parâmetros:

  • A matriz a ser fatorada (X): embora os modelos de tópicos sejam elaborados com base numa matriz de frequência de termos, na maioria das vezes obtive melhores resultados com TFIDF e BM25.
  • Número de Fatores Latentes (n_componentes): sigo o padrão para modelagem de tópicos, 100 ou 300 componentes. Para a atual aplicação que tem um corpus de tamanho já razoável, utilizo 300 componentes.

Clusterização de Busca Extensiva e de Busca Intensiva:

Após realizada a modelagem de tópicos que fornece boas representações vetoriais dos documentos, pode-se seguir para a principal fase do framework, as clusterizações rígidas de busca extensiva e de busca intensiva.

Ambas as clusterizações são realizadas com o Spherical Kmeans da Faiss [1], e diferem apenas no número de clusters utilizados.

Clusterização de Busca Extensiva:

Também denominada clusterização de busca rápida, tem o objetivo de fornecer uma visualização geral das possíveis categorias de documentos, a partir da observação individual de cada cluster. Portanto, deve ser definido um número razoável de centróides com os quais é possível separar as principais regiões categóricas do corpus, sem consumir muito tempo de observação.

Clusterização de Busca Intensiva:

Trata-se de uma clusterização mais específica em relação à clusterização de busca extensiva. Os clusters não mais serão observados em sua totalidade, mas agora utilizados como consulta a partir dos clusters de busca extensiva, por palavras chaves ou por instâncias específicas. Representa uma clusterização de maior qualidade, com clusters mais puros.

Escolhendo o Número de Centróides:

A definição do número de clusters é extremamente dependente do corpus, e deve ser definida empiricamente. Características como número de documentos, abrangência semântica, e número médio de palavras dos documentos do corpus são dominantes para a escolha.

Como orientação, pode ser tomado como base:

  • Busca Extensiva: uma taxa centróides/documentos entre 1/2000 e 1/4000, com um número de clusters limitado entre 50 e 300.
  • Busca Intensiva: o número de centróides deve ser de 3 a 6 vezes o número de centróides da clusterização extensiva.

Tais valores são boas referências para as condições de aplicação onde a técnica deve ser aplicada: diversidade de categorias e corpus com pelo menos de 100.000 documentos. Vale a pena ressaltar que a técnica melhora ao passo que o número de documentos aumenta.

É bom manter em mente que uma boa clusterização de busca extensiva permite observar uma taxa razoável de categorias distintas entre si. Se forem observadas muitas repetições de classes, onde o número de categorias distintas seja menor do que 1/3 do número de clusters, o número de centróides deve ser diminuído, do contrário, se mais o número de categorias distintas for superior à 2/3 do número de clusters, aumente o número de clusters e observe novamente.

Para o dataset escolhido, defini o número de 50 centróides para clusterização extensiva, onde o número de categorias distintas foi de 50%. Para a clusterização intensiva, tomei 200 centróides.

Resumo de Clusters:

Após definidas as clusterizações, deve se proceder com os resumos dos clusters. Fazer isso com a Lib Text Mining é muito simples:

A função TopicClustering.view_topics fornece uma tupla com dois objetos, o primeiro deles um dataframe com as primeiras n palavras (parâmetro n_top_words) ranqueadas para cada cluster indexado nas colunas. Esse dataframe é apresentado abaixo utilizando a fórmula de relevância com parâmetro lambda = 0.5, que por sempre ser utilizado em todas as minhas últimas aplicações, defini como padrão na lib.

O segundo objeto retornado é uma série pandas com uma string que contém as top5 palavras concatenadas do cluster, separadas por uma barra. No dataframe abaixo eu apresento as duas séries para o problema em questão, utilizando a formulação de peso e de relevância. Observe que a segunda coluna concatena exatamente as 5 primeiras palavras do dataframe anterior.

Diagnóstico de Categorias

O diagnóstico é a última e mais trabalhosa etapa do framework, justamente por ser a única que não é passível de automatização, trata-se da extração manual de informação a partir dos resultados das técnicas automáticas de mineração de texto.

A primeira fase do diagnóstico é a atribuição de categorias a todos os clusters de busca extensiva a partir das 5 palavras mais importantes. Vale a pena realizar a rotulação em assunto (categoria) principal e assunto secundário. A forma mais eficiente que vejo de realizar a clusterização é com uma simples planilha, como ilustrado abaixo. A planilha completa pode ser vista no link.

Após a rotulação prévia, deve ser realizada uma curadoria sobre todos os assuntos coletados, para realização do primeiro esboço do conjunto de rótulos. Para o dataset de notícias, ao todo foram definidos 25 rótulos distintos para assunto principal, o que representa 50% do total de clusters. Os assuntos distintos são:

Nessa etapa vale a pena conferir também, as características básicas para cada um dos assuntos coletados, tais como, número de instâncias, número de clusters, números de assuntos secundários distintos, e ainda incorporar possíveis métricas de negócios, como exemplo, número de visualizações, número de páginas curtidas.

Essas informações podem ser obtidas utilizados funções de agregação, da seguinte maneira:

A agregação forneceu o seguinte resultado:

Pode-se notar que o assunto principal mais repetido em clusters foi o de esportes, que foi rotulado com 6 assuntos secundários distintos. Dada a importância e diferenciação do assunto em relação aos demais, naturalmente pode ser considerado como uma categoria.

Para entender um pouco mais sobre o assunto, vale a pena conferir cada um dos clusters retornados para entender os assuntos secundários:

Nota-se que houve uma pequena separação de categorias esportivas, tem-se futebol, esportes olímpicos e esportes gerais reunidos. Uma separação mais fina ocorreu com o cluster 40, específico para o São Paulo Futebol Clube.

Esse é justamente o comportamento esperado da clusterização de busca extensiva que tem o objetivo de pegar as categorias mais gerais, sem muita especificação.

Para uma maior e melhor especificação do assunto esportes, utiliza-se a clusterização de busca intensiva. Nesse ponto não é necessário rotular cada um dos clusters, mas por se tratar de um número pequeno resolvi taguear cada um deles por fins didáticos (nas minhas aplicações práticas utilizo geralmente para clusterização extensiva e intensiva 200 e 1000 clusters).

Observando os principais assuntos da clusterização intensiva com o foco para esportes:

Pode ser visto que a clusterização intensiva seguiu o comportamento esperado: uma especificação muito grande de assuntos. 24 dos 200 clusters são rotulados como do assunto esportes, dos quais emergem 21 assuntos secundários distintos, o que parece ser bem razoável quando observado:

Como mencionado, a rotulação total dos assuntos da clusterização intensiva é custosa, o mais adequado é fazer uma consulta a partir dos clusters de esportes da clusterização extensiva.

Buscando somente os documentos atribuídos aos clusters extensivos rotulados como esportes, vê-se a seguinte distribuição de clusters de busca intensiva:

AI/ML

Trending AI/ML Article Identified & Digested via Granola by Ramsey Elbasheer; a Machine-Driven RSS Bot

%d bloggers like this: