Recomendação de usuários simples – básico em python

Um sistema de computador que faz sugestões é chamado de Sistema de Recomendação, sempre que vejo um sistema assim tento pensar quais variáveis o site está levando em conta, já fiquei um bom tempo imaginando como o Linkedin, Youtube, Netflix e Facebook levam em conta em seus sistemas de recomendações, um sistema de recomendações depende muito do tipo de rede que você quer criar. Por exemplo um ponto que observei  é que  o sistema de recomendações do Linkedin é totalmente diferente do Facebook. Um foca em amizades pessoas que realmente se conhecem o outro foca em contatos pessoas com muitas conexões “500+” .

Fiz um exemplo de código baseado em uma homework que encontrei na internet. Primeira vez que programei em Python, o código é muito simples e foi utilizado a biblioteca Networkx (sugiro ver os tutoriais)

1º Construí o Grafo conforme o exercício mostra

G=nx.Graph()
G.add_node('Nurse')
G.add_node('Juliet')
G.add_node('Tybalt')
G.add_node('Capulet')
G.add_node('Friar Laurence')
G.add_node('Romeo')
G.add_node('Benvolio')
G.add_node('Montague')
G.add_node('Mercutio')
G.add_node('Escalus')
G.add_node('Paris')
G.add_edges_from([('Nurse','Juliet')])
G.add_edges_from([('Tybalt','Juliet')])
G.add_edges_from([('Capulet','Juliet')])
G.add_edges_from([('Romeo','Juliet')])
G.add_edges_from([('Romeo','Benvolio')])
G.add_edges_from([('Romeo','Montague')])
G.add_edges_from([('Romeo','Mercutio')])
G.add_edges_from([('Benvolio','Montague')])
G.add_edges_from([('Escalus','Montague')])
G.add_edges_from([('Escalus','Paris')])
G.add_edges_from([('Friar Laurence','Juliet')])
G.add_edges_from([('Friar Laurence','Romeo')])
G.add_edges_from([('Capulet','Tybalt')])
G.add_edges_from([('Capulet','Escalus')])
G.add_edges_from([('Capulet','Paris')])
G.add_edges_from([('Mercutio','Paris')])
G.add_edges_from([('Mercutio','Escalus')])

Foram criadas algumas funções como listar amigos, amigos de amigos, amigos em comum


def friends(graph, user):
"""método do networx para buscar os vizinhos de um node"""
  return set(graph.neighbors(user))

def friends_of_friends(graph,user,radius):
"""método do networx para buscar um subgraph a partir de um centro passo o radius dele depois disso removo os amigos para manter uma set de amigos de amigos"""
  return set(nx.ego_graph(G,user,radius,False).nodes()) - friends(G,user)

def common_friends(graph, user1, user2):
 return friends(graph,user1).intersection(friends(graph,user2))

Primeiro fiz o algorítimo de apenar pegar os meus amigos de amigos e ordenar para os que mais tem amigos em comum.

def number_of_common_friends_map(graph, user):
    friends = friends_of_friends(graph,user,2)
    bigList = dict()
    for friend in friends:
        bigList[friend] = len(common_friends(graph,user,friend))
    return bigList

def number_map_to_sorted_list(map):
	return sorted(map.iteritems(), key=operator.itemgetter(1,0),reverse=True)

def recommend_by_number_of_common_friends(graph, user,top):
   return number_map_to_sorted_list(number_of_common_friends_map(graph,user))[:top]

Uma outra forma de calcular esse algorítimo é criando algum tipo de score para os amigos mais prováveis, existem varias formas diferentes de fazer isso.
Uma forma simples de fazer isso quando se tem poucas informações é imaginar que um amigo seu que possui amizades de forma indiscriminadas (2 mil amigos), tem altas chances de trazer muitas recomendações não relevantes, comparada a amigos que possuem poucos amigos como (200~300).
[Não li nenhum artigo sobre isso, é só uma lógica]

Dado que um usuário A tem três amigos em comum com um usuario B = (f1, f2, f3).
O score dessa amizade pode ser feito por s = (1/(f1) + 1/(f2) + 1/(f3))

