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

16 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;