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