def influence_map(graph, user):
    friendsList = friends_of_friends(graph,user,2)
    bigList = dict()
    for friend in friendsList:
        commons = common_friends(graph,user,friend)
        bigList[friend] = 0
        for common in commons:
            bigList[friend] += (1.0/len(friends(graph,common)))
    return bigList
                                
def recommend_by_influence(graph, user,top):
    return number_map_to_sorted_list(influence_map(graph,user))[:top]

Vale lembrar que esse problema é simples em casos com poucos usuários, em casos gigantes não existem memoria que aguente e é preciso trabalhar com outras soluções como banco de dados, escutei boas recomendações sobre o neo4j.


Usuários de Teste no facebook

Sabe as vezes quando você quer testar aquele seu app com diversos usuários do facebook? Sim, existem uma forma fácil de fazer isso e é bem simples!!!

Supondo que você já possua um APP_ID o primeiro passo é pegar o Access_token do seu app, sim no facebook cada app possui um acess_token, não estou falando da senha de cada APP.
O acess_token você consegue da seguinte forma:
https://graph.facebook.com/oauth/access_token?grant_type=client_credentials&client_id=%5BAPP_ID%5D&client_secret=%5BAPP_SECRET%5D

Agora o momento de criar um usuário!

Campos para a criação do usuário:
1) Name
2) Locale, pt-BR, en-US ou qualquer outro locale valido..
3) permissions, o que seu usuário vai poder aceitar
4) acess_Token do APP

https://graph.facebook.com/%5BAPP_ID%5D/accounts/test-users?installed=true&name=%5BUSERNAME%5D&locale=%5BLocale%5D&permissions=read_stream&method=post&access_token=%5BBACCESS_TOKEN_ID%5D

Tb é possível remover, transferir o usuário para outros aplicativos e friend request…
E claro segue a documentação do facebook para esse caso
https://developers.facebook.com/docs/test_users/

Bom é isso por hoje!


Hello world com Google Chart

O Google Charts é uma forma fácil de se criar gráficos na web, sem a necessidade de utilizar FLASH, as vantagens são inúmeras entre elas podemos destacar: criação de gráficos dinâmicos, compatibilidade com diversas plataformas, gráficos customizados e o mais importante sua utilização é totalmente FREE. A galeria de gráficos é enorme, e podemos realizar combinações de charts.

Segue código Javascript para realizar um gráfico de pizza:

<html>
  <head>
    <!--Load the AJAX API-->
    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
    <script type="text/javascript">
    
      // Load the Visualization API and the piechart package.
      google.load('visualization', '1.0', {'packages':['corechart']});
      
      // Set a callback to run when the Google Visualization API is loaded.
      google.setOnLoadCallback(drawChart);

      // Função q carrega os dados e desenha o grafico em pizza 
      
      function drawChart() {

      // Criar tipo data table
      var data = new google.visualization.DataTable();
     //no caso do grafico  pizza possui duas colunas, com duas colunas
      data.addColumn('string', 'Bebida');
      data.addColumn('number', 'Quantidade');
     //linha da tabela
     data.addRows([
        ['Vodcka', 3],
        ['Cerveja', 2],
        ['Disco Voador', 1], 
        ['Tequila', 6],
        ['Jurupinga', 3]
      ]);

      // Options do chart, podemos alterar varios campos, segue a documentação de options para pizza, http://code.google.com/apis/chart/interactive/docs/gallery/piechart.html 
      var options = {'title':'Quantas bebidas o toshi bebeu', //titulo
                     'titleTextStyle': {fontSize: 16},//estilo do texto, é possivel alterar fonte e cor tb
                     'legend':{position: 'left', textStyle: {color: 'black', fontSize: 12}},//legenda 
                     'slices': {3: {color: 'black'}}, //personalizar a cor do slice
		      'width':500, //size
                     'height':200};

      // desenho do grafico
      var chart = new google.visualization.PieChart(document.getElementById('chart_div'));
      chart.draw(data, options);
    }
    </script>
  </head>

  <body>
<!--Div q deve ficar o chart-->
    <div id="chart_div" style="width:500; height:200"></div>
  </body>
</html>

O Chart fica dessa forma, (para verificar como realmente o gráfico fica em HTML clique no link abaixo):

Gráfico Interativo

É possível que o dado seja lido de forma dinâmica, fazendo chamadas no servidor, pode ser usado em formato JSON conforme o exemplo:

