AWS

4 jun, 2014

Como funcionam sistemas de recomendação e subindo Neo4J na nuvem

Publicidade

Olá! Hoje veremos um pouco sobre o funcionamento de sistemas de recomendação. Claro que sistemas como os exemplos citados abaixo são muito mais complexos, porém dá para dar uma entendida entre os tipos e como começar a fazer um bem simples.

Para ajudar o entendimento de todos, eu gostaria de passar o conteúdo de uma palestra que fiz junto com o texto. Segue os slides do artigo: Sistemas de recomendações e neo4J na cloud computing.

Projeto de exemplo: sugestão de repositórios do GitHub

Primeiramente, o meu problema: existe o GitHub – se você não conhece, corre lá. Ele é um servidor que hospeda projetos que usam Git para versionamento e ainda por cima serve de rede social para programadores. Os códigos open source lá hospedados são abertos para ler e aprender. Você pode seguir uma pessoa, comentar o código dela, forkar, ou seja, fazer uma cópia para programar em cima do código dela, e depois mandar seu código para sugestão.

Na verdade, há muitas coisas para se fazer no GitHub, esse é só um exemplo. O legal é ler código e ver a evolução, e assim aprender.

Tenho um amigo, o Alexandre, que vive mostrando repositórios de código legais para ler, seguir e contribuir. Um dia eu perguntei como é feita essa pesquisa por repositórios, e saiu essa conversa:

Priscila: Alexandre, como você acha repositórios legais?

Alexandre: Eu sigo pessoas e vou vasculhando o que elas seguem ou contribuem.

Priscila: Seria legal ter uma forma fácil de encontrar repositórios, né? Acho que vou fazer uma.

Alexandre: Se você fizer mostra pro pessoal, será de grande ajuda.

Não foi exatamente assim porque faz séculos essa conversa lá no Twitter, mas essa é a ideia. Porém, como fazer um sistema de recomendação?

Como são feitos os sistemas de recomendações

Você conhece sistemas de recomendações, uma vez que é um tem básicos em e-commerce. A Amazon virou referencia em e-commerce e um dos motivos foi a recomendação de produtos. O Google também é ótimo nisso, com base nas suas pesquisas anteriores e gostos pessoais ele altera a ordem dos resultados de busca, sabia?

Existem também sistemas de recomendações que fornecem esse como seu principal serviço, como o Last.fm, que te recomenda shows, músicas e bandas, além de amigos com gostos musicais parecidos com os seus.

Existem basicamente dois tipo de mecanismos de sistemas de recomendações, veremos o básico de cada um:

Baseado em conteúdo

O mecanismo baseado em conteúdo busca itens parecidos para sugerir. Por exemplo: uma pessoa que compre uma cafeteira pode querer uma torradeira. São itens próximos e que dá para sugerir. Existem algoritmos de análise de conteúdos parecidos, como o algoritmo dos Vizinhos Mais Próximos, o Content Matching, ou o Content-plusLink que usa linques entre os conteúdos, como os que podem ser usados em uma rede social.

Esses algoritmos leem a descrição ou, normalmente, usam tags para indicar os conteúdos, por exemplo: a cafeteria tem a tag “Cozinhar” e a cafeteira também tem a tag “Cozinhar”, logo o algoritmo entende que são itens parecido e dá sugestão entre eles.

Outra forma é a sugestão manual usando links ou tags. Como funciona: uma pessoa cadastra os itens e indica quais são parecidos. Isso é algo braçal e demorado, e acreditem, a poucos anos alguns e-commerces eram feitos com essa técnica.

A vantagem é ter menos informação, só tags ou só os itens mesmo.

Baseado em filtragem colaborativa

O mecanismo baseado em filtragem coletiva analisa mais dados antes de sugerir um item, depois cruzam os dados. Por exemplo:

“Se um usuário gostou de A e de B, um outro usuário que gostou de A também pode gostar de B”, Renata Ghisloti.

Bom, então você relaciona dados dos itens, dos usuários e as relações entre eles (como por exemplo gostar). Opção prática seria selecionar itens que as pessoas próximas se relacionam da mesma forma (ex: filmes que meus amigos curtiram).

Existem alguns algoritmos buscam relações entre itens e usuários, por exemplos: Slope One, Friend-of-Friend, SONAR.

Banco de dados de grafos na nuvem

