Manipulando Dados Não Estruturados com R



Trabalhando com Dados não estruturados - Texto

Nem todos os conjuntos de dados necessários para realizar determinada análise estatística estão disponíveis em forma estruturada. 

O processamento de texto pertence a uma área da inteligência artificial chamada Processamento de Linguagem Natural (PLN). É um campo da ciência de dados em expansão devido ao aumento de nossas necessidades de interações com as máquinas (e softwares) de maneira amigável, como, por exemplo, a Siri do Iphone, ou o comando de voz OK Google – ambos são programas de interação por voz que contêm algoritmos de PLN.
A pergunta que não quer calar: Como pegar um texto e fazer a máquina entender o seu conteúdo?
Para responder a essa pergunta devemos entender que, por muito que um algoritmo de PLN seja sofisticado, ele não conseguem entender uma entrada de texto "cru", como este que estou escrevendo.
Quando nos referimos a texto "cru", é porque é necessário um pré-processamento do texto , para passarmos o algoritmo e assim criar um data set.

Coletar os Dados

A forma mais comum de uso da PLN é na captura de dados no Twitter ( os tweets ) porém, nem sempre termos os dados assim tão fáceis de coletar, como é o caso de dados estatísticos ou econômicos que geralmente são disponibilizados pelo Governo Federal em formato de relatórios de PDF.

Para trabalhar com arquivos PDF, o R disponibiliza o pacote “pdftools”. A partir desse ponto, iremos usar também os pacotes: “stringr”, “dplyr”, “NLP”, “tm”,“wordcloud”, “RColorBrewer”, “ggplot2”. 

Usamos para este exercício, um exemplo comumente utilizado em diversas faculdades e cursos de Data Science, que é através de um estudo realizado pela OXFAM Brasil, com o nome "nós e as desigualdades", que pode ser encontrado no site da mesma: https://oxfam.org.br/.
O objetivo principal será a utilização do pré-processamento de texto para
saber a frequência de determinadas palavras em um documento, fazer uma nuvem
de palavras e gráfico de barras.

Manipulando os Dados

Ao importar um arquivo PDF, devemos ter em atenção que o RStudio não tem nenhuma possibilidade de importar de forma automática o arquivo, dessa forma é necessário criar um objeto e apontar os caminhos do arquivo PDF, como foi efetuado no objeto "arquivo_pdf".

Após a criação do objeto que chama arquivo PDF, utilizamos a função "pdf_text()" para extrair o conteúdo do PDF em arquivo ".txt" e alocamos o mesmo em outro objeto, neste caso o "pdf_obj".

Lembrando que a saída da função "pdf_text" é um vetor do tipo "charater" em que casa posição do vetor corresponde a uma página do documento, assim se existir a necessidade de trabalhar somente com os dados de uma referida página, realizar busca de palavras , etc,  basta indicar qual o índice do vetor
 Após esse passo, utilizamos a função "cat()" para visualizar o valor do objeto de "pdf_obj" em forma de texto, livre da estrutura de vetor.




Em seguida vamos proceder á extração do texto da cada índice do vetor que não está em branco (" ") ou nulo, e colocar tudo num objeto String, para podermos assim manipular os dados em um único nível de hierarquia.

Após isso criaremos um laço de repetição "For", contendo uma condição para que se a posição i do vetor não estiver nula, será concatenado o seu valor no objeto "dados_texto", para isso usamos a função "paste()" onde é necessário indicar como irá ser separada a String, e neste caso usamo o símbolo de quebra de linha "\n".



Agora vamos iniciar a manipulação do texto, para tal necessitamos de inicialmente separa cada linha do texto em uma posição do vetor, embora pareça estranho juntar as páginas para depois separar as linhas, mas tal procedimento permitirá uma maior facilidade de buscas por palavras chave e termos.

Utilizamos a função "str_split()" para quebrar uma string, passando para ela o objeto e o critério de separação que será "\n", resultando numa lista em que cada posição será uma "pedaço" da string.

O próximo código foi dividido em 3 blocos, para realizar a quebra da String em linhas, após a conversão do vetor em data frame e a exclusão das linhas em branco.
O 3 blocos de código seguem as recomendações para manipulação de dados do pacote "dplyr", utilizando o operador "%>%", as funções "select()" e "filter()".
No segundo bloco usamos a função "as_data_frame()" para transformar o vetor em objeto data frame e após passar as funções "select()" e "filter()" o mesmo para a ser um Tibble.


Pré - Processamento de texto

Uma vez terminada a manipulação do arquivo de texto, será iniciada a fase de pré-processamento do texto, onde iremos retirar do texto aquilo que é considerado sujeira ou ruído, como por exemplo, mascações, "\n", "\r", "\t".

Utilizamos a função "corpus" que permite transformar o data frame em um vetor, contendo os metadados necessários para as funções da limpeza do texto.
Com o uso da função "inspect()", mostramos o conteúdo do texto salvo na estrutura do objeto "corpo_texto". Terminamos com a função 'tm_map()" onde começamos a a deixar todas as palavras em letras minusculas, remoção de pontuação e de números.