<html>
  <head>
    <!--Load the AJAX API-->
    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
    <script type="text/javascript" src="jquery-1.7.1.min.js"></script>
    <script type="text/javascript">
    
    // Load the Visualization API and the piechart package.
    google.load('visualization', '1', {'packages':['corechart']});
      
    // Set a callback to run when the Google Visualization API is loaded.
    google.setOnLoadCallback(drawChart);
      
    function drawChart() {

      var jsonData = $.ajax({
          url: "tabela.json",
          dataType:"json",
          async: false
          }).responseText;
         
      //Dado é lido do servidor!
      var data = new google.visualization.DataTable(jsonData);

      // Instantiate and draw our chart, passing in some options.
      var chart = new google.visualization.PieChart(document.getElementById('chart_div'));
      chart.draw(data, {width: 400, height: 240});
    }

    </script>
  </head>

  <body>
    <!--Div that will hold the pie chart-->
    <div id="chart_div"></div>
  </body>
</html>

Segue tabela em JSON:

{
  "cols": [
        {"label":"Bebidas","type":"string"},
        {"label":"Quantidade","type":"number"}
      ],
  "rows": [
        {"c":[{"v":"Vodcka"},{"v":3}]},
        {"c":[{"v":"Cerveja","f":null},{"v":1,"f":null}]},
        {"c":[{"v":"Disco Voador","f":null},{"v":1,"f":null}]},
        {"c":[{"v":"Canelinha","f":null},{"v":1,"f":null}]},
        {"c":[{"v":"Pinga","f":null},{"v":2,"f":null}]}
      ]
}

Link do gráfico gerado.

Todo o código foi retirado da documentação da própria Google, para maior aprendizagem sugiro dar uma lida. Acredito que boa parte do site Google Analicts foi feito utilizando essa ferramenta. Quem quiser se especializar, tem um milhão de formas de deixar os gráficos mais personalizado.


Dados governamentais abertos, e ai Zé?

Fiquei muito surpreso esses dias quando vi que finalmente o governo lançou a tão esperada plataforma de dados abertos do governo brasileiro. Dados abertos são de extrema importância para a democracia de um país,  não são somente indicadores prontos, os dados devem vir em forma bruta e bem granulado, possibilitando assim que a sociedade analise de diversas formas para diversos fins.

Segundo David Eaves os dados abertos devem seguir três conceitos fundamentais:

“1. Se o dado não pode ser encontrado e indexado na Web, ele não existe;
2. Se não estiver aberto e disponível em formato compreensível por máquina, ele não pode ser reaproveitado; e
3. Se algum dispositivo legal não permitir sua replicação, ele não é útil.”

Hoje a maioria dos sites  governamentais não seguem essas regras, um exemplo simples é site da ANP que fiscaliza de forma periódica o preço dos postos de combustível. E se por algum motivo quisermos fazer um aplicativo para facilitar essa busca por geolocalização?

Deêm uma olhada no endereço do site da ANP e o link para verificar os postos de gasolina da cidade.

Verificando o código compreendemos o que esta sendo feito, o município é inserido como valor de um form

E olhando o form vemos que ele esta fazendo uma requisição POST

Como podemos fazer algo que seja legível para a máquina com um link desses? Não temos um acesso simples como “../2011/1/gasolina/osasco” . A única forma de pegar essas informações seria a de criar um robô e percorrer o site de tempos em tempos e além disso não temos nenhuma opção para fazer o download em XML, CSV ou JSON. Infelizmente além do site da ANP existem muitos outros sites do governo dessa forma, inclusive sites de prestação de contas e  de pregão eletrônico.

Outros países já possuem plataformas de dados abertos, entre eles temos a do governo britânico e americano

Data.gov.uk

Esses dados possibilitam o desenvolvimento de diversos aplicativos, por exemplo no site de dados do governo britânico é possível você baixar um APP para o iphone que verifica a taxa de crime de uma determinada região, esses dados são fornecidos pelo próprio governo.

A plataforma brasileira ainda está no começo, foi desenvolvida utilizando o CKAN que é um portal open-source para dados.

Para quem curtiu o assunto vale a pena ver esse video:

http://opengovernmentdata.org/film/

#opendata from Open Knowledge Foundation on Vimeo.