Como fazer um sistema de recomendações simples sem usar tanta complexidade? A resposta é usar uma base de dados de grafos. Podemos usar o número de relações para classificar um item para ser indicado. Por exemplo, três itens, um A, um B, e um C possuem ligações com usuários do tipo “curtiu”. Se muita gente curtiu produto A e C ao mesmo tempo, ao pegar um único usuário que curtiu item A e formos sugerir um novo item, vamos sugerir o item B ou o item C? O C, né?! Porque quem gosta de A tem um gosto parecido com quem gostou de C.

Para isso facilita usar banco de dados de grafos. Claro que você pode usar algoritmos mais complexos para misturar uma base de grafos com uma clássificação de conteúdo, por exemplo.

Se você esqueceu o que é base de dados de grafos confira outros post sobre Graph DB.

Bom, mas chegamos ao ponto chave do artigo: como colocar uma base de dados de grafos na nuvem. Para isso eu escolhi o Neo4J, uma base bastante usada e com suporte a muitas linguagens e arquiteturas.

Bom, existem formas diferentes, então vamos para as receitas de bolo:

Usar um serviço já existente

Existe o serviço chamado GRapheneDB, um serviço de Neo4J rodando em cima da nuvem da Amazon. Após o cadastro você recebe 512MB gratuitos para testar e estudar. Suporta o acesso usando a REST API e o Gremlin.

Devem existir outros serviços, esse é apenas um indicado na página do Neo4J. Eu fiz minha conta e achei bem simples de usar.

Subir uma máquina e instalar o Neo4J

Outra opção é escolher seu serviço de nuvem favorito, instanciar uma máquina e instalar o Neo4J. Depois disso é só dar o start no servidor com o seguinte comando:

start neo4j

A segui uma imagem com os códigos para instalar e iniciar em um servidor Debian/Linux:

comandos-neo4j

Subir uma instância automática mente com puppet

Para usuários de Amazon Web Services existe um template do Neo4J na qual você pode iniciar um serviço Cloud Information de forma rápida.

Primeiro você precisa ter uma conta na AWS. Depois vá no painel do Cloud Information e escolha adicionar um novo stack, depois disso você pode ir na tela de configuração do seu novo stack e adicionar um nome e indicar que está usando um template para a criação do serviço.

O template que você vai usar é o fornecida pela própria Neo4J. Atualmente o endereço do template é este: https://cf-templates.neo4j.org.s3.amazonaws.com/cf_template.json porém desde o ano passado eu já vi o endereço mudar algumas vezes.

Adicione um keyValue Tag e o resto é só Next, Next, Finish. Você pode editar o arquivo json do template, para por exemplo escolher a região da instância e enviar do seu computador o arquivo e não da URL. Em seguida pode adicionar um usuário e senha ao serviço e continuar. Depois disso você terá que esperar o serviço subir. Demora alguns minutos.

stackService

Subindo no Windows Azure

Existem algumas formas simples de subir um Neo4J no Windows Azure. Você pode fazer da forma tradicional:

  • Inicie uma instancia;
  • Instale/Configure o Java;
  • Instale o Neo4J Server;
  • Inicie o Server;
  • Configure o Firewall da sua instancia para aceitar acesso remoto (selecione um IP de onde ficará sua aplicação).

Ou você pode usar uma Solution especifica para isso:

  1. Crie uma conta no Windows Azure;
  2. Instale o Azure SDK no Visual Studio;
  3. Baixe a solução pronta do Neo4J.Azure.Server;
  4. Configure o Java no Azure;
  5. Deploy da solução que você baixou do Neo4J no Azure.

De ambas as formas é fácil de se fazer.

Quem quiser manualmente usar o Azure SDK e subir Java a mão, pode usar esse tutorial em inglês:

Acessando a base de dados

Depois disso você vai receber um endpoint com o ip do banco. Em alguns serviços de cloud como o Azure você precisa configurar o Firewall para acesso remoto. Não esqueça!

Com esse endpoint você vai poder conversar com o banco. Com o Neo4J podemos trabalhar inteiramente com REST. Você vai ver alguns exemplos nos slides, mas outro dia faço um post detalhado sobre como trabalhar com a api REST do Neo4J.

Agora é com você: ter sua ideia e implementá-la na nuvem. Se fizer, comente o que fez!