No próximo passo, vamos remover as chamadas "StopWords", ou seja palavras irrelevantes como os conectores: e, a, as, de, entre outras. Sempre que se procede á remoção das "StopWords" é necessário indicar o idioma.

Uma vez removidas as palavras, procedemos á redução de palavras em seu radical, por exemplo: empregado, emprego, empregador, todas as palavras possuem o radical "empreg" e são relacionadas ao mesmo assunto.
Não é uma fase obrigatória na contagem de palavras, mas pode ser útil e culminar num resultado interessante ao agrupar palavras com o mesmo radical.

Seguidamente procedemos ao cálculo da frequência das palavras com a utilização da função "TermDocumentoMatrix()", onde será passado o objeto "corpo_texto" e montada uma matriz de frequência, para poder visualizar essa matriz num primeiro momento é necessária a utilização da função "inspect()", contudo basta converter para uma matriz com a função "as_matrix()".


Visualização

A primeira visualização a ser realizada é a nuvem de palavras, que é uma representação gráfica contendo os termos mais relevantes da lista, relacionando o tamanho da palavras com a sua frequência, quanto maior, mais frequente.

Para tal realizamos 3 blocos de código referentes á contagem dos termos da matriz de palavras "matriz", á transformação dessa contagem em um data frame e à criação de duas nuvens de palavras, uma sequencial e outra com valores aleatórios

Devido á necessidade de conversão da matriz de palavras do objeto "corpo_texto" para uma matiz convencional, perdemos o agrupamento automático que a função "corpus()" realiza, necessitando assim de efetuar esse calculo manualmente.




Após a utilização da função "wordclound()" para podermos gerar as nuvens de palavras, a mesma contem os temos com frequência minima de 10 palavras, porem na segunda opção de layout, colocamos os parâmetros "rot.per=0.3", que diminuiu a quantidade de palavras e a forma como se organizam.


Vamos agora fazer um gráfico de barras contendo as 10 palavras mais usadas no documento, para tal usaremos o  famoso "ggplot2'. A primeira coisa a ser feita é a organização da base de dados de maneira a facilitar a plotagem do gráfico para que passe a mensagem desejada.

Devido ao fato da contagem para a nuvem de palavras ter passado por algumas funções especificas de mineração de texto, ainda assim para o ggplo2, continua tendo alguns ruídos, por isso é foi necessário criar um data frame chamado de "base_de_dados" e depois selecionar as 10 primeiras linhas.



Na próxima imagem podemos ver o resultado do gráfico de barras, que possui um fato interessante: a segunda palavra mais usual foi o sinal de travessão, além da presença de aspas. Logo, está faltando algum passo no pre-processamento, para evitar essa sujeira remanescente.

Apesar de poder verificar esse problema durante todo o processo, quando visualizamos os dados no corpus, ou na matriz de frequência, deixamos esse detalhe de lado, pois pretendíamos mostrar que esse tipo de coisa pode ocorrer, mesmo quando tomamos todo o cuidado no trabalho com texto.

Indicamos voltar ao passo a passo do corpus e remover os sinais errados e reprocessar o resto do script. Será um treino de criação de base de dados por conjunto de dados não estruturado.


Esperamos que tenha gostado e que este artigo possa ser ferramenta de estudo e aplicação para todos no seu dia a dia como Cientista de Dados.


Obrigado e não esqueçam de deixar vosso comentário e opinião"

Bons estudos!!

Referências

CRAN. The Comprehensive R Archive Network. 
Site: <https://cran.r-project.org>. Acesso em: 05/2019.

DA SILVA, L. A.; PERES, S. M.; BOSCARIOLI, C. Introdução à mineração de dados: com aplicações em R. Elsevier Editora LTDA, Rio de Janeiro, Brasil, 2017.

ESTATISTIC BERKELEY, Department of Statistic Berkeley. Factors in R. Disponível em: <https://www.stat.berkeley.edu/~s133/factors.html>. Acesso em: 06/2019.

FERREIRA, E.; LISBOA, W. Introdução ao R. Disponível em: 

OLIVEIRA, P. F. de; GUERRA, S.; MCDONNEL, R. Ciência de Dados com R – Introdução. Brasília: IBPAD, 2018. Disponível em: 

WICKHAM, H. R for Data Science. O’Reilly, 2017. Disponível em <https://r4ds.had.co.nz>

WICKHAM, H. Advanced R Syle Guide. Site: < http://adv-r.had.co.nz/Style.html >.Acesso em: 05/2019.

YIN, R. K. Estudo de Caso: Planejamento e métodos. Bookman Editora LTDA,
Porto Alegre, Brasil, 2015.








Comentários

Postagens mais visitadas deste blog

Tutorial de Machine Learning com Python - Iniciantes - Parte 1

Regressão Múltipla com R

Tutorial de Machine Learning com Python - Iniciantes - Parte 2