Yuri Malheiros

Professor e pesquisador da UFPB - Campus IV


AI Notebooks - KNN

Os IPython Notebooks se proliferaram nas últimas conferências da linguagem Python. Para apresentações onde o foco é o código, como em tutoriais, a ferramenta se encaixa muito bem. O IPython Notebook é como um shell interativo no browser "on steroids" (com textos explicativos, imagens, gráficos, etc). Eles podem ser distribuídos para que outras pessoas repitam os seus passos, experimentem novas possibilidades e visualizem os resultados dessas modificações.

Percebendo o potencial da ferramenta para disponibilização de material explicativo sobre assuntos que envolvam programação, eu resolvi criar um notebook e disponibilizá-lo no Github. Eu criei um notebook sobre o algoritmo de classificação KNN (K-Nearest Neighbors) para testar a ferramenta.

Vocês podem visualizá-lo diretamente no IPython Notebook Viewer ou podem clonar o repositório no Github e rodar o IPython Notebook no seu computador:

ipython notebook --pylab=inline

Estou pretendendo no futuro disponibilizar mais notebooks dessa forma sobre assuntos de inteligência artificial. O que acham? Gostaria do feedback de vocês.

5 estrelas dos dados abertos

Vários países têm aberto inúmeros dados importantes tornando o governo mais transparente para a população, dando poder para as pessoas conseguirem analisar os dados e poderem criar as mais diversas aplicações e visualizações.

As possibilidades são grandes e as vantagens para a população também, mas para que seja possível fazer algo, o governo precisa colaborar primeiro. Não adianta ter desenvolvedores, designers e cientistas juntos se não existir a base para o trabalho, ou seja, os dados.

Tim Berners-Lee, o pai da web, criou um modelo para classificar dados abertos publicados. Este modelo é conhecido como o modelo das 5 estrelas, onde dados com 1 estrela estão na forma mais pobre e simples e dados com 5 estrelas são mais ricos e complexos.

A classificação proposta pelo Berners-Lee é a seguinte:

  • ★ : dados disponíveis na web (não importa o formato) sob uma licença aberta. Por exemplo, um PDF.
  • ★ ★ : dados disponíveis de forma estruturada. Por exemplo, um arquivo Excel.
  • ★ ★ ★ : dados disponíveis em formatos não-proprietários. Por exemplo, um CSV.
  • ★ ★ ★ ★ : use URIs para denotar os dados, assim outras pessoas podem criar links para eles. Por exemplo, um RDF.
  • ★ ★ ★ ★ ★ : link os seus dados a outros. Por exemplo, um RDF que tenha links para outros RDF.

O trabalho de publicar os dados até a terceira estrela é simples e o esforço é praticamente o mesmo. Faz pouco sentido publicar dados num arquivo .xlsx, quando o próprio Excel pode salvar como .csv. Então, quem estiver publicando dados abertos, por favor, faça com que eles tenham pelo menos 3 estrelas. As pessoas que estiverem usando vão agradecer e mais aplicações serão criadas usando esses dados.

Para publicar dados com 4 ou 5 estrelas é necessário ter um conhecimento extra. Criar um RDF já não é tão simples quanto criar um arquivo CSV. E, para criar RDFs com links é necessário também conhecer outras fontes de dados. Não é por acaso que ainda temos muitos dados abertos com no máximo 3 estrelas.

Por outro lado, RDFs com links fornecem um poder muito maior para quem os utiliza, pois, além de ter os dados, também é possível navegar por eles e descobrir informações e relações totalmente novas. Por exemplo, você pode ter um RDF com dados de todos os prefeitos do seu estado e que um dos dados disponíveis para cada prefeito é a sua cidade natal. O RDF pode trazer um link fazendo referência à cidade, que se for seguido, fornecerá dados sobre ela, por exemplo, o estado que ela pertence e a sua população. Dessa forma, apenas publicando os dados do prefeito e seus respectivos links, seria possível ter informação suficiente para separar os prefeitos que são nascidos no mesmo estado da cidade que governa ou saber se a maioria dos prefeitos são de cidades grandes (com mais de 1 milhão de habitantes), entre muitas outras possibilidades.

RDFs com links (dados ligados) são a base da web semântica.

Infelizmente ainda é difícil conseguir dados abertos em várias cidades do Brasil, mesmo com apenas 1 estrela. Entretanto, temos bons exemplos de dados ligados em outras áreas. Uma das maiores bases de dados é o Freebase, mantido pelo Google. Naveguem nele para sentir um pouco do poder de ter dados 5 estrelas. Outra opção é a DBpedia.

Mapeamento sistemático para hackers

