Para continuar a ter relevância em um segmento global e de ritmo acelerado, os profissionais técnicos
precisam acompanhar as grandes tendências em TI e encontrar maneiras de incorporar as tendências importantes
ao portfólio de tecnologia de suas empresas.
Uma dessas tendências é o
uso de mecanismos de recomendação a fim de
conduzir os usuários para explorar outras ofertas de seu Web site ou
negócio. Esses mecanismos fornecem recomendações aos usuários com base
em vários padrões e são úteis em orientar os usuários a considerar as
ofertas que, de outra forma, eles não conheceriam, com base em seus
hábitos de uso específicos.
Alguns Web sites bem populares usam bastante os
mecanismos de recomendação. Visitantes do Amazon ou do Netflix, por
exemplo, normalmente veem recomendações personalizadas como “Se você
gostou desse item, talvez também goste deste…” Esses sites usam
recomendações para ajudar a conduzir os usuários (e a gerar receita) a
outras coisas que eles oferecem de uma forma inteligente, significativa,
personalizada especificamente para o usuário e de acordo com as suas preferências.
Mesmo se o seu negócio não oferecer livros ou filmes,
pode haver muitas razões para implementar algo parecido. É possível
recomendar produtos relacionados fornecidos por seu negócio,
especialmente se você tiver um amplo portfólio de ofertas. É possível
oferecer recomendações para conceitos mais abstratos, como páginas
relevantes que você gostaria que o usuário visitasse, uma lista de
serviços populares, oportunidades educacionais para inscrição, ofertas
especiais ou o acesso a documentos de suporte técnico úteis.
Em vez de tentar adivinhar em que sua base ampla de usuários está interessada,
a personalização por meio de recomendações permite identificar o que os
usuários individuais gostam e não gostam de forma discreta e inteligente,
e usar essas informações para personalizar a experiência de cada usuário. A tarefa de
recomendar uma nova escolha com base no comportamento passado é bastante usada
em muitos aplicativos e segmentos e, portanto, esse é o exemplo que usaremos ao longo deste artigo.
Apache Mahout é um mecanismo de recomendação de código
aberto que fornece uma boa aplicação desses conceitos e é pequeno, mas
poderoso o suficiente para implementar em casos de negócio de pequeno e
médio porte.
Este artigo descreve como integrar o Apache Mahout V0.5 ao
IBM WebSphere Application Server V8 usando o IBM Rational Application
Developer for WebSphere Software V8.0.3. Ele começa com uma visão geral
dos mecanismos de recomendação, descreve o Apache Mahout em alto nível,
explica como é possível integrá-lo ao WebSphere Application Server e ao
Rational Application Developer, e oferece algumas etapas adicionais
para descobrir mais sobre essa tecnologia.
Visão geral de um mecanismo de recomendação
O principal objetivo de um mecanismo de recomendação é fazer
inferências sobre dados existentes a fim de mostrar relacionamentos
entre os objetos. Os objetos podem ser muitas coisas, incluindo
usuários, itens, produtos e assim por diante. Os relacionamentos
fornecem um nível de semelhança ou propriedade entre os objetos. Por
exemplo, os relacionamentos podem representar avaliações de quanto um
usuário gosta de um item (escalar) ou indicam se um usuário marcou uma
página específica como favorito (binário).
Para fazer uma recomendação, os mecanismos de recomendação realizam
diversas etapas para explorar os dados. Inicialmente, você começa com
dados de entrada que representam os objetos e seus relacionamentos. Os
dados de entrada são compostos por identificadores de objeto e os
relacionamentos com outros objetos. A figura abaixo mostra isso em alto
nível.
O panorama completo
Considere as avaliações que os usuários dão aos itens. Usando esses
dados de entrada, um mecanismo de recomendação computa uma semelhança
entre os objetos. A computação da semelhança entre os objetos pode
consumir muito tempo dependendo do tamanho dos dados ou do algoritmo
específico.
Algoritmos distribuídos como o Apache Hadoop podem ser
usados para paralelizar a computação de semelhanças. Há tipos diferentes
de algoritmos para computar as semelhanças. Finalmente, usando as
informações de semelhança, o mecanismo de recomendação pode fazer
solicitações de recomendação com base nos parâmetros solicitados.
Talvez você acreditasse que os mecanismos de recomendação
eram úteis, mas não tentou usá-los por pensar que fossem muito
complicados. O domínio do mecanismo de recomendação é, na verdade,
grande e pode ser bastante complexo. Felizmente, há ferramentas
disponíveis que facilitam a exibição dos conceitos necessários dentro do
tempo e espaço de um único artigo.
Melhor ainda, depois de aprendidas,
essas mesmas ferramentas podem ser usadas para aplicar a lição ao mundo
real. Os designers do Apache Mahout fizeram da escalabilidade e
disponibilidade uma parte central do projeto, de modo que você possa
desenvolver sua solução à medida que suas necessidades aumentam.
Há algumas decisões importantes a serem tomadas quando você decide
começar a personalizar seu aplicativo e deseja usar o mecanismo de
recomendação:
- Qual algoritmo aplicar
A decisão mais importante a ser tomada é qual algoritmo aplicar em
seus dados. A seleção do algoritmo depende do que você deseja
identificar e qual tipo de relacionamento
é especificado em seus dados. Algumas das abordagens comuns usadas
para recomendações incluem:
- Filtragem colaborativa: essa
abordagem depende da interação social entre os usuários. As
recomendações têm base nas avaliações fornecidas por outros usuários. - Cluster: com essa abordagem, o
mecanismo de recomendação tenta desenvolver recomendações com base nas
semelhanças entre os usuários ou o s próprios itens. - Categorização: essa abordagem
agrupa automaticamente os itens em categorias usando atributos comuns.
Na categorização, o computador tenta classificar todos os itens.
Este artigo se concentrará na filtragem colaborativa para ajudá-lo a
saber mais sobre os aspectos sociais de seus usuários; esse também será
um bom ponto de partida para a adição de recomendações aos aplicativos
da Web.
A filtragem colaborativa é uma técnica fácil e popular. É fácil
porque seus clientes fazem o trabalho importante para você – eles
conduzem os critérios do que você deseja destacar. A filtragem
colaborativa analisa as avaliações de outros usuários ou itens para
fazer as recomendações.
Há duas abordagens na filtragem colaborativa: a
principal diferença entre elas está na habilidade de escalamento de
cada uma à medida que o número de usuários no sistema cresce:
Recomendação com base no usuário: Esse tipo de recomendação constrói semelhanças entre
os usuários analisando as semelhanças dos itens avaliados por cada
usuário. Por exemplo, se os itens forem cursos, dois usuários poderão
ser considerados bastante parecidos se ambos tiverem participado dos
mesmos cursos. Na outra extremidade, a semelhança seria pequena se eles
não tivessem feito cursos parecidos. Para fazer recomendações, os
algoritmos dependem das avaliações que usuários semelhantes fazem desses
cursos que não foram realizados pelo usuário. Essa recomendação é a
mais básica; no entanto, sua principal limitação é que para gerar as
semelhanças, ela precisa comparar cada usuário a todos os outros
usuários. Isso é aceitável para um aplicativo com um número baixo de
usuários, mas se o número de usuários aumentar, o tempo para realizar
essa avaliação aumentará exponencialmente.
Recomendação com base em item: A recomendação com base em item, por outro lado, começa
com a análise dos itens associados ao usuário. Para cada item associado
ao usuário, o algoritmo computa o nível de semelhança com outros itens
na coleção a fim de desenvolver a lista de recomendações. Para
determinar a probabilidade de o usuário gostar de um item recomendado, o
algoritmo analisa as avaliações que o usuário fez do item e concede uma
avaliação ponderada a cada item recomendado. O principal problema com a
recomendação com base em item é que ele precisa desenvolver um índice
de semelhanças para cada item disponível. No entanto, mudanças nos
itens são menos frequentes do que mudanças em usuários e, portanto, é
viável com esse tipo de recomendação pré-computar as semelhanças
off-line e atualizá-las em períodos específicos.
- Como escalar o processo para seus usuários
O processo real de calcular a semelhança entre usuários e itens é uma operação intensa. Dependendo do tamanho de seu conjunto de dados, a operação pode demorar de alguns milissegundos a vários minutos. Ao trabalhar com aplicativos com base na Web, o tempo de resposta se torna um problema se os usuários precisarem aguardar por um período maior para receber uma recomendação.
Embora seja possível computar as semelhanças entre os usuários e os itens em tempo real, é necessário avaliar isso cuidadosamente ao trabalhar com conjuntos de dados maiores. Para as abordagens de recomendação com base em item e em usuário as melhores práticas recomendam executar esses cálculos off-line se os conjuntos de dados forem maiores (por exemplo, mais de 1 milhão de classificações).
O uso dos cálculos off-line se torna factível nos casos em que novos itens são adicionados com pouca frequência ou os usuários classificam os itens ocasionalmente, pois as similaridades precisam ser calculadas apenas quando um novo item é adicionado ou uma nova classificação é aplicada a um item. Nesse tipo de cenário, o mecanismo de recomendação pode trabalhar usando as similaridades que devem ser consequentemente consistentes.
Uma abordagem para pré-calcular as similaridades off-line é alavancar os recursos de cálculo distribuídos de produtos como o Apache Hadoop, uma implementação de software livre da técnica do MapReduce. Essa é a razão pela qual frequentemente você ouvirá sobre esses sistemas mencionados juntamente com mecanismos de recomendação. Caso esteja tentando realizar a recomendação com base em um array de dados vasto e disperso, será necessário reduzir os dados e esses sistemas permitirão que a operação seja feita.
Felizmente, o Apache Mahout fornece tarefas que podem ser enviadas para o Apache Hadoop para ajudá-lo a calcular suas similaridades. Uma vez que esse cálculo estiver completo, é possível carregar os resultados na fonte de dados desejada para que seu aplicativo da Web possa usá-lo.
- Onde armazenar seus dados
Por fim, é necessário determinar onde armazenar seus dados. Esses dados podem conter dados de entrada não processados ou dados com similaridades já calculadas por um processo off-line, como o Apache Hadoop. Caso a origem de seus dados seja um vasto archive de dados não processados, pode ser necessário explorá-lo para obter algo para alimentar o mecanismo de recomendações. É possível armazenar seus conjuntos de dados em um sistema de arquivos ou em uma origem de dados distribuída.
No caso em que seus conjuntos de dados são pequenos, é possível fazer com que seus programas leiam os dados a partir do sistema de arquivos e armazená-los na memória de trabalho. Porém, se os conjuntos de dados são grandes, pode-se desejar considerar o uso de um sistema de gerenciamento de banco de dados, como o IBM DB2®, Apache Derby, etc. Caso selecione uma origem de dados distribuída, você desejará garantir que as configurações de otimização de consulta adequadas (como índices) estejam configuradas corretamente.
Mas não precisa ser tão complicado. Para manter tudo simples, assuma que seu conjunto de dados é suficientemente pequeno para caber em um banco de dados pequeno, como o Apache Derby, o ™sistema de gerenciamento de banco de dados de software livre baseado em Java enviado com o WebSphere Application Server V8.
O importante é que ao prosseguir em sua abordagem, será necessário determinar, com base em seis dados específicos, se será necessário usar um sistema de arquivos distribuído ou um sistema de gerenciamento de banco de dados relacional tradicional.
Cenário de amostra
Conforme descrito no artigo do developerWorks Apresentando Apache Mahout, o objetivo do projeto Apache Mahout é criar bibliotecas de aprendizado de máquina escaláveis. O Apache Mahout é implementado sobre o Apache Hadoop, não está restrito a sistemas de arquivo distribuídos.
Isso nos traz ao foco desse artigo, a saber, os algoritmos de aprendizado de máquina fornecidos pelo Apache Mahout para processar seus dados em uma recomendação. Para os propósitos desse artigo, iremos nos focar na tarefa de aprendizado de máquina para filtragem com base no usuário que o Apache Mahout implementa atualmente. São usadas referências sociais nesse exemplo pelo fato de haver muitas maneiras de obter esses dados e eles serem simples de efetuar o log em um banco de dados.
Assuma que deseja criar um aplicativo da Web que permita aos usuários obter as recomendações de itens com base nas classificações fornecidas por outros usuários. O conjunto de dados disponível contém classificações sobre os itens feitas pelos usuários.
Para simplificar, os dados de amostra incluídos nesse artigo são genéricos, já que trabalharemos apenas com os identificadores dos usuários e dos itens. Em um aplicativo real, você desejará substituir o identificador exclusivo de um item recomendado por seu nome de exibição antes de apresentá-lo ao usuário.
Topologia de amostra
Então, conforme mostrado na figura acima, os usuários podem solicitar um
servlet no aplicativo. O aplicativo fará uma chamada para que o
mecanismo de recomendação sugira um conjunto de recomendações para o
usuário. O mecanismo de recomendação irá recuperar os dados de uma
origem de dados e irá calcular as similaridades em tempo real.
Configurar o ambiente de desenvolvimento
Para executar as etapas descritas nesse artigo, será necessário
configurar seu ambiente de desenvolvimento conforme descrito aqui:
Faça o download do Apache Mahout
- Visite o Web site do
Apache Mahout
e faça o download da versão mais recente do Apache Mahout. No momento da criação
desse texto, a versão mais recente era a 0.5
(mahout-distribution-0.5.zip). - Extraia o conteúdo do archive em um local conhecido. Esses arquivos de conteúdo serão mencionados posteriormente.
Crie o projeto do aplicativo Java EE
- Inicie o Rational Application Developer para WebSphere Software V8.0.3.
- Alterne para a perspectiva do Java EE.
- Selecione File > New > Enterprise Application Project.
- Para o Nome do Projeto, insira RecommenderApp.
- Certifique-se de que o tempo de execução de destino esteja definido como WebSphere Application Server v8.0 e clique em Next.
- No próximo painel, clique em New module… e, a partir do pop-up, selecione Web module only e configure seu nome RecommenderWeb.
- Clique em OK e, então, em Finish.
Crie e preencha um banco de dados com dados de amostra
O Apache Derby é um banco de dados baseado em Java que usa um armazenamento de arquivos para armazenamento. O Apache Derby é usado nesse exemplo pois está incluído com o Rational Application Developer.
- Selecione Window > Show View > Data Source Explorer.
- Clique com o botão direito do mouse em Database Connections e selecione New …
- Para o driver JDBC, selecione Derby 10.5 – Embedded JDBC Driver Default.
- Uma vez que o Derby armazena os bancos de dados no sistema de arquivos, será necessário especificar onde ele residirá. Para o local do banco de dados, insira o caminho e o nome a ser usado para o banco de dados. Para esse exemplo, PREFERENCES será usado como nome do banco de dados.
- Deixe os campos de nome de usuário e senha em branco e clique em Finish.
Em seguida, será definido o modelo de dados usando um script (Listagem
1). Primeiro, o script cria um esquema chamado PREFERENCES e uma tabela
chamada taste_preferences. Essa tabela retém todas as classificações
feitas pelos usuários sobre cada item. Ela contém quatro colunas:
user_id, item_id, preferences e timestamp. Cada dupla na tabela
representa que o usuário user_id classificou o item item_id e forneceu
uma classificação de preferência.
Listagem 1. Esquema da origem de dados
CREATE SCHEMA PREFERENCES; CREATE TABLE PREFERENCES.taste_preferences ( user_id BIGINT NOT NULL, item_id BIGINT NOT NULL, preference FLOAT NOT NULL, "timestamp" BIGINT, PRIMARY KEY (user_id, item_id) );
Em virtude do grande número de acessos ao banco de dados necessários,
também é muito importante definir dois índices para acelerar o tempo de
procura (Listagem 2).
Listagem 2. Tabela de índices SQL
CREATE INDEX PREFERENCES.user_id_idx ON PREFERENCES.taste_preferences ( user_id ); CREATE INDEX PREFERENCES.item_id_idx ON PREFERENCES.taste_preferences ( item_id );
Em seguida, crie o modelo de dados:
- Faça o download do createtable.sql clicando aqui e salve-o no projeto RecommenderWeb.
- A partir da perspectiva do Java EE, clique com o botão direito do mouse em
RecommenderWeb e selecione Refresh. O script createtable.sql deve ser exibido agora. - Clique com o botão direito do mouse no script createtable.sql e selecione
Execute SQL Files. - Verifique se o tipo de servidor está configurado como Derby _10.x e o perfil de conexão e os nomes dos bancos de dados estão corretos e clique em
OK. -
É possível verificar se o script foi concluído com sucesso ao revisar a visualização do SQL Results (figura abaixo).
Visualização do SQL Results após a criação da tabela
Agora que sua tabela foi criada, é possível carregá-la com alguns dados:
-
Faça o download do arquivo u.data clicando aqui. Essa é uma lista separada por vírgulas com aproximadamente 10 mil
classificações de usuário do conjunto de dados MovieLens. Da mesma
maneira que foi feito com o script SQL, salve esse arquivo no projeto
RecommderWeb. -
A partir da perspectiva do Java EE, clique com o botão direito do mouse em
RecommenderWeb e selecione Refresh. O arquivo u.data deve ser exibido. -
A partir da visualização Data Source Explorer, expanda Database
Connections > PREFERENCES > PREFERENCES > Schemas > PREFERENCES > Tables. -
Clique com o botão direito do mouse na tabela TASTE_PREFERENCES e selecione Load…
-
Para o Input File, clique em Browse e navegue até
RecommenderWeb e selecione u.data e em OK. -
Para o Column delimiter, selecione Tab. Assegure que a opção
Replace existing data está marcada e clique em Finish. -
O processo de carregamento deve ser
iniciado. Pode levar até 60 segundos para que todo o conjunto de dados
seja carregado. É possível cerificar a conclusão bem sucedida do
carregamento a partir da visualização do SQL Results (Figura abaixo).
Visualização do SQL Results após os dados serem carregados no banco de dados
- É possível verificar os dados carregados ao clicar com o botão direito do mouse na tabela
TASTE_PREFERENCES e selecionar Data > Sample Contents. - Desconecte do banco de dados ao selecionar a visualização Data Source
Explorer e expandir Database Connections. - Clique com o botão direito do mouse em PREFERENCES e selecione Disconnect.
Agora, a criação de seu armazenamento de dados e de seus dados de amostra está concluída.
Configure as bibliotecas do Apache Mahout
Para desenvolver o código do recomendador, é
necessário importar as bibliotecas do Apache Mahout requeridas em seu
aplicativo corporativo. (Caso vá compartilhar as bibliotecas do Apache
Mahout com diversos projetos corporativos em seu ambiente, o método
recomendado seria configurar uma biblioteca compartilhada.)
- Expanda EAR Projects, clique com o botão direito do mouse em
RecommenderAppe selecione Import > Import … - Selecione General > File System e clique em Next.
- No diretório From, navegue até o local em que os arquivos do
Apache Mahout foram extraídos e clique em OK. -
Selecione os arquivos listados na tabela abaixo na caixa de diálogo de importação:
Nome da biblioteca | Local |
---|---|
mahout-core-0.5.jar | mahout-distribution-0.5/ |
mahout-core-0.5-job.jar | mahout-distribution-0.5/ |
slf4j-jcl-1.6.0.jar | mahout-distribution-0.5/lib |
- Clique em Finish.
- Agora adicione essas referências ao
aplicativo da Web para que seja possível definir o caminho da classe
para compilação. Clique com o botão direito do mouse no projeto
RecommenderWeb e selecione Properties. - Selecione Java Build Path e clique em Add JARs …
-
Na caixa de diálogo pop-up, expanda RecommenderApp, selecione
mahout-core-0.5.jar e mahout-core-0.5-job.jar
e clique em OK (figura abaixo).
Editor do Java Build Path para o projeto RecommenderWeb
- No projeto RecommenderWeb, expanda WebContent >
META-INF e clique duas vezes em MANIFEST.MF. - Em Dependencies > Jar or Module coloque um visto próximo a todas as três bibliotecas
(figura abaixo).
Editor do Dependencies para o projeto RecommenderWeb
- Salve e feche o editor.
Nesse ponto, a configuração do ambiente de desenvolvimento foi concluída
e você está pronto para começar a escrever o código do recomendador.
Criando o mecanismo de recomendação
Em seguida, será criado o servlet que manipulará o código do mecanismo de recomendação do Apache Mahout.
Crie uma classe de servlet
Comece criando uma classe de servlet que representará seu aplicativo da Web.
- Clique com o botão direito do mouse no projeto RecommenderWeb e selecione New > Servlet.
- Para o Java Package, insira com.ibm.sample.recommender.
-
Para o Class Name, insira TestServlet.
Create Servlet – Especifique o painel de destino do arquivo de classe
- Clique em Next.
- No próximo painel, aceite os padrões e clique em Next.
- No próximo painel, desmarque doPost e clique em Finish
(figura abaixo).
Create Servlet – Especifique os stubs de método para gerar no painel
Após a conclusão dessa etapa, você terá uma classe servlet vazia em que
será possível adicionar seu código para o mecanismo de recomendação.
Importe o código de origem
O código de origem de amostra para a classe de servlet está incluído aqui,
contido no arquivo snippet1.txt. Faça o download desse arquivo e use-o
para substituir os conteúdos do arquivo de origem TestServlet.java.
Esse é um bom momento para revisar as partes importantes do código para ajudá-lo a entender o que está sendo feito.
Crie o modelo de dados
Anteriormente, o banco de dados foi criado e o
conjunto de dados foi carregado. Nessa etapa, será definido um objeto
de modelo de dados que fornece acesso a esse conjunto de dados ao usar
as chamadas JDBC. O Apache Mahout fornece classes de implementação do
JDBC para origens de dados MySQL PostgreSQL apenas. Caso deseje usar
uma origem de dados diferente, há três opções:
- Usar a classe GenericJDBCDataModel e fornecer todas as consultas SQA necessárias no método construtor.
- Estender o AbstractJDBCDataModel para adicionar uma implementação para sua origem de dados.
- Testar uma das implementações existentes para verificar a compatibilidade.
Para o caso do Derby, a implementação do
PostgreSQL é compatível, então ela é usada aqui (Listagem 3).
Entretanto, para uma implementação mais robusta, pode-se desejar optar
pela segunda opção de estender a implementação do AbstractJDBCDataModel.
Listagem 3. Definição do modelo de dados
private @Resource (name="jdbc/taste") DataSource tasteDS; dataModel = new PostgreSQLJDBCDataModel(tasteDS, "PREFERENCES.TASTE_PREFERENCES", "USER_ID", "ITEM_ID", "PREFERENCE", "TIMESTAMP");
A classe de interface org.apache.mahout.cf.taste.model.DataModel
representa o modelo de dados que é acessado
pelas classes
de Similaridade e Recomendador. Há
diferentes implementações para essa interface (File, JDBC, etc.)
Para gerenciar os dados usados após seu
aplicativo ser inicializado, é possível usar os métodos mostrados na
tabela abaixo:
Nome do método | Descrição |
---|---|
FastIDSet getItemIDsFromUser(long userID) |
Retorna os IDs de todos os itens por quais que o usuário expressa preferência |
Float getPreferenceValue(long userID, long itemID) |
valor preferencial do usuário determinado para o item determinado ou nulo caso nenhum existir. |
int getNumUsers() | Número total de usuários conhecidos pelo modelo. |
void setPreference(long userID, long itemID, float value) |
Define uma preferência específica (classificação positiva do item) para um usuário. |
void removePreference(long userID, long itemID) |
Remove uma preferência específica para um usuário. |
Gere a similaridade de usuário
Uma vez que tiver definido o modelo de dados,
a próxima etapa necessária é calcular a similaridade dos dados. O
Apache Mahout fornece vários algoritmos para calcular a similaridade
entre os usuários. Eles incluem: City Block Similarity, Euclidean
Distance Similarity, LogLikelihood Similarity, Pearson Correlation
Similarity, SpearmanCorrelationSimilarity,
TanimotoCoefficientSimilarity, UncenteredCosineSimilarity e outros.
(Consulte a documentação do javadoc inclusa na distribuição do Mahout
para obter mais informações sobre esses algoritmos.)
A extensão do processo para calcular a
similaridade entre os usuários aumenta conforme o número de itens e
classificações aumenta. Por essa razão, os cálculos de similaridade
off-line para grandes conjuntos de dados devem ser feitos off-line. Por
exemplo, criando tarefas para o Apache Mahout. Os resultados de
similaridade dessas tarefas off-line podem, então, serem incluídos no
modelo de dados.
O exemplo usado nesse artigo usa o
algoritmo PearsonCorrelationSimilarity, que executa os cálculos em tempo
real, eliminando a necessidade de executar cálculos off-line.
Então, vamos executar o cálculo de similaridade para seu modelo de dados:
UserSimilarity similarity = new
PearsonCorrelationSimilarity(dataModel);
A variável de similaridade agora contém as informações de similaridade para todos os usuários disponíveis no modelo de dados.
Defina o ambiente do usuário
O algoritmo de recomendação baseado no
usuário usa um ambiente para especificar quais usuários devem ser
considerados semelhantes ao usuário específico. Esse exemplo usa a
implementação NearestNUserNeighborhood, que permite especificar um
limite para quantos usuários devem ser incluídos em um ambiente. Nesse
exemplo, a associação no ambiente consiste em cinco usuários mais
semelhantes, assim, o ambiente é definido da seguinte forma:
UserNeighborhood neighborhood = new NearestNUserNeighborhood(5, similarity, dataModel);
Os membros em um ambiente são considerados muito semelhantes ao usuário.
Então, conforme a associação aumenta, o número de itens recomendados
também aumenta, uma vez que mais membros recomendaram mais itens.
Faça as recomendações
Agora que a similaridade entre os usuários foi calculada e o ambiente de
um usuário foi especificado, é possível continuar e fazer recomendações
de usuário. O Apache Mahout fornece a interface Recommender para
acessar as recomendações por usuários:
Recommender recommender = new GenericUserBasedRecommender(dataModel, neighborhood, similarity);
Com o recomendador definido, é possível fazer recomendações ao chamar
o método recommend(long, int) e passar o ID do usuário e o número
máximo de itens recomendados que deseja receber. A partir daqui, usa-se
um agente iterativo para processar cada recomendação.
A Listagem 4 mostra como extrair as recomendações para um usuário.
Listagem
4. Iterando através das recomendações
java.util.List<RecommendedItem> list = recommender.recommend(USER_ID, 10); Iterator<RecommendedItem>iter = list.iterator(); while ( iter.hasNext()) { RecommendedItem item = iter.next(); out.println("<tr><td>" + item.getItemID() + "</td><td>" + item.getValue() + "</td></tr>"); }
Então, em suma, a recomendação baseada no usuário primeiro calculou a
similaridade entre os usuários do conjunto de dados e, então, usou um
item do ambiente para especificar quais usuários devem ser considerados
similares ao usuário atual. Com essas informações, o algoritmo do
recomendador é capaz de fazer recomendações com base em que itens
usuários similares classificaram e usa essa informação para estimar o
quanto o usuário atual pode gostar desses itens.
Teste o mecanismo em um aplicativo da Web
Antes de testar o aplicativo no WebSphere
Application Server V8, é necessário configurar a origem de dados no
servidor e definir a referência JNDI para a origem de dados para que o
servlet possa acessá-la.
Para configurar a origem de dados:
- Na visualização Servers, clique com o botão direito do mouse em
WebSphere Application Server at localhost
e selecione Start. - Assim que o servidor tiver iniciado, clique com o botão direito do mouse no servidor e selecione Administration > Run Administrative Console.
- Se a autenticação estiver ativada, insira seu userID
e senha quando o console abrir. Clique em Login. - Expanda Resources > JDBC > JDBC Providers.
- Para scope, selecione o escopo Server .
- Clique em New …
- Insira os valores como mostrado na figura abaixo.
Painel New JDBC provider
- Clique em Next.
- Verifique a configuração e clique em Finish.
- De volta à lista JDBC Providers, clique em Derby JDBC Provider.
- Em Additional Properties clique em Data sources.
- Clique em New …
- Para o JNDI name, insira jdbc/taste (figura abaixo).
Painel de definição do Data Source JDNI name
- Clique em Next.
-
Para Database name, insira o
local do caminho do arquivo para a origem de dados Derby criado para
carregar o modelo de dados. Desmarque Use this data source in contained managed persistence (CMP) (figura abaixo).
Painel de especificação de Database name
- Clique em Next.
- Para a Etapa 3, deixe a configuração de segurança em branco e clique em Next.
- Para a Etapa 4, verifique as configurações definidas e clique em Finish.
- Salve a configuração clicando em Salve.
Essas são todas as alterações que precisam ser feitas no WebSphere
Application Server V8. As informações
sobre ligação da origem de dados já estão definidas no código do servlet
usando as anotações do Servlet 2.5 (consulte snippet1.txt), então não é
necessário configurá-las no descritor de implementação do módulo da
Web. A última etapa é instalar o aplicativo no servidor:
- A partir da visualização Servers, clique com o botão direito do mouse no servidor de teste
WebSphere Application Server
V8 e selecione Add or Remove … - Selecione RecommenderApp e clique em Add.
- Clique em Finish.
É isso. O aplicativo agora está instalado e finalmente pronto para testar.
Para testar o aplicativo:
- Inicie o servidor de teste WebSphere Application Server V8 a partir
da visualização Servers, caso ele ainda não tenha sido iniciado. -
Expanda Dynamic Web Projects >
RecommenderWeb > RecommenderWeb > Servlets (figura abaixo).
Visualização do Dynamic Web Projects
- Clique com o botão direito do mouse em TestServlet e selecione Run As > Run on Server.
- Selecione WebSphere Application Server V8
at localhost e clique em Finish. - O navegador interno não deve ser ativado e os resultados da recomendação podem ser exibidos (figura abaixo).
Resultados da recomendação
Como é possível observar a partir do exemplo, o usuário do qual deseja
recuperar as recomendações é o usuário 400. Esse Usuário já classificou
22 itens. Com base no modelo de dados e no algoritmo de recomendação, o
Apache Mahout pôde recomendar um conjunto de itens juntamente com uma
classificação prevista que esse usuário pode ter atribuído a eles.
Para onde ir em seguida
Agora que você sabe algo sobre mecanismos de recomendação, e o que vem depois?
Em primeiro lugar, é possível começar a ver o valor extra
fornecido pelos produtos que já incluem um mecanismo de recomendação.
Por exemplo, o IBM WebSphere Portal e o IBM WebSphere Commerce Suite
incluem um mecanismo de recomendação como parte de suas ofertas básicas.
Através de produtos de software como esses, a IBM refinou e melhorou o
suporte nessas áreas enquanto gerenciava interesses sobre a privacidade
on-line, desempenho e integração. (Mantenha esses recursos integrados
desses produtos em mente caso tenha que ponderar qualquer decisão de
“desenvolver ou comprar”.)
Esse artigo não trata de um possível grande fluxo, ou seja, o
processamento de grandes volumes de dados usando tarefas de redução com
mapa. Esse tópico não foi tratado aqui, mas foi pela IBM. As
iniciativas Big Data da IBM podem ajudar a gerenciar grandes quantidades
de dados necessários para alguns aplicativos específicos.
Como
mencionado anteriormente, a solução de exemplo apresentada aqui não
escalará após um determinado ponto devido aos limites de recursos do
grande aumento do número de usuários. Os problemas de grandes
processamentos estão se tornando mais comuns e não precisam parar seu
progresso. Usando as iniciativas Big Data, não há razão para ser
impedido por nenhuma escala de processamento.
Não é necessário possuir um grande datacenter para usar o Apache
Mahout. Claro, com a computação em nuvem, o datacenter não é necessário
para nenhuma solução.
A computação em nuvem não está diretamente
relacionada ao espaço do mecanismo de recomendação, mas vale mencionar
que as iniciativas em nuvem da IBM podem fornecer a capacidade para
experimentar alguns desses pontos de maneiras que, de outras formas, não
seriam práticas.
Conclusão
É possível ver que os mecanismos de recomendação podem adicionar uma
poderosa nova dimensão aos aplicativos da Web ao conduzir os usuários a
outros produtos ou ofertas da Web, com base em suas características ou
comportamentos específicos.
Esse artigo forneceu uma breve apresentação
das técnicas usadas pelos mecanismos de recomendação e o que pode
precisar ser feito para que eles sejam mais escaláveis. Vimos também o
quanto o Apache Mahout alavanca essas técnicas e ajuda a integrá-las nos
aplicativos da Web.
Ao integrar esses conceitos no IBM WebSphere
Application Server, aprendemos como estender seus aplicativos da Web e
adicionar a personalização efetiva a eles.
Recursos
Aprender
- Programming Collective
Intelligence, Toby Segaran, O’Reilly Media, Inc., 2007. - What is Apache
Mahout? - Introducing Apache Mahout
- Apache Hadoop
-
What is big
data? - IBM Portal LikeMinds Recommendations
-
IBM
WebSphere Portal 6.1.5
Information Center - Computação em nuvem da IBM
- “New York Times” Quietly Rolls Out Recommendations Service
- WebSphere no IBM developerWorks
Obter produtos e tecnologias
Sobre os autores:
Emilio Zegarra é
engenheiro de software senior na organização IBM Software Services for
WebSphere sediada em Pittsburgh, PA. Suas áreas de interesse incluem
design de interface de usuário, sistemas distribuídos e colaborativos e
desenvolvimento orientado ao objeto. É possível entrar em contato com
Emilio em ezegarra@us.ibm.com.
Tony Efremenko é Master IT Specialist Certificado na IBM, com mais de 24 anos de experiência na indústria de software.