Lancei (finalmente) esta semana o LikeFriends, o meu pequeno projecto de Verão. É um brinquedo social, engraçado como conceito, que apresenta dois rankings baseados nos likes e amigos do Facebook, um de amigos, outro de likes.
Eu podia dar motivações perfeitamente válidas como uma melhoria do ranking de amigos que o próprio Facebook faz (e mesmo esse está absurdamente escondido aqui, à direita – para se chegar lá, é preciso ir aos nossos likes e depois clicar em Sugestões, no topo) ou até como negócio; mas não: só encontrei o ranking (errado) do Facebook quando estava na fase de investigação deste projecto e o site do projecto não está, nem vai estar, monetizado.
Na verdade, fi-lo porque podia. Só isso. Há muito que queria experimentar umas coisas com métricas sociais, mas que fosse algo útil; ao mesmo tempo, andava a brincar com a API do Facebook e resolvi juntar as duas coisas. Ora, a única coisa que contém um espaço métrico no Facebook é a relação entre os likes e os utilizadores.
Versão TL;DR
Um ranking feito unicamente a partir dos likes que dois utilizadores partilham não é preciso.
Se eu tenho 50 likes e tenho 10 em comum com dois dos meus amigos, qual deles é o mais parecido comigo, o que tem 100 likes ou o que têm 500? Com um amigo que tem uma quantidade enorme de likes até seria de estranhar se não tivesse alguns em comum; por outro lado, se outro amigo tem tão poucos likes e mesmo assim tem alguns em comum comigo, quer dizer que, efectivamente, temos gostos muito mais semelhantes.
Temos, portanto, um espaço geométrico bidimensional constituido pelos likes de dois utilizadores. Infelizmente, é um espaço geométrico bastante aborrecido, porquanto ambos os eixos são meramente booleanos: para cada like, cada um dos utilizadores gostou ou não gostou. A distribuição dos pontos no plano é constiuída por um monte deles em (1,0)
, outro monte em (0,1)
e alguns em (1,1)
. Uma distribuição destas impede-nos de usar métricas mais avançadas (e exactas, para outro tipo de problemas), como a distância euclidiana ou o coeficiente de correlação de Pearson.
Não existem muitas métricas para dados booleanos; na realidade, eu só conheço um, mas, em compensação, é reconhecido por dois nomes: índice de Jaccard ou distância de Tanimoto. Enquanto a formulação do índice de Jaccard é consideravelmente fundamentada, com várias fontes, incluíndo a original do autor Paul Jaccard, a distância de Tanimoto não tem uma fonte oficial, e aparece aqui e ali em literatura e na web, mas o (suposto) documento original está desaparecido em combate. Além disso, algumas das formulações da distância de Tanimoto aparecem com algumas diferença consideráveis em relação a uma suposta derivação do índice de Jaccard. De qualquer forma, os dois nomes são aqui usados de forma intermutável.
A distância de Tanimoto é, então, o quociente do tamanho da intersecção de dois conjuntos de dados binários pelo tamanho da união desses mesmos conjuntos, conforme a fórmula seguinte:
Por uma questão prática, não tenho disponível, através da API do Facebook, os conjuntos completos de likes, nomeadamente os dos amigos do utilizador corrente. Por um lado, ainda bem – a quantidade de dados a tratar seria absurda. O que tenho é a quantidade total de likes do utilizador corrente (A), a quantidade total de likes do amigo em causa (B) e a quantidade total de likes em comum (C). Sendo que o dividendo é-me oferecido, resta-me calcular o divisor; tendo as quantidades totais dos dois conjuntos, basta subtrair o tamanho da intersecção. Como tal, a fórmula apresenta-se no seguinte formato:
Realmente, é só isto. A única coisa que me incomoda é porque é que, tendo acesso mais directo aos dados, logo, evitando algumas contas que eu tive que fazer, o Facebook apenas disponibilize a métrica menos relavante, por quantidade absoluta de likes em comum; e, mesmo assim, de forma bastante camuflada. Eu nem digo que estranho – percebo que seja uma opção de negócio, isto é, que o Facebook entenda que os seus utilizadores não iriam compreender a racionalização.