Nesses últimos dias eu estava coletando vários trabalhos para realizar um mapeamento sistemático. Esse tipo de mapeamento é feito quando se deseja ter uma visão geral de uma área que está sendo pesquisada. Assim, é possível identificar os principais trabalhos numa área, aprender o que já foi feito e o que merece contribuição, descobrir falhas que você pode resolver, etc.

Para organizar minha biblioteca de artigos eu utilizo o Mendeley, um software gratuito, bastante eficiente nas suas tarefas e que possui um API para que programadores consigam criar soluções usando os seus serviços.

Num mapeamento sistemático é importante extrair informações do tipo: quantos artigos foram publicados em cada ano, ou quais autores possuem mais artigos, ou ainda quais meios de publicação foram mais utilizado pelos pesquisadores nessa área.

Isso pode ser feito manualmente, mas com todos esses dados disponíveis no Mendeley, eu não aceitaria facilmente fazer isso assim.

Algumas horas depois de começar a explorar a API do Mendeley eu tinha o primeiro protótipo do Mendeley Stats, uma ferramenta para extrair automaticamente informações importantes para um mapeamento sistemático. Com um pouco mais de trabalho eu organizei tudo o que tinha e disponibilizei o repositório no Github.

O funcionamento do Mendeley Stats é simples. Ele é uma ferramenta de linha de comando que extrai informações de uma pasta no Mendeley. Dessa forma, é só colocar todos os papers do seu mapeamento sistemático numa pasta e executar o Mendeley Stats.

A ferramenta tem duas funcionalidades principais: gerar gráficos e gerar arquivos .csv. Gráficos são ótimos para que se entenda alguns dados facilmente, mas em certos casos, os dados não podem ser apresentados adequadamente em gráficos, então é melhor usar a alternativa de gravar num .csv.

Além de escolher o tipo de output (gráfico ou .csv), o usuário também precisa escolher que dados ele quer analisar. Por enquanto o Mendeley Stats suporta ano, tipo (se o paper é de conferência, de revista, etc.), autores, palavras-chaves e meio de publicação. Ao escolher, por exemplo, a análise por anos, o Mendeley Stats retornará a quantidade de artigos por ano que estão contidas na pasta especificada.

Exemplo de uso:

mendeleystats --info year --output chart --folder datamining

Nesse caso, a ferramenta retornará em forma de gráfico (--output chart), quantos artigos por ano (--info year) existem na pasta datamining no Mendeley (--folder datamining).

No geral, a ferramenta suporta os seguintes parâmetros:

mendeleystats --info {year,type,authors,keywords,publishedin}
              --output {chart,csv} --folder FOLDER

Espero que essa simples ferramenta seja útil para outras pessoas também e fiquem a vontade para dar sugestões ou para contribuir com o projeto.

Reboot

Há meses não escrevo nada no blog. Alguns amigos já estavam me cobrando, mas eu não sentia vontade de escrever por aqui. Eu até tinha feito algumas mudanças recentes no blog, colocado um tema diferente e começado a escrever algumas coisas, mas nao publiquei nada.

Olhando bem o conjunto de textos do blog, eu não sentia que tudo o que estava armazenado refletia o que eu queria expor hoje. Eu tenho posts que escritos em 2006! Eu também não estava querendo escrever por escrever, muito pelo contrário, cada vez mais tento produzir textos melhores. Tudo isso somado causou uma pausa, que tentarei quebrar a partir de agora.

Então eu pensei bem e resolvi fazer um "reboot". Entre aspas pois não apaguei tudo, alguns textos eu considero excelentes, e vocês já podem encontrar parte deles aqui. Futuramente talvez eu reviva outros posts que gosto e que mereçam um novo compartilhamento.

Os temas abordados aqui não serão muito diferentes dos últimos 2 ou 3 anos.

Por fim, joguei o WordPress fora e estou usando Jekyll. Me sinto melhor escrevendo dessa forma.

A máquina que sente e as eleições

Máquinas em geral são frias. Elas são ótimas em fazer tarefas repetitivas e exatas, atividades que os seres humanos não são tão bons em fazer. Por outro lado os seres humanos têm uma característica que passa longe das máquinas, a capacidade de ter e perceber sentimentos.

Será mesmo?

Antes de continuar falando em sentimentos preciso introduzir um outro assunto. As eleições.

Várias vezes as pesquisas de intenção de voto aqui na Paraíba foram questionadas. Quando alguém cita uma pesquisa desse tipo numa conversa sempre refutam "e quem acredita nessas pesquisas?".

Outro tipo de comentário que inspirou o que será apresentado a seguir era que algumas pessoas me falavam que as pesquisas não refletiam o que elas ouviam das pessoas nem o que elas viam em redes sociais. "Candidato X recebe tanto apoio nas redes sociais, mas está muito mal nas pesquisas."