E para quem estiver buscando dados governamentais pode consultar fontes como:

Vale a pena lutar por esse direito.


Hello world com a API do Facebook

O primeiro passo para entender a API do facebook, é dar uma boa lida na parte de Autenticação do Facebook. É bom dar uma olhada na parte das permissões, dentre as permissões mais interessantes temos:

publish_stream → permite o app publicar feeds na pagina do usuário a qualquer momento.

Caso queira testar um app é necessário o cadastro e possuir em mãos o APP ID e uma Secret key. A API do facebook não depende de nenhuma linguagem de programação, existem plugins em diversas linguagens que torna o trabalho mais fácil, eu já utilizei a Omiauth no ruby on rails.

Após a autenticação de um usuário no seu app você terá um “access token” que permiti utilizar as funções autorizadas pelo usuário. Esse token pode expirar em algumas horas ou nunca expirar, isso depende do tipo de permissão que foi aceita.

Vou mostrar alguns exemplos de como é possível utilizar a API para extrair dados e para publicar nos feeds, para os testes vou utilizar um APP desenvolvido pelo próprio Facebook chamado “Graph API Explorer”, o facebook utiliza estrutura de dados JSON.

Com o meu ID de usuário do facebook a única informação disponível sem um token são essas:

Primeiro irei solicitar um access token para algumas permissões

Com essas permissões posso obter as informações de likes, interesses e status do profile

segue um exemplo de uma chamada para ver os likes do usuário

o “/me” pode ser substituído pelo ID do usuário

Existem diversas permissões para tratar dados  dos amigos do usuário

Com essa permissão posso verificar o status do Mauricio Sako

Utilizando o ID do Mauricio posso verificar seus status.

Para fazer a publicação de conteúdo como o usuário é necessário solicitar uma autorização publish_strem.

Para o post de feed passo um parâmetro  e temos que fazer uma requisição POST.

Posso postar uma foto no album, o id é  do album que a foto será postada.

 

Lembrando que o request fica:

https://graph.facebook.com/me/likes?access_token=[access token] [GET]

Para post use o  CURL.

Bom é isso espero que tenha ajudado alguém.


Zoho

Muitos dizem que 2012 vem com tudo para ser o ano do boomm das SaaS, o Zoho já esta muito bem preparado, com mais de 27 aplicativos nas nuvens. Esses aplicativos possuem  integração com o Google apps, API de dados, traduções em diversas línguas, utilização offline e versão FREE.

Selecionei uma lista com alguns dos aplicativos disponíveis:

  • Writer: Processador de texto com muitas funcionalidades, aceita múltiplos usuários, possuí um bom sistema de controle de versões e aceita vários formatos de arquivos.
  • Sheet: Criação planilhas, excel
  • Show: Criação apresentações, powerpoint
  • Creator: Sistema de base de dados online, lembra algumas funcionalidades do Acces, aceita importação arquivos como .xls, .cvs. Possui uma interface simples do tipo drag and drop.
  • Projects:  Software para gestão de projetos possibilita a criação de tarefas, acompanhamento milestones, deadlines e gerar relatórios.​
  • ​Planner: Calendário com a possibilidade de criar eventos, alertas e todo list, é sincronizado com o Google Calendar.
  • Mail: Sistema de email.
  • Chat: Software para mensagem instantânea, suporta diversos sistemas conhecidos de IM.
  • Meeting: Aplicação de conferência na web, exibe slides controlado pelo conferencista.
  • CRM: Sistema de relacionamento com clientes
  • People: Sistema de RH para empresas
  • Wiki: Sistema para criação de Wiki, pode ser usada tanto de forma pública como privada.
  • Challenge: Sistema para a criação de testes online
  • Polls: Sistema para a criação de formulários.
  • Report: Relatórios online e serviços de bussiness inteligence.
  • Site 24×7: Monitoramento de sites.

Uma ponto positivo do Zoho é o fato desses aplicativos estarem na mesma plataforma, possibilitando uma completa conectividade, por exemplo o CRM se conecta com o Mail,Report, Meeting, Contacts do google app.

​ ​Vídeo que explica um pouco da conectividade com o Google apps:

​​Vale a pena conferir o que esses aplicativos podem oferecer para você ou para sua empresa.