top of page

Python na Veia: Domine Dados Caóticos com Facilidade, PDFs

  • Foto do escritor: Roger Sampaio
    Roger Sampaio
  • 7 de mar.
  • 5 min de leitura

Atualizado: 8 de mar.

Olá meus guerreiros. Espero que estejam bem, estou escrevendo esse artigo em pleno 'sextouuuuu', porque realmente acredito que o conhecimento transforma a vida das pessoas assim como tem acontecido comigo. Bem, o Python é bem versátil no sentindo que conta com uma série de bibliotecas e pacotes úteis para análise de dados, incluindo a extração deles seja em documentos, planilhas, sites da web entre outros. Como digo sempre: 'Python é pau para toda obra', por esse motivo é a linguagem de programação mais usada quando o assunto é 'dados'. Uma situação bastante rotineira e comum é extrair texto de arquivos no formato PDF e aqui começa a brincadeira. Apertem os cintos porque vamos decolar.

  1. Um marcenal de ferramentas


Para a tarefa de processamento de documentos PDFs, existem diversas bibliotecas disponíveis e o melhor: open-source, ou seja, 0800, não paga nada por isso. Certamente usará a melhor que te atenda, cada um com prós e contras, alguns exemplos são: 1. PyPDF2, 2. PdfPlumber, 3. PyMuPDF(fitz), 4. ReportLab, 5. PDFMiner, 6. Slate, 7. pikepdf. Para conhecer qualquer uma delas basta pesquisar a documentação oficial dela usando o provedor Google. Se, por exemplo, quisermos saber mais detalhes da PyPDF2, poderíamos pesquisar no Google pip install PyPDF2 o primeiro site(pypi) ensina como instalar o pacote e fornece mais detalhes.

Acessando o site do pypi podemos conferir a versão atual da biblioteca, autor, instruções de instalação e uso de maneira simples e direta. Há quem não goste do Python, hein? Difícil.


Para fins de experimentação usaremos o PyMuPDF, que está na versão 1.25.3, desenvolvido por Artifex, pacote que oferece recursos avançados incluindo leitura de texto, imagens, metadados de arquivos PDF. Oferece também suporte a PDFs, XPS e outros formatos. Guerreiro, suponha que você seja contratado como Cientista de Dados para criar uma aplicação de gestão de documentos. Entre algumas funcionalidades presentes na aplicação, está a análise de documentos PDFs. Alguns documentos PDFs foram baixados na máquina, diretamente do repositório da Biblioteca Digital Brasileira de Teses e Dissertações (BDTD), necessitamos extrair o conteúdo textual de cada um deles. Trabalharemos com seis artigos sobre Machine Learning. Usaremos o ambiente de desenvolvimento GoogleColab.

  1. Brincando com o PyMuPDF

O primeiro passo é a instalação do pacote caso ainda não tenha. Rode as células abaixo: a primeira instala a biblioteca, a segunda verifica se realmente foi instalado mostrando a versão.

Segundo, iremos importar as bibliotecas que usaremos e definiremos a função que fará a leitura do pdf dado um arquivo. Posteriormente detalhemos o passo a passo dela.

Conectaremos ao googledrive usando a função driver.mount( ), visto que os arquivos estão nele na pasta pdfs. A ideia é criar uma lista com o nome de todos os arquivos presentes, comportamento observado pela função os.listdir( ), que conforme o próprio nome sugere, lista tudo que está em um diretório. Mostraremos a quantidade de arquivos encontrados através da impressão do tamanho da lista. Observe que temos 6 arquivos.

Então precisamos percorrer a lista de arquivos e para cada um chamar a nossa função de leitura de pdf. Criamos uma lista vazia e para cada arquivo processado, adicionaremos na lista usando dois atributos: nome do arquivo e o texto propriamente dito. Depois do encerramento do for, ou seja, percorrer todos os arquivos, criamos uma dataframe com o resultado da lista. Por fim mostraremos as cinco primeiras linhas do dataframe e também a quantidade de artigos processados.

Guerreiro, agora mergulharemos na função que processa pdf, o nosso principal objetivo desse post. Caso você tenha se perdido até agora, sugiro aprender bem Python, o nosso canal do youtuube tem um curso completo e 0800 que ensina. Não se desespere!

