Post 1 – 1/3 – Desembaralhando Harry Potter e a Pedra Filosofal com Python em 14 passos

Olá pessoal, começando o nosso projeto de Outubro, vamos primeiramente falar sobre em qual linguagem vamos desenvolver nosso primeiro pequeno projeto?

Hoje será Python, linguagem esta que desde 2007 vem figurando entre as mais utilizadas, desde 2014 está entre as 3 mais utilizadas e dizem que em 2020 passou a ser a mais utilizada!

Abaixo um infográfico sobre a evolução sobre a usabilidade das linguagens ao longo do tempo:

Já ouviu falar de outras linguagens contidas neste vídeo?

E porque é que Python vem sendo tão utilizada? Python é uma linguagem de código aberto que pode ser aplicada em diversas áreas.
Dentro de seus diferenciais temos: considerada produtiva e de fácil aprendizado, sintaxe intuitiva (ou seja, os comandos executados serão claros ao ponto de facilitar o entendimento sobre a programação), documentação farta, multiplataforma e você pode ler um pouco mais sobre as vantagens e desvantagens aqui.

Outro diferencial que acho importante ressaltar é que sua comunidade é extremamente ativa e acessível, independente do nível de conhecimento que você tenha. Dentro das várias comunidades existentes, há muita troca de conhecimento e apoio entre todos os membros. Gostaria de ressaltar duas delas:

  • A PyLadies, uma comunidade internacional que estimula mulheres a aprender programação e a tornarem-se participantes ativas e líderes da comunidade Python e de tecnologia do mundo todo.
  • Temos alguns outros exemplos também, como a Python BR e a Python PT;

Finalmente falando sobre o projeto a ideia é criar uma nuvem de palavras, que acaba por ser uma lista ordenada visualmente de palavras de acordo com a recorrência em que aparecem em um trecho/documento/discurso.

Lembra de ter visto alguma dessa?

Agora, chega de conversa e vamos colocar começar o nosso primeiro projeto!

Antes de tudo, para criar nosso projeto precisamos preparar nosso computador e, para isso, também temos o artigo que vai te ensinar a configurar tudo que é preciso.
Spoiler: A instalação é simples, gratuita e rápida!

E você pode acompanhar mais detalhadamente como efetuar esta configuração inicia aqui neste post nosso!

Antes de criarmos nossa nuvem de palavras, é importante explicar o motivo deste post chamar “Desembaralhando Harry Potter e a Pedra Filosofal com Python” pois vai nos dar contexto do que iremos utilizar como insumo.
Eu estive curioso para saber quais são as palavras e termos mais escritos no livro “Harry Potter e a Pedra Filosofal”.
Para isso, peguei uma simples cópia do livro (arquivo .PDF), copiei todo o texto transcrito e salvei em um arquivo de Word (.docx).
Logo logo vamos utilizar este arquivo e você poderá efetuar o download dele no final do post.

Na interface do Jupyter notebook, vamos começar a tirar a ideia da cabeça e transformar em código:

  1. Instalação de bibliotecas
    1. A primeira etapa será instalar bibliotecas. Mas o que são bibliotecas?
      Imagina que você possui uma biblioteca, mas não possui os novos livros que precisa utilizar. Para isso, você precisa adquirir e catalogar seus livros. Dessa mesma forma, vamos fazer para o nosso computador para os livros que não vêm com ele por defeito.

      Para isso, basta seguir os seguintes passos:
      1. Já na nossa interface Anaconda, vamos abrir o nosso ambiente Jupyter Notebook, clicando em Launch:

      2. Na página seguinte, vamos abrir o terminal de comandos, local onde iremos instalar a nossas bibliotecas. Para isso, basta clicar em New e posteriormente em Terminal:

      3. Já na nova tela que foi aberta (do terminal), vamos executar o comando abaixo para cada uma das bibliotecas que precisaremos instalar:
pip install nome_da_biblioteca
  • Observação, alguma pergunta para confirmação da instalação pode ser efetuada para confirmar a intenção de instalação e, para isso, basta escrever “Y” e clicar enter.
  • Segue lista das bibliotecas a serem instaladas e como ficariam os códigos para instalação:
    (Provavelmente as de numeração 4, 5 e 6 já estarão instaladas por padrão)
    1. pip install python-docx
    2. pip install collections
    3. pip install wordcloud
    4. pip install pandas
    5. pip install numpy
    6. pip install regex
  1. Agora, com nossas bibliotecas já instaladas, vamos partir para a abertura de nosso Jupyter Notebook e começar a colocar a mão no código Python!

    Vamos voltar a página onde tínhamos nossas pastas mapeadas e vamos abrir um Jupyter Notebook, clicando em New e depois em Python 3
  1. Importação de bibliotecas
    Com nosso Jupyter notebook ativo, já podemos começar a inserir as primeiras linhas de código. Para isso, vamos informar ao nosso código quais são as versões e “livros” que ele irá utilizar, com os seguintes comandos:
from docx import Document
from collections import Counter
from wordcloud   import WordCloud, STOPWORDS, ImageColorGenerator
from matplotlib  import pyplot        as plt
import pandas        as pd
import numpy         as np
import regex         as re

Ou seja, para cada um dos “livros” citados acima, vamos utilizar um “capítulo” específico ou o livro todo, como exemplo do pandas e numpy

  1. Agora, vamos iniciar a importação do arquivo a ser lido em um formato que Python compreenda.
    Observação: para este primeiro projeto, vamos utilizar o arquivo .docx,  que mencionei anteriormente onde inseri todo o texto do livro para um arquivo nativo Word:
# Primeiramente, selecionamos o arquivo que iremos utilizar, 
# na variável address e você precisará ajustar o caminho
# onde o arquivo está salvo em seu computador
# Após isso, reservamos um espaço no HD do computador
# para jogar as informações deste arquivo.
# no caso, será a variável text_chunks
address = "/Users/augustobarbosa/Downloads/ItsmeGuto/HP1.docx"
text_chunks = []

# Nesta função, vamos transformar o arquivo em 
# um Documento do Python
# Depois, vamos ler cada parágrafo deste documento 
# e gravar ele no nosso arquivo criado anteriormente
# Por fim, vamos chamar esta função (doc_to_df) 
# para que efetue essa varredura e crie os dados em 
# um arquivo do tipo "tabela"/excel, que para o 
# Python é o Data Frame (df)

def doc_to_df(address): 
    document = Document(address)  
    for paragraph in document.paragraphs: 
        text_chunks.append(paragraph.text)    
doc_to_df(address)

df = pd.DataFrame(text_chunks,columns=['Conteudo'])
  1. Nesta etapa, verificaremos se o arquivo foi importado corretamente, analisando as primeiras linhas do data frame (tabela) criada:
print(df)
  1. Agora, vamos tornar todas as palavras em letras minúsculas para não haver diferenciação durante a contagem de palavras:
df['Conteudo']= df['Conteudo'].str.lower()

Observação: na nossa tabela, a coluna contendo os dados foi chamada de “Conteudo”, por isso a referência a Conteudo no código acima

7. Remoção de pontuações e palavras indesejadas como preposições, substantivos, etc. Para isso, podemos utilizar o seguinte trecho:

df['Conteudo'] = df['Conteudo'].str.replace(',', ' ')
df['Conteudo'] = df['Conteudo'].str.replace('.', ' ')
df['Conteudo'] = df['Conteudo'].str.replace('\n', ' ')

Para isso, vamos substituir tudo que for vírgula, ponto ou “\n” por espaços em branco

8. Contagem de palavras com loop de repetição
Agora, vamos fazer com que o sistema procure todas as palavras dentro da nossa tabela e efetue a contagem das palavras:

words = ''
for i in df.Conteudo.values:
    words += '{} '.format(str(i).lower())

9. Separar palavras por quantidade em um novo data frame

# neste trecho, vamos selecionar a 300 mais comuns palavras 
# e separar elas de acordo com a coluna "palavra" e 
# "frequência"
wd = pd.DataFrame(Counter(words.split()).most_common(300), columns=['word', 'frequency'])

10. Agora, vamos ver temporariamente o resultado, para avaliarmos se existem palavras ou trechos que devem ser removidos, apenas exibindo as linhas, com o seguinte código:

# Na primeira linha avisamos o sistema que queremos ver todas a linhas de 
# resultado e na próxima, fazemos a exibição.
pd.set_option('display.max_rows', df.shape[0]+1)
print(wd)
  1. De acordo com o resultado esperado, podemos ter algumas decisões a serem feitas, como por exemplo entender que nossa amostra de dados não é suficiente ou que precisamos remover algumas palavras da amostragem. Para isso, utilizamos os seguintes códigos:
# na primeira linha removemos as linhas de acordo com o seu 
# índice, exemplo "-" ou
# "não" 
# Nas seguintes, removemos tudo que for diferente 
# de "de" ou "que". No código
# que estará anexado mais ao final do post, tem toda a 
# listagem de palavras que julguei
# importante retirar
wd = wd.drop([0, 6, 17, 22])
wd = wd[wd.word != 'de']
wd = wd[wd.word != 'que']
  1. Após deixamos toda nossa massa de dados pronta para a geração da nuvem de palavras, vamos compactar as palavras em uma lista para ser utilizada no wordcloud em uma lista ordenada, pela frequência indicada:
data = dict(zip(wd['word'].tolist(), wd['frequency'].tolist()))
  1. Criar a nuvem de palavras
    Após separar todos os dados, vamos então a criação da nuvem, seguindo o comando abaixo:
wc = WordCloud(background_color='white',stopwords=STOPWORDS,               max_words=200).generate_from_frequencies(data)
  1. Gerar a imagem
    Por fim, vamos gerar a imagem da nossa nuvem de acordo com o resultado do conteúdo previamente ajustado, utilizando o código:
plt.figure(figsize = (150,120))
plt.imshow(wc, interpolation='nearest')

Tu pode encontrar todo este código acima e pronto para ser executado efetuando o download no link abaixo:


E, também, o arquivo utilizado para criar a nuvem de palavras:

Achou este projeto interessante? Já pensou em quais outros cenários podemos utilizar este programa? Já pensou em fazer uma rápida “análise” sobre um site de notícias, por exemplo? Quais são os assuntos mais falados?

E, se você é uma das pessoas que:

  • Se interessou e gostaria de aprender um pouco mais sobre o tema;
  • Quer conversar mais profundamente sobre algum dos tópicos supracitados;
  • Ficou com alguma dúvida ou não conseguiu executar o código todo;

Tá esperando o que? Me chama aí e vamos conversar!

E sabia que o Mario tem um remake de uma de suas mais antigas versões em Python?

GitHub - justinmeister/Mario-Level-1: The first level of Super Mario Bros  made with Python and Pygame.
Site oficial