segunda-feira, 25 de fevereiro de 2008

Como fazer um Sistema de Recomendação simples e rápido!

Hoje em dia a criação de perfis de usuário em sites é muito comum. Antes mesmo de você usar um serviço você já contou metade da sua vida para o Banco de Dados do outro lado. Na maioria das vezes estes dados ficam parados, enquanto podiam ser usados para melhorar a experiência do usuário. Para aproveitar melhor o que você diz na hora do cadastro, vou mostrar aqui um método muito simples de desenvolver um Sistema de Recomendação que pode servir para várias finalidades.

[Matemática]
O método consiste basicamente em calcular a distância entre dois pontos. Isso mesmo, um pouco de geometria! Para isso iremos utilizar a fórmula da Distância Euclidiana. (Não se assustem com a fórmula)

Considerando dois pontos:



Temos a fórmula:


O algoritmo é bem simples, basta pegar uma coordenada de um ponto, subtrair com a mesma coordenada do outro ponto e elevar o resultado ao quadrado, soma-se esta operação para cada coordenada e por fim tira-se a raiz quadrada. 'n' é o número de coordenadas e no nosso caso vai ser o número de características do produto.

O resultado desta fórmula vai ser um número positivo. Quanto mais próximo de zero, mais perto estão os dois pontos. (zero significa pontos iguais)

[/Matemática]

Começando a recomendar produtos!

Tá! Muito legal esse monte de números. Mas como meu sistema de recomendação vai dizer que um cara que gosta de uma banda de Rock não vai querer saber do novo CD solo da Cláudia Leite do Babado Novo (já lançou?).

Para isso, usa-se a discretização, um nome tosco e feio para dizer que palavras viram números. Por exemplo, considerando gêneros de música podemos dizer que:

Axé = 1
Pagode = 2
Forró = 3
Sertanejo = 4
Pop = 5
Rock = 6
Metal = 7

Pode-se fazer para faixas de preço também:

R$1-5 = 1
R$6-15 = 2
R$16-30 = 3
R$31-50 = 4

Percebam que eu tentei colocar estilos parecidos com números próximos (Rock e Metal por exemplo). Isso melhora bastante as recomendações. (se não entenderem por que, me perguntem)

Então:
Dado um Perfil de usuário: (6,1). Ou seja, que gosta de rock e é um duro sem dinheiro.
Dado as características de um CD: (1,4). Ou seja, novo cd da Cláudia Leite e muito caro.

Fazendo a distância euclidiana entre estes dois pontos (6,1 e 1,4) consegue-se medir a "afinidade" entre o perfil do usuário e aquele produto. Ao fazer este mesmo cálculo entre o perfil de um usuário e todos os produtos de uma loja, por exemplo, é possível fazer um Rank dos produtos que ele tem maior afinidade e, quem sabe, vontade de comprar.
No final das contas, o perfil de um usuário e as características de um produto serão representadas por um vetor de números ([1,4,6,1,2,3]).


Melhorando as recomendações

É possível e recomendável dar mais importância para características mais importantes (claro né!) O gênero de um jogo provavelmente é mais influente que a presença ou não de multiplayer. Para representar isto, basta multiplicar o termo correspondente a característica por um número (quanto maior, mais importância), por exemplo: 5*[(p1+q1)^2].

Experiência própria

Nos meus testes eu usei uma base de Games. Coloquei as seguintes características para eles: Gênero, faixa etária, se tem multiplayer (0 ou 1), para qual console. Cada característica tinha a sua própria discretização no estilo da mostrada acima.

A minha base de Games tem 100 jogos cadastrados e também tenho um sistema em PHP para cadastrar e ver as recomendações que ainda vem com uma mini rede social (mini mesmo) que cadastra, pesquisa, adiciona amigos e faz recomendação de produtos para eles. Quem quiser, pode me mandar um e-mail ou comentário que eu envio. De qualquer modo, devo atualizar e colocar o link aqui.


PS: Eu gosto de rock, não tenho dinheiro mas eu não gosto de Axé!!
PS.2: Qualquer dúvida, pode perguntar!


Artigos que tem alguma coisa a ver com este post:

Como funciona uma Máquina de Busca?
5 dicas simples para aumentar a sua produtividade

24 comentários:

Micox - Náiron J. C. G. disse...

Umm, muito interessante. Nunca tinha pensado pelo lado "matemático" da coisa.

Érico Oliveira disse...

Um sistema desse exibindo anúncios no Orkut seria impressionante!

Felipe Hummel disse...

Fala Érico!

O Facebook começou a usar anúncios com base no perfil do usuário mas parece que não ficou muito legal não. hehehe

Abraço!

Anônimo disse...

Olá, como vai?

sou Reginaldo.

Bem interessante seu artigo.
Também venho trabalhando com sistemas de recomendações.
Gostaria de trocar umas idéias com você.

Pode me escrever?
reggotardo@gmail.com

abraço e obrigado

Cayo Medeiros aka. yogodoshi disse...

