A internet é imensuravelmente gigantesca. A onda de conteúdo disponibilizado nela alcançou um tamanho nunca antes imaginado. Com isso surgiu a necessidade de, em meio a esse oceano de informação, tornar o acesso bidirecional. Ou seja, ele não deve depender apenas da pessoa buscar a informação, mas da informação chegar à pessoa. Para esse fim, surgiram os algoritmos de recomendação: rotinas computacionais que fazem com que determinada informação chegue às pessoas baseando-se em diversos critérios.
Eu e você certamente fomos atingidos por eles em algum momento, pois estão em toda parte: sites de busca, redes sociais, lojas virtuais, etc., sempre determinados a oferecer a você o que te interessa.
Aqui, pretendo expor um pouco mais os aspectos envolvidos em tudo isso.
A filtragem dos algoritmos de recomendação
Se pudéssemos resumir algoritmos de recomendação a uma palavra, possivelmente ela seria “filtrar”. Sim, pois essa é a essência dele.
Há MUITA informação que ele pode te recomendar, mas é necessário filtrar tudo isso pra oferecer apenas o que te interessa.
Os exemplos mais comuns de algoritmos de recomendação estão relacionados às lojas virtuais.
Filtragem baseada em conteúdo
Exemplificando: eu tenho uma conta no site da Amazon e realizei a compra de diversos livros ali. Esses dias pesquisei um:
É um livro de arquitetura de software, do mestre Robert C. Martin, também conhecido como Uncle Bob.
Já comprei alguns do gênero ali há algum tempo, mas ultimamente tenho comprado mais livros de filosofia, política e economia.
Assim, ao navegar mais para o fim da página, o site fez algumas recomendações:
Uma lista de livros inspirada pelo histórico de navegação e uma lista baseada nas minhas últimas compras – que por sinal é bem diferente, já que minhas últimas compras foram de livros de outras áreas do conhecimento.
Ambas as listas são resultados de um algoritmo de recomendação.
Aqui está bem explícito os critérios usados para me recomendar esses livros.
Ela fez uma lista baseada na minha navegação e uma lista baseada nas minhas últimas compras.
No primeiro caso, ela verificou que eu ando vendo muitos livros de desenvolvimento de software, logo selecionou livros sobre esse assunto.
No segundo caso, ela notou que eu andei comprando livros de economia e política, logo selecionou mais livros desse assunto.
Em ambos os casos, ela fez uma filtragem baseada em conteúdo, onde o critério de recomendação dela se orientou pelo conteúdo do que seria recomendado.
“O Raphael anda vendo muitos livros sobre esse assunto, então vou recomendar mais estes aqui pois provavelmente ele vai gostar”,
pensou o algoritmo.
Nessa abordagem, o filtro precisa conhecer o domínio em que ele atua, ou seja, o algoritmo que roda em uma loja virtual de livros deve saber as características dos livros, de forma que consiga fazer comparações e retornar livros semelhantes.
O mesmo algoritmo não poderia ser transportado para uma loja de suplementos, pois se trata de produtos com características completamente diferentes.
Outro caso onde algoritmos de recomendação são bastante aplicados é em redes sociais.
>>Leitura Recomendada:
Sua API não é RESTful: Entenda por quê.
Filtragem colaborativa
Quando você segue alguém no Instagram por exemplo, em seguida ele abre um painel com sugestões de perfis semelhantes ao seguido. O Facebook faz o mesmo, sugere páginas ou pessoas para você.
Mas enquanto esse filtro do Instagram sugere perfis parecidos – ou seja, baseia-se em conteúdo – o Facebook apresenta tipos de filtragem adicionais. Por exemplo, vamos analisar o retorno da aba “Descobrir”, dedicada às recomendações:
Esta é uma filtragem colaborativa. Esse tipo de filtragem é definida pelo professor Paul Resnick, da Universidade de Michigan, da seguinte forma:
Sistemas de recomendação (por filtragem colaborativa) são sistemas que utilizam as opiniões de uma comunidade de usuários para auxiliar indivíduos desta mesma comunidade a identificarem conteúdos de interesse em um conjunto de opções que poderiam caracterizar uma sobrecarga
Nesse caso, note que dentre os grupos que a aba “Descubra” me recomendou, um deles é o Node JS Brasil. Nele há 3 amigos meus filiados.
Aqui houve uma filtragem colaborativa, que sugeriu um grupo baseado no fato de ter amigos meus ali.
“Tem alguns amigos do Raphael aqui, então acho que ele vai gostar desse grupo”,
pensou o algoritmo.
Porém, apenas isso é um pouco raso. É necessário explorar mais essa colaboração, considerando fatores em comum de mim com os meus amigos.
Todos nós somos desenvolvedores de software e, principalmente: gostamos de software.
Esses são pontos em comum que certamente influenciaram na sugestão. Assim, o algoritmo não só avalia meus contatos como também a similaridade com eles para concluir que, por eu ter gostos parecidos com eles e eles fazerem parte deste grupo, possivelmente eu gostarei deste grupo.
“Mas as vezes você gosta de software que nem os seus amigos, mas não gosta de Node JS”
você me diz.
Sim, isso pode acontecer. Considerar também o conteúdo evitaria isso. Assim, o Facebook poderia aplicar uma filtragem de conteúdo similar à da Amazon, baseada em navegação, para ter certeza que a recomendação será eficaz.
Se eu pesquiso ou falo sobre Node JS na plataforma, perfeito!
Saber disso complementaria ou se combinaria com a filtragem colaborativa visando ter uma recomendação mais eficaz.
>>Leitura Recomendada:
A importância da documentação de software
Filtragem Híbrida
Nesse caso, temos uma filtragem híbrida. Os defensores dela argumentam que ela dá uma maior assertividade à recomendação, já que evita casos como esses em que seus amigos são adeptos de algo que você não é.
Se vocês são amigos, podem gostar de software, mas não necessariamente de Node JS. Perfeitamente plausível. Então considere se no seu cenário vale a pena ter mais esse insumo para garantir que a recomendação é apropriada.
Contornando as barreiras iniciais
Como fazer uma filtragem baseada em conteúdo para sugerir algo a um usuário que não comprou nada ainda? Ou, como eu posso sugerir algum grupo se o usuário ainda não tem amigos na plataforma?
Isso é o que a comunidade chama de cold start, um “começo frio” na plataforma, um usuário meio distante e misterioso, que não conhecemos ainda.
Nesse caso a assertividade tende a ser menor, mas há formas de minimizar os erros.
Há algum dado do usuário, por menor que seja? Por exemplo, ao terminar o cadastro no site, você deve ter a idade do usuário e onde ele mora, certo?
O que isso pode te fornecer de insumo? Se o usuário tem 15 anos, será que se interessará por fraldas? E se tiver 50 anos, se interessará por desenhos animados? Se ele morar em uma cidade litorânea e quente, será que se interessaria por casacos de pele?
As respostas já podem dar uma base do que provavelmente não será bom recomendar.
Assim, ainda existe uma análise sociológica no nosso algoritmo, baseado nas associações que fazemos com os fenômenos mais frequentes.
Analisando os dados
Há exceções e minorias, mas elas podem ir se evidenciando por outros meios, como por exemplo a navegação e as compras.
De qualquer forma — nesse momento — um certo padrão pode ser considerado para, a partir dos poucos dados que você tem, fornecer um parâmetro inicial pro seu algoritmo se guiar.
Esses dados implícitos podem ajudar. Porém, considere obter dados explícitos. Nada melhor pra conhecer o usuário do que o próprio usuário dizendo, não é mesmo?
Assim, uma alternativa a considerar é obter dados por perguntar abertamente ao usuário quais os gostos e objetivos dele ao usar a plataforma. Isso pode te orientar de forma mais assertiva nas recomendações.
Uma das plataformas que fazem isso no cadastro do usuário é a Netflix. Para recomendar filmes, séries e documentários que te agradem, ela explicitamente pede que você informe seus gostos.
Logicamente que, com dados implícitos ou explícitos, é importante que o seu algoritmo comece, após uma análise inicial, a performar em cima de dados coletados com o uso do seu sistema pelo usuário. Na navegação, por exemplo.
Porém, uma discussão que tem se tornado frequente em torno disso é sobre a questão ética. Se atente a isso para evitar problemas jurídicos.
Se pergunte: os dados são confidenciais? Meus clientes sabem até onde eu estou indo nessa coleta de dados? A questão da privacidade e do uso de dados podem comprometer você se isso for ignorado.
>>Leitura Recomendada:
Cientista de dados: tudo o que você precisa para se tornar um!
Algoritmos de recomendação são multidisciplinares
O estudo de algoritmos de recomendação é uma área muito rica em termos de conhecimento, não só de exatas mas também de humanas.
Essas áreas incluem:
Software
Pois você precisa saber utilizar ferramentas de construção dos algoritmos;
Ciência de dados, matemática e estatística
Pois você lidará diretamente com dados e precisará saber como obtê-los, classificá-los e manipulá-los de forma a extrair informação deles, aplicando modelos matemáticos e estatísticos;
Sociologia e psicologia
Pois o seu algoritmo será eficiente somente se ele souber entender o interesse do usuário alvo.
De nada adiantará construir um bom algoritmo do ponto de vista técnico se a lógica que te orientou na construção dele não interpretar corretamente os interesses do usuário.
Por exemplo, será que faz sentido eu levar em consideração os gostos dos amigos do usuário? Será que faz sentido eu dar importância para a idade dele?
Enfim, essas são decisões pautadas em áreas do conhecimento de humanas e são muito relevantes pro sucesso do seu algoritmo. Não negligencie isso.
>>Leitura Recomendada:
Automatizando Testes com Python, Selenium e Behave
Análises com base em cálculos
Como dito, a área de matemática e estatística pode ser muito importante na construção de algoritmos de recomendação eficientes.
Considere a medida de correlação: Ela expressa qual a relação entre 2 fenômenos independentes pra que você, sabendo o que ocorreu em um, possa prever o que isso implicará no outro.
Exemplificando: há um caso famoso onde um mercado passou a vender mais cervejas a partir do momento que as posicionou perto das fraldas.
Qual a razão? Descobriram que geralmente quem compra fraldas são os pais e que eles, por serem pais, ficam em casa com seus filhos. Mas, pra não deixar de lado aquele gostinho bon vivant do bar, compram cervejas e tomam em casa vendo TV.
A prateleira de cervejas do lado das fraldas foi como a comida pro faminto. “Seria uma boa uma cervejinha hoje, né?”, pensa o pai quando vai comprar a fralda e vê as cervejas.
Percebe a análise comportamental e sociológica aqui?
Porém, vamos fazer uma análise de correlação que nos ajude a chegar a uma conclusão como essa com base em dados.
Quais seriam os fenômenos independentes aqui? Comprar cerveja e comprar fralda. A princípio eles não teriam nenhuma relação, certo? Quem imaginaria isso?
A aplicação de cálculos de correlação em uma amostra de notas fiscais pode expressar alguma correlação.
Usando o coeficiente de correlação de Pearson
Um cálculo passível de ser utilizado é a do coeficiente de correlação de Pearson, que nada mais é do que um cálculo desenvolvido pelo estatístico Karl Pearson.
Ele nos retorna um número entre -1 e 1 que, nesse caso, diria que há uma correlação entre a compra de fraldas e a de cerveja e que ela é positiva, ou seja, ao passo que se compra fraldas, aumenta-se a probabilidade de se comprar cervejas.
Logo, seria uma boa recomendar cervejas para o cliente – mesmo que indiretamente, simplesmente colocando os produtos perto um do outro.
Usando regras de associação
Há outra abordagem para o mesmo problema relacionada ao campo de estudo de mineração de dados (ou Data Mining): as regras de associação.
Dentre elas, a mais utilizada hoje em dia utiliza o algoritmo Apriori, que trabalha por meio de uma busca aprofundada nos dados gerando conjuntos de padrões.
Destes, selecionamos os mais frequentes e analisamos os níveis de support (quanto do conjunto de padrões contém os fenômenos), confidence (dentre as vezes que ocorreu um fenômeno, quantas vezes ocorreu o outro) e lift (o quanto um fenômeno alavanca ou potencializa a ocorrência do outro).
Essa análise pode nos levar às conclusões necessárias para recomendar algo ou não de forma simples, principalmente se utilizarmos uma linguagem como Python, que já contém bibliotecas prontas para aplicar este algoritmo.
Mas pode haver situações em que você deverá saber a similaridade de dois agentes da sua aplicação.
Utilizando a distância euclidiana
Por exemplo, considere uma rede social de filmes como a Filmow. Você deseja criar um algoritmo de recomendação baseado em filtragem colaborativa cuja lógica seria recomendar um filme a uma usuária chamada Anita e, para isso, se basearia nos gostos de seus amigos.
Afinal, é natural concluir que os amigos tem os mesmos gostos que ela e que, nos finais de semana, eles se reúnam para ver filmes.
Ali, cada filme tem uma avaliação. Uma possível abordagem para o seu algoritmo de recomendação seria calcular a distância euclidiana entre Anita e seus amigos e recomendar um filme bem avaliado pelo amigo mais próximo dela.
Mas o que é distância euclidiana? É uma das medidas de similaridade mais utilizadas em Data Mining, mais especificamente em técnicas de agrupamento e classificação de dados juntamente com outros algoritmos, como o K vizinhos mais próximos, por exemplo.
No nosso exemplo, essa técnica ajudaria a saber o amigo mais similar à Anita dentro de algum ponto de vista passível de ser quantificado por números – que no caso, seria a nota dos filmes.
Por exemplo, você quer recomendar um filme para a Anita. Assim, você utilizaria no cálculo da distância euclidiana as notas dadas por ela para os filmes que ela viu e as notas dadas pelos seus amigos para os mesmos filmes.
O amigo mais próximo – ou seja, com a distância menor – seria aquele cujas notas são mais parecidas com as de Anita.
Aplicando, chegamos ao João. Baseado nisso, você pode recomendar um filme que João gostou para a Anita – logicamente que Anita não tenha visto ainda.
Usando a medida de similaridade de cossenos
Uma alternativa à distância euclidiana é a medida de similaridade de cossenos, (ou Cosine Similarity).
Ao invés de calcular a proximidade entre dois agentes (Anita e João), calculamos a similaridade entre conjunto de agentes.
Isso seria recomendado quando interessa a você analisar o quão similares são Anita, João e Jéssica por exemplo. Isso envolveria usar uma lógica de vetores em geometria analítica, onde seria calculado o ângulo entre eles.
Usando o Coeficiente de Jaccard
E por fim, mais técnicas de medida de similaridade envolvem o uso do Coeficiente de Jaccard e de Bray Curtis para análise de dados e construção de dendrogramas.
Este cálculo obtém, dentre uma amostra, uma proporção de agentes de determinada espécie ou tipo.
Eles são usados em conjunto com dendrogramas para gerar uma saída com estrutura em árvore, cujas raízes contém os agentes mais próximos (ou similares) e, ao passo que se sobe nela, há o encontro com outros agentes próximos, apontando alguma similaridade.
Como aplicar algoritmos de recomendação na prática
Como visto, há muitas abordagens matemáticas e estatísticas que podem ser utilizadas nos algoritmos de recomendação para aprimorar a sua eficácia. Porém, a forma como você aplica isso na prática varia.
Usando Machine Learning
Uma abordagem muito utilizada é com Machine Learning, onde o programador utiliza uma base de dados existente com um histórico de padrões que serviria como “lições” e constrói um modelo de aprendizado a partir delas, que seria utilizado numa fase de “treinamento” do sistema.
Dessa forma, após isso ele será capaz de, dado um cenário específico, prever o resultado adequado.
Assim, o seu sistema aprenderia os padrões mais comuns dentro do seu domínio (loja de livros, por exemplo) de tal forma que ele pudesse fazer recomendações de forma mais eficaz.
Se ele errar (usuário sequer ver o livro), isso também serviria de aprendizado.
É análogo ao que acontece conosco.
Nós criamos um certo padrão por regras de associação que acumulamos com a nossa experiência de vida e, assim, se fôssemos fazer uma recomendação a alguém, usaríamos ela em conjunto com o que conhecemos dessa pessoa.
Se for uma recomendação ruim, aprendemos com isso.
>>Leitura Recomendada:
Os algoritmos de machine learning
Utilizando softwares
Outra opção seria utilizar um software “convencional”, que decidisse a recomendação a ser dada ali, time to market, na hora.
Isso envolveria consultar dados e processá-los, utilizando de todas as técnicas que abrangemos aqui.
Dependendo da complexidade do seu negócio, esse processo pode ser extremamente custoso computacionalmente, tanto em consumo de memória quanto em processamento.
Memória, pela quantidade de dados que necessitarão estar nela. E processamento, pela quantidade de rotinas que serão executadas para realizar essa análise.
Imagine, por exemplo, que você queira fazer uma recomendação baseada em filtragem colaborativa para um usuário com muitos amigos.
O custo computacional de aplicar essas técnicas a todos os amigos deles é enorme.
Assim, será necessário que você elabore alguma estratégia de otimização, talvez classificando previamente os amigos mais próximos para eliminar passos ou trabalhando com amostras.
Também é altamente recomendável que se faça benchmarks e análises de performance nos cálculos que você deseja aplicar, como esse estudo da Revista Brasileira de Computação Aplicada mostra, por exemplo.
De qualquer forma, todos esses desafios exigirão um skill forte em arquitetura de soluções.
Conclusão
Neste artigo, vimos o que são algoritmos de recomendação e alguns aspectos conceituais importantes em sua construção.
Desde os tipos de filtragem até as suas diversas áreas de estudo, principalmente matemática e estatística, onde aprofundamos um pouco mais a respeito de algumas técnicas.
Por fim, vimos um pouco dos desafios envolvidos. Afinal, tudo tem o seu preço – e este não é nada barato.
De qualquer forma, eu acho algoritmos de recomendação um assunto extremamente interessante, principalmente por visitar diversas áreas do conhecimento, inclusive de humanas.
Isso sem falar de que a cada dia ele é mais utilizado.
Pretendo, em um próximo artigo, aprofundar um pouco mais em alguns aspectos de construção que aqui foram abordados mais superficialmente, por razões de tamanho.
Há muitas técnicas que podem ser utilizadas, incluindo algoritmos genéticos, matrizes esparsas e outras. Mas creio que o conteúdo exposto já dá uma boa base inicial.