Python na Veia: Domine Dados Caóticos com Facilidade, documentos (.docx,doc e odt) Parte 1-2
- Roger Sampaio
- 10 de mai.
- 7 min de leitura
Olá meus guerreiros. Uma fonte de dados bastante rica e utilizada são os documentos de texto, os quais podem ser facilmente abertos em aplicativos Microsoft Word ou Libre Office. Entre alguns exemplos de documentos podemos ter: trabalhos escolares ou universitários, resumos de algum tema, currículos, relatórios corporativos, ata de reunião entre outros. Dependendo do propósito da construção da solução de inteligência artificial, eles podem ser bastante valiosos e torna-se necessária a extração e manipulação de texto deles. Exemplo: construção de um aplicativo que traduza dissertações entre idiomas. E agora, meu guerreiro, o que faremos? A boa notícia é que a famosa linguagem de programação Python, bastante conhecida pela versatilidade, conta também com bibliotecas para essa situação. Prepara-se, aperte os cintos porque viajaremos juntos.

Explorando ferramentas
As extensões mais famosas de documentos textos são doc, docx e odt, as duas primeiras reconhecidas pelo Microsoft Word e a última usada pelo Libre Office. Algumas bibliotecas Python disponíveis na comunidade do pip para manipular esses documentos são: 1. python-docx, 2. textract, 3.odtpy. Com esse artigo focaremos principalmente na etapa de extração, especificamente textos; uma vez extraídos podemos expandir as funcionalidades da solução como, por exemplo, geração de relatórios, treinar algum modelo LLM. Os documentos textuais são enquadrados na categoria dados semiestruturados, ou seja, possuem alguma organização interna (títulos, parágrafos, tabelas, ...), porém não seguem um esquema rígido e padronizado como os bancos de dados relacionais. A manipulação desses dados torna mais desafiadora comparado com os dados estruturados, consequentemente a escolha de uma boa ferramenta de extração faz toda a diferença.
Guerreiro, trabalharemos com três documentos no decorrer do artigo. O primeiro é um resumo explicativo sobre Inteligência Artificial, está na extensão docx. O segundo trata-se de uma receita de estrogonofe de carne e está no formato .doc. Por fim o último é um trabalho acadêmico sobre tuberculose e está na extensão odt. Para cada tipo de documento exploraremos uma biblioteca diferente conforme mencionado acima, a intenção é mostras as muitas possibilidades de executar a tarefa. Visualizando brevemente os documentos, temos:



A estrutura dos documentos variam, sendo alguns puramente textuais, outros contendo imagens, tabelas, o que aumenta exponencialmente o desafio da extração e propositalmente simulamos o mundo real. Utilizaremos o ambiente do Microsoft Azure Machine Learning, um serviço do Azure que contempla todo o marcenal de recursos, ferramentas para desenvolvimento de projetos de Ciência de Dados incluindo: criação de cluster de computação ou máquinas virtuais únicas, execução de experimentos, utilização de jupyters notebooks seja na linguagem R ou Python. É obrigatório ter uma conta ativa no Azure, caso ainda não possua, crie utilizando o portal da Microsoft. Após a conta estar ativa, acesse o portal inicial do Azure. Crie o ambiente seguindo o passo 2 descrito em detalhes nesse artigo, exceto o tópico ''Subindo os arquivos de notebook e bases''. O git da aula está aqui.
3. Lendo e escrevendo nos documentos
Inicialmente vamos alterar o Kernel para AzureML, que tem uma série de pacotes úteis para Machine Learning e facilita a instalação de pacotes adicionais.

Agora devemos instalar as três bibliotecas. Para isso, basta executar o comando pip install <nome_pacote>. Mostraremos também a versão que está sendo instalada no momento que esse artigo é escrito, constantemente são realizados upgrades em pacotes do pip. Posteriormente a instalação devemos importar os pacotes para a utilização.

Há diversas maneiras de mostrar as versões dos pacotes: utilizando o pip show <nome_pacote> ou então importlib.metadata. O primeiro comando é utilizado dentro do terminal e mostra diversas informações sobre o pacote tais como nome, versão, resumo, autor. O segundo, introduzido a partir do Python 3.8, serve para mostrar também os metadados de um pacote como, por exemplo, a versão, porém é usado dentro do script Python. Quando quiser executar um comando de terminal dentro de uma célula no notebook basta utilizar a exclamação seguido do comando !<algum_comando>.


Observe acima as versões usadas em cada um dos pacotes. Agora criaremos uma pasta chamada "bases" e faremos upload dos três documentos de exemplos: 1. artigo, 2. receita e 3. trabalho acadêmico. Explore as opções "Criar pasta" e "Carregar arquivos".

Guerreiro, vamos ler o primeiro documento (o artigo) através da biblioteca do python-docx. Essa biblioteca suporta somente o formato docx, diferente da biblioteca textract que suporta doc, docx incluindo pdf. Perceba que criamos um objeto do tipo Document, o qual especificamos o caminho para o arquivo docx. Uma vez o arquivo carregado na memória através do objeto Document, podemos iniciar a manipulação como, por exemplo, ler e exibir todos os parágrafos através do atributo paragraphs. Perceba que os parágrafos exibidos correspondem aos listados nos documentos.

