Opinião

A minha saga com Python (ou como aprendi o básico do básico)

Em abril de 2017, escrevi aqui no blog o texto “A minha saga com redes sociais (ou por que é importante compreendê-las)”, no qual narrava a minha relação com a disciplina de análise de redes sociais, desde o preconceito acadêmico-epistemológico até a inevitável aceitação e consequente aprendizado (resultante até em palestra no Social Media Week SP). Um ano e cinco meses depois, escrevo este post quase em situação e contextos idênticos, mudando apenas a protagonista: agora, compartilho a minha experiência com (e a minha redenção à linguagem de programação) Python.

Antes de começar, um spoiler: não sou (nem pretendo ser/me tornar) um programador, apenas aprendi alguns dos conceitos básicos, modos de aplicação e pressupostos práticos. Como escrevi recentemente no último post, Pesquisa em mídias sociais na era pós-API, estamos passando por um momento crítico – uma virada metodológica – que exige derrubar barreiras e vasculhar alternativas criativas para lidarmos com a situação das APIs. O meu interesse e intuito em aprender o básico do básico de Python foi prático: eu preciso coletar dados de mídias sociais e as ferramentas que eu utilizo estão cada vez mais limitadas. Como resolver esse problema?

Tudo começou em fevereiro deste ano, quando tivemos um workshop interno no IBPAD sobre aplicação da Vision API do Google para análise automatizada de imagens com inteligência artificial. Foi quando instalei o Python pela primeira vez, já que o processo envolvia a utilização de dois scripts; e instalei também o Notepad++, provavelmente um dos editores de texto/código aberto mais populares do mundo. A simplicidade do projeto (instalar o Python > preparar os datasets CSV > mudar configurações simples de comando com o Notepad++ > executar o script utilizando o Prompt de Comando) foi fundamental para não me “assustar”. Tivesse sido algo mais complexo, talvez eu teria me fechado muito mais.

Um dos primeiros trabalhos que realizamos com esse aprendizado foi esse estudo exploratório da hashtag #férias no Instagram, quando analisamos mais de 12.000 publicações. Embora seja relativamente simples, acho que foi um marco (tanto para o IBPAD quanto para mim) no que se refere à abertura de novos horizontes. Depois desse relatório, fizemos vários trabalhos utilizando computação visual e inteligência artificial em diferentes segmentos/contextos, como a publicação “EM BUSCA DO MELHOR ÂNGULO: A imagem dos presidenciáveis no Instagram – uma análise quanti-qualitativa com inteligência artificial”, na qual utilizamos métodos mistos de análise.

Esse projeto também foi importante porque me levou à segunda fase com Python: arriscar executar (sozinho) outro script. Precisávamos de uma maneira para coletar todas as publicações dos perfis dos pré-candidatos à Presidência, mas a API do Instagram não fornece acesso a esse tipo de coleta. Foi quando entrou o InstagramScraper“uma aplicação de comando escrita em Python que raspa e faz o download de fotos e vídeos de um usuário”. Na verdade, é muito mais potente: possibilita baixar publicações de usuários (ou de uma lista de usuários), publicações com uma hashtag específica, de uma localidade e até mesmo Stories. Foi nesse momento que comecei a “arriscar” mais, dentro das possibilidades do – e das instruções fornecidas pelo – script.

Depois de desvendar a coleta de dados do Instagram, queria conseguir fazer o mesmo no Twitter. Foi quando encontrei o TwitterScraper, que possui até um site com uma versão beta/demo para testar a coleta de 1.000 tweets. Além de ser o meu site de rede social favorito, é também o campo “oficial” da minha pesquisa acadêmica. Por mais que a Netlytic ainda seja a minha alternativa número um (pela praticidade em vários sentidos), há sempre alguma limitaçãozinha. Por exemplo, o artigo “#Casamentoreal: O Discurso Brasileiro no Twitter sobre o Evento da Monarquia Britânica” (no prelo), que auxiliei na análise com o Wordij, teve coleta feita manualmente simplesmente porque não podíamos retornar mais de sete dias na coleta com a API.

Nesse mesmo período, uma demanda do trabalho exigiu que eu modelasse dados do Twitter, extraídos a partir de uma ferramenta de monitoramento, de modo a criar um arquivo capaz de gerar uma rede no Gephi (ou seja, uma lista de arestas em CSV com origem e destino). Foi quando encontrei o TSM (Twitter Subgraph Manipulator), outro script Python, desenvolvido por Dr. Deen Freelon, utilizado no fantástico projeto “Beyond the hashtags: #Ferguson, #Blacklivesmatter, and the online struggle for offline justice”. Esse foi outro marco na minha relação com Python porque, diferente dos scripts que havia utilizado até então, esse módulo desenvolvido pelo pesquisador era muito mais complexo (do que apenas coletar dados, por exemplo).

Algumas coisas que o TSM consegue fazer:

  • Suportar comunidades muito grandes (milhões de nós/arestas) – o único limite é a memória do seu computador;
  • Extrair retweets e menções-@ em formado de lista de arestas para análise e visualização de rede;
  • Dividir parte de redes em comunidades, isolar as comunidades N mais largas e identificar os usuários mais conectados em cada comunidade;
  • Medir a insularidade de comunidades de uma rede (utilizando índices EI) para determinar o quanto cada uma delas se parece com uma câmara de eco;
  • Medir a sobreposição entre comunidades de uma rede para determinar quais interagem mais ou menos entre si com constância;
  • Identificar os retweets mais frequentes numa base de dados do Twitter e ranqueá-las pelo número de retweets e por comunidade;
  • Rastrear comunidades do Twitter (ou de outra fonte) ao passar do tempo: computar placares de similaridade (com ou sem o peso de coeficientes) para comunidades dividas em parte a partir da mesma base de dados em dois recortes de tempo diferentes;
  • Descobrir quais nós são intermediários entre as comunidades;
  • Encontrar a hashtag mais utilizada em cada comunidade (ou dataset);
  • Encontrar os links ou domínios web mais utilizados em cada comunidade (ou dataset).