Meus parabéns pelo post!
Nunca tinha visto um tutorial desse tipo, você explicou um sistema de recomendação apenas com lógica de programação (e um pouco de matemática né =p ).

Abração!

Felipe Hummel disse...

Valeu Cayo!
A intenção for explicar da maneira mais simples possível, hehe!

Abraço!

Guilherme Serrano disse...

Hummel, já te falei que tu é um gêniozinho do mal?

hahaha

Um sistema de recomendação inteligente baseado em comprar em um e-commerce é aumento nas vendas certamente. Muito legal o jeito que tu explicou como funciona!

Abracetas

Felipe Hummel disse...

Opa Guilherme!
Hehehe, espero que isso tenha sido um elogio! uheheuhe


Um Sistema de Recomendação é algo relativamente simples de se implementar, só tem que ser bem feito, e de fato pode mostrar anúncios mais interessantes para o usuários.

O Submarino faz algo legal, mas ele usa Mineração de Dados, mas é diferente.

Depois de fazer umas pesquisas vou ver se faço post mostrando outras maneiras mais "Sérias" de fazer sistemas de recomendação, esse que eu mostrei é mais light hehehe.

Abraço!

Pedro Menezes disse...

Bem legal o tutorial. Tudo mastigadinho... Se estivesse em inglês, estaria na capa do Digg!

Um abraço. :)

elomar disse...

Gostei pra caramba desse tutorial. Eu nunca ia imaginar fazer um sistema de recomendação usando "Distância Euclidiana". Ficou tão simples que assusta. =D

Esse projeto que você falou, tinha como me mandar? tô dando uma estudada em php, ia me ajudar bastante.

Elomar França
elomar.f@gmail.com

vlw

Daniel disse...

Hi,
I have implemented a photo recommendation system ( http://www.photoree.com ) and I guarantee you it is way more complicated than just using euclidean distances ;)

Felipe Hummel disse...

Hi, Daniel. I didn't said that this is the only way to implement recommendation systems ;) It's probably the easiest way.

That are plenty other recommendations heuristics.
Using data mining, Information Retrieval e etc...

Thanks for the comment and I'll check your site.

Andreas disse...

Olá Hummel,

Estou criando um sistema de recomendação musical, baseado em tags e gêneros e estilos.

Mas sinceramente ainda não peguei a coisa... Você teria alguma coisa para indicar? Um caminho a seguir?

Felipe Hummel disse...

Opa Andreas!

Adiciona aih felipehummel@gmail.com, q a gente conversa melhor.
Sistemas de recomendação tem muita coisa que pode fazer.

Oq a maioria dos sistemas fazem é usar mineração de dados pra isso.

Abraço

Klawztro disse...

Cara genial! manda pra mi o sistema se for possível, por favor!
kawz86@hotmail.com

rogerim disse...

interessante e muito útil, esta de parabéns.

voce teria algum demo para estudos?
basico mesmo.

favor enviar caso tenha para: geriofilho@gmail.com

agradeço;

Paulo disse...

Olá Hummel,

Preciso criar um sistema de recomendação para a faculdade, só que não faço idéia de como farei isso.

Será que você poderia me indicar alguma coisa?

Meu e-mail é: paulo.araujob100@gmail.com

Grato...

DMB disse...

Oi Hummel,
Estou estudando sobre sistema de recomendação para aplicar em uma rede social, como proposta para meu estágio e tcc na facul, será que teria como eu trocar algumas idéias com vc?
Se puder me adicionar ou indicar alguma coisa.

Meu email é: infodeise@gmail.com

Flor disse...

Oi,
To começando agora a estudar sistemas de recomendação, e achei sua postagem muito interessante e esclarecedora.
Gostaria que vc me enviasse o sistem a em PHP que vc comentou no posts, e qualquer coisa legal que vc tenha por aí, rs.. =) .. artigo, link, oq quiser.
Obrigada pela atenção.
Bjs;*

Jaq.

AlexandreG. disse...

Cara, muito bom o seu Post! Parabéns!!

Queria pedir, que me mostrasse o seu sisteminha para eu poder estudá-lo e poder criar o meu próprio sistema de recomendação. No aguardo, obrigado.

Will disse...

Cara, poderia me mandar isso, se vc ainda tiver? Hehehe

willmetalangel@gmail.com

Grato

Paulo Andre disse...

Olá, Hummel,

estou estudando SR para um possível tema de mestrado, você teria o link da sua aplicação ou indicaria algum local de repositório aberto que eu pudesse ter acesso a outras aplicações?

Abs.

Daivid Alves disse...

Tenho interesse nesse sistema de recomendações. Peço que me envie o sistema. No aguardo, obrigado.
daivid_as@hotmail.com

Gabriel Pantaleão Sarraff disse...

Olá Hummel,

Sei que faz tempo essa postagem, mas se ainda tiver seu sistema de recomendação gostaria de estudá-lo para eu ter algumas ideias para o meu TCC que nele inclui uma feature de recomendação. Até se quiser, eu te aviso quando ele estiver pronto.

Obrigado,
gpsarraff@gmail.com