Uma boa prática em construção de aplicativos é o tratamento de erros e exceções que podem ocorrer em tempo de execução. O instanciamento do objeto Document pode falhar por diversos motivos como, por exemplo, caso o caminho do arquivo esteja inválido, lançará um exceção do tipo 'FileNot Found(Arquivo Não Encontrado)'. Construiremos uma lógica para lidar com a situação de maneira que somente processará o arquivo caso não ocorra erros. Embora estejamos essa lógica de leitura de arquivo em uma célula do notebook, é recomendável criar uma função generalista, que abrirá um arquivo de documento,


Guerreiro, almejo que realmente você aprenda e não apenas ficar reutilizando e decorando os códigos no decorrer do artigo. Meu propósito é transmitir um bom conhecimento para que você caminhe com suas próprias pernas. Embora no decorrer do artigo, exploraremos as funcionalidades mas utilizadas das bibliotecas, não se restrinja somente a elas. Decorar não costuma ser proveitoso, uma vez que elas podem mudar a cada versão lançada e são muitas opções de customização. Escreva na parede do seu quarto e leia todos os dias: a documentação é nossa amiga. Engana-se quem pensa que um programador sabe especificamente o nome de todas as funcionalidades das bibliotecas, ao contrário, ele sabe como utilizar quando necessário. Caso queira conhecer mais detalhes de um objeto em específico pode utilizar a função help. Ela mostrará todas os atributos, métodos, parâmetros disponíveis para uso fornecendo inclusive exemplos.

Podemos pesquisar no próprio site do pip a biblioteca. Interprete a documentação como uma espécie de manual e as bibliotecas sendo ferramentas.


Caso queiramos adicionar parágrafos no documento aberto, basta usar o método add_paragraph(<texto>), especificando o texto. O parágrafo será adicionado ao final do documento, porém é possível alterar esse comportamento, relatando exatamente o ponto e a localização no documento. Contabilizaremos a quantidade de parágrafos antes e após a adição desse último parágrafo e por fim mostramos o último parágrafo.


Uma opção comum é a adição de imagens no documento, o que facilmente pode ser realizado através do método add_picture(<caminho_imagem>). Antes de acrescentar ao documento, visualizaremos brevemente a imagem. A imagem será acrescentada ao final no documento. Há opções de customização como, por exemplo, definição de largura, altura na chamada da função caso queira utilizar. Salvaremos como um novo documento chamado o_que_ia_2.


Efetuando download do arquivo novo, percebemos que a imagem foi acrescentada ao final do documento. Para adicionar tabelas ao documento podemos utilizar o método add_tables( ). Guerreiro, programa em Python é como escrever uma carta em inglês ao computador, observe que o nome do próprio método é bem sugestivo ao que ele se propõe a fazer. Antes de acrescentar a tabela, verificaremos se existem tabelas através do atributo doc.tables. Caso não exista uma mensagem informativa é retornado, caso contrário exibe cada tabela.

Importante ressaltar que o acréscimo de elementos na tabela é matricial, ou seja, no método tabela.cell(i,j) devemos especificar sempre a linha(elemento i) e coluna (elemento j). Devemos obrigatoriamente criar o formato, estrutura da tabela especificando a quantidade de linhas e colunas para depois inserir os valores. Para fins experimentais, inseriremos um texto simples.


Salvando o documento, notaremos a presença dos três últimos elementos adicionados: o parágrafo, a imagem e por fim a tabela.


Uma maneira mais simples de criar tabelas é através de dataframes, ou seja, criamos o dataframe e posteriormente convertemos para o objeto do tipo tabela (Table). Para os dataframes, há métodos mais simples, que não requerem a manipulação direta de índices de linhas e colunas como acontece em matrizes. Criaremos um dataframe que explicará alguns conceitos de Inteligência Artificial. O dataframe terá duas colunas: termo, significado. Inseriremos alguns exemplos.



Veja que após o salvamento do arquivo, a nova tabela aparece.

E no Final das Contas ...
Guerreiro, para o artigo não fica oneroso e grande, continuaremos em outro post. O Python é como uma verdadeiro canivete suíço com mil e uma utilidades incluindo a manipulação de documentos textuais nos mais variados formatos. A biblioteca python-docx é poderosa para lidar com arquivos no formato docx, versão dos arquivos desde Microsoft Office Word 2007, possuindo uma série de métodos uteis para acrescentar parágrafos, tabelas, imagens, efetuar a leitura, salvar entre outros. Exploraremos o documento de conceitos da 'Inteligência Artificial' acrescentando uma imagem robótica e uma tabela de termos associados. Muito bom compartilhar conhecimento com vocês.
Limpa, limpa, limpa ...
Para evitar surpresa no cartão de crédito, excluiremos os recursos utilizado no Azure. Primeiramente interromperemos a instância de computação.

Navegue até o portal inicial do Azure e clique em "Todos os Recursos".

Selecione todos os recursos e posteriormente o botão Excluir. A exclusão poderá demorar em torno entre um a cinco minutos. Pronto.

Comments