O primeiro passo é abrir o arquivo através de fitz.open( ). A variável doc que está recebendo o retorno da função, é um objeto da classe fitz.Document. Existem vários métodos e atributos de fitz.Document que podem ser úteis tais como:

1. get_text( ). Extrai todo o texto de uma página ou documento inteiro.

2. page_count. Retorna o número de página do documento.

3. get_page_text(page_num). Retorna o texto de uma página.

4. close( ). Fecha a referência para o arquivo liberando recursos na máquina.

5. doc.metadata. Extrai os metadados do pdf como, por exemplo, autor, título, assunto, retornando em um formato de dicionário. Há mais opções para extração de imagem, OCR entre outras. Consulte a documentação oficial.

Então lemos todas as páginas e extraímos o texto usando o comando pagina.get_text( ). Caso a variável texto não estiver vazia, significa que nosso arquivo tem conteúdo, logo retornamos ele. Caso contrário, retornamos a mensagem "INVALIDO_NAO_PESQUISAVEL". Durante o processamento do pdf poderá ocorrer erros em tempo de execução como, por exemplo, arquivo do pdf corrompido ou qualquer outro motivo. Se ocorrer uma exceção, retornamos a mensagem "INVALIDO", mostrando também o erro. Por fim, independente do êxito ou não ao processar o arquivo, fecharemos com o comando doc.close( ).

Guerreiro, para realmente conferir se todo o conteúdo está sendo extraído corretamente, iremos exibir por completo o texto da primeira linha e contaremos a quantidade de palavras. Uma boa prática usada para validação de resultados é utilização de uma amostra, seguindo o mesmo princípio da Estatística. Não precisamos verificar artigo por artigo (imagine meu guerreiro o quão oneroso seria), podemos selecionar entre três a cinco, seja selecionados das primeiras ou últimas linhas ou aleatórias.

Observe que o primeiro artigo tem 568.933 palavras. Quando trabalhamos com textos, a essência da área de Processamento de Linguagem Natural (NPL), é comum algumas estatísticas como, por exemplo: número de palavras, quantidade média de palavras. Veja o cálculo abaixo para cada linha, ou seja, artigo:

Temos um total de 216.006 palavras, distribuídas entre 6 artigos. O artigo que mais possui palavras, ou seja, o maior, tem 86.656. Os artigos tem em média um total de 36.001 palavras. Veja as estatísticas contabilizadas e um gráfico que representa a distribuição de palavras.

Iremos salvar o dataframe final reorganizando ele. Primeiramente iremos criar uma coluna 'endereco_artigo' para guardar o caminho completo do artigo usando como referência a coluna artigo, depois extrairemos apenas o nome do artigo para armazenar na variável 'artigo'.

  1. Considerações Finais


Embora no decorrer do artigo tenhamos enfatizar a biblioteca PyMuPDF, poderíamos utilizar qualquer uma que tenha habilidade de manipular o PDF. Não recomenda-se decorar nome de funções, visto que pode mudar entre as bibliotecas e não costuma ser produtivo para o aprendizado. A biblioteca PyMuPDF decidiu adotar o nome 'open' para abrir pdfs, mas poderia ser também open_file, read entre outras opções. Guerreiro, a documentação é SUA AMIGA! Todas as vezes que precisar utilizar uma biblioteca nova, utilize a documentação para tirar todas as suas dúvidas incluindo também o chatGPT. O ponto principal é saber programar compreendendo muito bem os conceitos de funções, parâmetros, retornos. Caso ainda tenha dúvidas sobre esse assunto explore de maneira gratuito uma aula inteira no youtube.

O Python é a linguagem de programação mais utilizada pelos programadores quando tratamos de Ciência de Dados, e um dos principais motivos é a versatilidade, existem milhares de bibliotecas externas criados mensalmente pela comunidade técnica, incluindo pacotes para manipulação dos arquivos PDF como, por exemplo, o PyMUPDF. Ela é uma biblioteca simples de compreender, fácil de implantar e extremamente poderosa conforme vimos nos exemplos acima.

O Git de aula está aqui. Beijos no coração e até mais.








Comments


bottom of page