Descrição do Problema — Sistema de Recomendação Colaborativo
Introdução
O objetivo final do trabalho é implementar um Sistema de Recomendação Colaborativo.
Para alcançar esse objetivo, o problema será dividido em três fases de complexidade crescente.
A implementação principal será desenvolvida no paradigma Orientado a Objetos (Java).
Posteriormente, versões reduzidas do problema serão implementadas explorando:
- Programação Lógica (Prolog)
- Programação Funcional (Lisp)
Fase 1 — Aquecimento e Consultas
Nesta fase inicial o objetivo é familiarizar-se com a sintaxe e as estruturas de dados básicas de cada linguagem.
Estrutura de Dados
Desenvolvimento Local (CSV)
Durante o desenvolvimento na sua máquina, você poderá ler diretamente os arquivos CSV fornecidos.
Isso facilita o debug da lógica principal.
Base pequena
Base grande (teste de performance para Java)
Avaliação no Juiz Online
Na submissão para o Juiz Online, o programa deve ler os dados via Entrada Padrão.
O método main deve ler os dados utilizando:
System.inScanner- ou
BufferedReader
Formato da Entrada
A entrada será injetada no seguinte formato:
Dois inteiros:
\(F\) — número de filmes
\(A\) — número de avaliações\(F\) linhas contendo:
id,titulo,generos,diretor,ano\(A\) linhas de avaliações:
usuario,id_filme,nota(onde a nota varia de 1 a 5)Linhas de Comandos das respectivas Fases sendo testadas.
Simulação do Juiz no Terminal
Você pode simular o juiz online no seu terminal executando sua classe compilada e redirecionando um arquivo de teste:
java Main < meuteste.inFunções/Predicados a Implementar
filmes_por_genero(Genero): Retorna todos os filmes de um dado gênero.filmes_de_ano_superior(Ano): Retorna filmes lançados após o ano dado.notas_do_usuario(Usuario): Retorna todas as avaliações feitas por um usuário.
Fase 2: Lógica Intermediária e Regras de Negócio
Aqui começamos a processar listas e aplicar lógica agregada.
Funções/Predicados a Implementar
media_avaliacoes(Usuario): Calcula a média das notas dadas por um usuário.usuario_hater(Usuario): Retorna Verdadeiro se o usuário tem mais notas 1 do que notas 5.filmes_nao_avaliados(Usuario): Retorna a lista de todos os filmes que o usuário ainda não avaliou.diretores_comuns(Usuario1, Usuario2): Retorna a lista de diretores que ambos os usuários avaliaram (independente da nota).
Fase 3: O Sistema Colaborativo
O desafio final. Aqui implementamos a “Inteligência” do sistema, usando interseção de conjuntos e regras globais de exclusão.
Lógica do Algoritmo
- Similaridade: Dois usuários são “Vizinhos” se avaliaram os mesmos filmes (interseção \(\ge 1\)) e ambos deram nota alta (\(\ge 4\)).
- Candidatos: Filmes que os Vizinhos deram nota \(\ge 4\) e que o Usuário Alvo não avaliou.
- Regra de Ódio (Exclusão): Se o Usuário Alvo deu nota 1 para qualquer filme de um diretor, remova todos os filmes desse diretor dos candidatos. ### Função Principal
recomendar(Usuario): Retorna a lista processada e filtrada de recomendações.- Nota: Na implementação em Java, esta lista final deverá obrigatoriamente ser ordenada usando múltiplos critérios (explicados no guia de Java).
Variação Dinâmica do Motor Colaborativo
Na Fase 3, o seu Sistema de Recomendação não deve ser engessado. Para provar que seu algoritmo e a modelagem Orientada a Objetos são robustos, o Juiz Online fará consultas alternando a própria definição matemática de “Vizinho” e “Candidato”.
Seu código deve possuir suporte nativo para processar os 3 tipos de comando RECOMENDAR {ALVO} {TIPO}, onde TIPO será um dos três comportamentos abaixo:
RESTRITO: Só são considerados vizinhos os usuários que avaliaram os exatos mesmos \(N \ge 3\) filmes e deram nota \(\ge 4\) para ambos. Apenas os filmes desses vizinhos entram como Candidatos.TOLERANTE: Dois usuários são vizinhos se avaliaram pelo menos 1 filme em comum (independente da nota). No entanto, a lista de Candidatos só pode conter filmes que esses vizinhos deram nota exatamente igual a 5.ESPECIALIDADE: Só são considerados vizinhos os usuários que deram nota \(\ge 4\) em pelo menos um filme do Gênero favorito (que o alvo tem mais avaliações) do Usuário Alvo.