Será que isso era realmente verdade? O que eu posso fazer para saber se as pessoas estão falando bem ou mal dos candidatos? Ou melhor, tem como medir o grau de positividade ou negatividade dos comentários?

Essas questões ficaram martelando na minha cabeça, até eu colocar as mãos e a mente para trabalhar.

Eu poderia usar diversas técnicas para saber o que estão falando de cada candidato. A mais simples seria pegar mensagens e classificar manualmente em bom ou ruim, técnica que é utilizada até hoje nas campanhas. Mas eu não iria fazer isso, primeiro eu não teria tempo, segundo seria muito chato e terceiro eu queria fazer o computador extrapolar suas tarefas frias e exatas e passar a entender sentimentos.

Isso pode parecer algo mágico ou longe da realidade para quem não conhece muito bem, mas a área de análise de sentimentos já mostrou ser possível identificar sentimentos através de operações exatas.

Com isso, eu analisei alguns trabalhos e resolvi utilizar o Senticnet. Que resumidamente é um RDF com uma grande quantidade de palavras e expressões classificadas de acordo com uma polaridade que varia de 1 a -1. Onde, 1 é o mais positivo possível e -1 o mais negativo possível. Por exemplo, a expressão "friday night", algo bom, possui polaridade +0.728, já a palavra "monday", dia odiado por muita gente, tem valor -0.847.

Com o Senticnet eu tinha a possibilidade de classificar mensagens textuais de redes sociais em positivas e negativas e ainda saber se uma mensagem é mais positiva que a outra ou mais negativa. Eu fiz um experimento inicial para saber que tipo de resultado eu teria. Existem inúmeros pontos que podem ser melhorados no experimento e ele está longe de ser perfeito, mas mesmo assim compartilharei com vocês o que eu fiz e quais foram os resultados.

Ainda é muito fácil pegar texto de tweets através de uma query. A avalanche de dados do microblog é um prato cheio para pesquisadores, então eu aproveitei e usei os tweets como minha fonte de informação para saber o que as pessoas estava falando sobre os candidatos na eleição.

Eu coletei aproximadamente 300 tweets para cada candidato por dia durante 14 dias. A coleta era feita em 3 horários diferentes do dia, 100 tweets de cada vez. Vocês perceberão no gráfico mais abaixo que existe um salto do dia 13/09 para o dia 19/09. Isso aconteceu por alguns problemas técnicos que me impediram de coletar tweets. O número de 300 tweets por candidato não é exato, pois eu estava rodando a coleta manualmente e aconteceu de alguns dias eu conseguir rodar apenas 2 coletas.

Ao pegar um tweet, o texto era dividido de três em três palavras e para cada conjunto de três palavras era feita uma tentativa de classificação usando o Senticnet. Se a expressão fosse encontrada, o valor da polaridade era atribuído a ela e as três palavras eram removidas do texto. O mesmo processo era feito para conjuntos de duas e uma palavra. Para finalizar a classificação do tweet era tirada a média das polaridades encontradas.

O Senticnet traz expressões em inglês e eu estava coletando mensagens em português. Para resolver esse problema eu traduzi cada tweet do português para inglês usando a API do Bing. Eu fiquei preocupado com esse passo, mas a tradução de mensagens pequenas como tweets se mostrou boa.

O gráfico abaixo mostra o resultado das classificações. Os valores no eixo y são as médias das classificações de todos os tweets de um candidato num certo dia. E os valores no eixo x são os dias.

Eleições de João Pessoa - Gráfico de polaridades

O interessante desse gráfico é que ele não reflete muito bem as pesquisas eleitorais. Isso significa que alguém está errado? Não necessariamente. O que podemos afirmar é que a opinião do público das redes sociais, mais especificamente o Twitter, está refletida no gráfico e que talvez as redes sociais não tenham um impacto tão significativo nas eleições da Paraíba.

Entretanto, existem dados no gráfico que confirmam pesquisas e outras métricas das redes sociais. Podemos perceber, por exemplo, a candidata Estela com uma polaridade média maior em quase todos os dias. Se formos analisar as páginas dos candidatos no Facebook a métrica "Pessoas falando sobre isto" de Estela é bem maior que a dos outros, ou seja, os eleitores dela são mais participativos nas redes sociais.

Outros pontos de destaque é o pico de mensagens positivas do candidato Cícero no dia 25/09, mesmo ele tendo os menores valores em vários dias. E a subida do candidato Luciano Cartaxo nos últimos dias, o que se mostrou uma tendência nas pesquisas eleitorais também.

Espero que tenham gostado do experimento e ficaria muito feliz com o feedback de vocês seja através de dúvidas, sugestões, etc.