Confesso que me bati um pouco para descobrir como utilizar a função de transformar menções e retweets em uma lista de arestas. Como minha experiência com os outros scripts era limitada a execuções de uma linha no Prompt de Comando, não foi fácil compreender a lógica por trás do script para conseguir fazer o que eu queria (e o Read Me também não ajudou muito, direcionando as instruções para o arquivo .py já com os códigos prontos e suas explicações práticas, mas completamente indecifráveis para quem não possui experiência). Felizmente, como em vários outros pacotes disponíveis online em plataformas como GitHub, dois arquivos “demo” me guiaram pelo caminho a seguir.

O formato .ipynb não me era familiar até então, portanto tive que recorrer ao Google para – em mais uma descoberta – fazer o download e instalação do Jupyter Notebook. Quando finalmente consegui abrir o arquivo, um dos exemplos trazia exatamente a função que eu queria, mas eu ainda tinha uma dúvida: onde eu coloco isso? Tentei, primeiro, direto no Prompt de Comando, já que era o único lugar no qual eu já tinha feito algo – sem sucesso. Sem saber que eu poderia executar ali mesmo no próprio notebook, segui a segunda orientação: criei um arquivo .py com apenas o código do exemplo, substituindo o arquivo .csv e o executei… Isso mesmo, no Prompt de Comando. Funcionou! Com muito mais trabalho do que o necessário, mas funcionou.

Nesse momento o Python já tinha me ganhado. Recapitulando as (minhas) conquistas: conseguia coletar dados do Instagram, utilizá-los na Vision API do Google; coletar dados do Twitter (sem as limitações da API), transformá-los em listas de arestas para o Gephi e mais algumas outras funções interessantes (cheguei a utilizar o cálculo de modularidade do próprio módulo em alguns projetos, por exemplo; de resto, não testei as outras funções, mas sabia como chegar lá – mesmo aos trancos e barrancos). Ou seja, o meu objetivo inicial – aprender a coletar dados de mídias sociais sem depender de ferramentas específicas – já havia sido contemplado, de certa forma.

Foi quando o destino colocou no meu caminho mais uma oportunidade de aprendizado: um workshop gratuito para um seleto grupo de 100 participantes organizado pelo HUB de Inovação na UFRJ sobre raspagem de dados públicos com Python. Fiz a minha inscrição sem muitas expectativas (pela falta de conhecimento no assunto), mas felizmente tive a sorte e oportunidade de ser selecionado para participar desse intensivo de quase 10h num sábado. Quem abriu o evento foi a jornalista Judite Cypreste, com a palestra “Programação para jornalistas: descobrindo pautas com Python”, na qual apresentou vários cases legais sobre jornalismo de dados utilizando Python – a apresentação abaixo é de outro evento, mas os exemplos utilizados foram os mesmos.

O workshop, oficialmente intitulado “Não é Bruxaria, é Pandas!”, foi ministrado por Fernando Masanori, professor e palestrante com dezenas de cursos/apresentações em todo o Brasil e a fora. Foram mais ou menos 7 horas (com pausa para o almoço, é claro) de aprendizado desde a instalação do Python e alguns dos principais pacotes (requests, beautifulsoup, selenium, pandas, etc.) até exemplos práticos de análise de dados públicos com dataset fornecido pelo professor. Como o workshop foi bastante prático, não houve uma apresentação em PDF ou PPT para guiar o ensino, somente a orientação de Masanori a partir de um notepad colaborativo. Caso tenha interesse, entretanto, ele disponibilizou todo o treinamento (documentação e documentos) no GitHub.

A oficina foi muito importante para que eu entendesse um pouco melhor a “lógica” por trás da linguagem. Para entender, por exemplo, como funcionava o Jupyter Notebook e como eu deveria usá-lo no módulo TSM, quando tive que gerar a lista de arestas. Não saí de lá sabendo programar o que eu quisesse, mas saí compreendendo um pouco melhor como se estruturam as funções em Python. É evidente que ele não passou todas as funções de linguagem, mas as principais (mais importantes e simples) foram apresentadas e eu – obviamente – anotei tudo para ter um caderno de apoio sempre que precisar utilizar scripts/módulos de outras pessoas. Ou seja, agora eu posso dizer com segurança que sei o básico do básico.

Reforço, entretanto, o que coloquei no início do texto: não é a minha pretensão – de forma alguma – tornar-me um Programador ou até mesmo (oficialmente) um Cientista de Dados. Seguindo o conselho de Jake VanderPlas, autor do livro Python Data Science Handbook, o meu objetivo nunca foi aprender Python; aprender Python foi o meio que encontrei para solucionar o meu problema inicial. Este tweet foi citado no workshop, também está na apresentação acima e é como eu encerro – por ora – este texto. Uma dica simples, mas certeira. Se eu tivesse começado somente com o intuito de aprender a linguagem, sendo tão de humanas quanto sou, teria sido consumido pelo medo. Agora, posso até colocar no LinkedIn como conhecimento básico (bem básico).

Tags:

2 comentários

  1. Obrigada Pedro, excelente texto. Minha motivação também tem sido a limitação das ferramentas. Espero conseguir chegar no básico do básico. Estou no foco!

    1. Obrigado pelo comentário, Ingrid. Vai conseguir, pode ter certeza! No próximo ano devo fazer alguns posts aqui no blog ou produzir alguns materiais no Slideshare compartilhando o pouquinho que sei. Vamos trocando e aprendendo juntos! Abs

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *


Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.