From 2ee81661ab8bc69601fa03761aa726139234e640 Mon Sep 17 00:00:00 2001 From: Adsu Date: Wed, 16 Dec 2020 20:03:13 -0300 Subject: [PATCH] =?UTF-8?q?recomenda=C3=A7=C3=A3o=20por=20taxonomia?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sacip/sti/agents/RecommenderAgent.java | 262 +++++++++++++++--- .../java/sacip/sti/agents/TrackingAgent.java | 3 - 2 files changed, 216 insertions(+), 49 deletions(-) diff --git a/src/main/java/sacip/sti/agents/RecommenderAgent.java b/src/main/java/sacip/sti/agents/RecommenderAgent.java index 44163d1..cdaabe1 100644 --- a/src/main/java/sacip/sti/agents/RecommenderAgent.java +++ b/src/main/java/sacip/sti/agents/RecommenderAgent.java @@ -3,9 +3,11 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.HashMap; import java.util.List; import java.util.ListIterator; import java.util.Map; +import java.util.Map.Entry; import org.midas.as.AgentServer; import org.midas.as.agent.templates.Agent; @@ -43,10 +45,26 @@ protected void lifeCycle() throws LifeCycleException, InterruptedException { private String getConteudosRecomendados(List grupo, Student aluno, List trilha) { List preferenciasAluno = aluno.getPreferencias(); + + //lista filtrada por pontos + List sortedContent = new ArrayList(){ + @Override + public boolean add(Content e) { + super.add(e); + Collections.sort(this, new Comparator(){ + @Override + public int compare(Content o1, Content o2) { + return o2.pontos-o1.pontos; + } + }); + return true; + } + }; + try { List caracteristicas = new ArrayList<>(); - + if(!grupo.isEmpty()) { System.out.println("Verificando semelhanças entre alunos"); @@ -59,50 +77,75 @@ private String getConteudosRecomendados(List grupo, Student aluno, List } //Verificar os tópicos e níveis que o aluno utilizou - + HashMap> nivelETopico = descobrirNiveisETopicos(trilha); + String[] niveisFeitos = nivelETopico.keySet().toArray(new String[nivelETopico.size()]); //Fazer chamada ao banco buscando os conteúdos desses níveis - - //Verificar se há algum tópico faltante em um dos níveis feitos do aluno (guardar níveis completados?) - - //recomendar os tópicos de níveis mais baixos. - - //pegar os conteúdos desse tópico - - //filtrar pelos seguintes - - //Fazer chamada ao banco - ServiceWrapper wrapper = require("SACIP", "getContentByTags"); - wrapper.addParameter("tags", caracteristicas); - List resultado = wrapper.run(); + ServiceWrapper servicoPegarConteudosEmNiveis = require("SACIP", "getContents"); + servicoPegarConteudosEmNiveis.addParameter("level", niveisFeitos); + List resultado = servicoPegarConteudosEmNiveis.run(); if(resultado.get(0)==null || resultado.get(0) instanceof String) { return "não há conteúdos"; } List conteudos = (List) resultado.get(0); - List sortedContent = new ArrayList(){ - @Override - public boolean add(Content e) { - super.add(e); - Collections.sort(this, new Comparator(){ - @Override - public int compare(Content o1, Content o2) { - return o2.pontos-o1.pontos; - } - }); - return true; + //CONTEUDOS DO TÓPICO EM QUE ELE ESTÁ + + //VER OS ULTIMOS CONTEUDOS POR TÓPICO QUE ELE FEZ: MAPA(TOPICOS, CONTEUDOS) => MAPA(TOPICOS/PROXIMATAXONOMIA) + Map taxonomiasPorTopicos = descobrirProximosConteudosPorTaxonomia(trilha); + List conteudosPorNovasTaxonomias = new ArrayList<>(); + if(!taxonomiasPorTopicos.isEmpty()) + { + //BUSCAR NOVOS CONTEUDOS DE NOVA TAXONOMIA PARA CADA TOPICO + conteudosPorNovasTaxonomias = descobrirConteudosDeTaxonomia(conteudos, taxonomiasPorTopicos); + + //FILTRAR POR TAGS + conteudosPorNovasTaxonomias = filtrarConteudosPorTags(conteudosPorNovasTaxonomias, caracteristicas); + } + + //Verificar se há algum tópico faltante em um dos níveis feitos do aluno (guardar níveis completados?) + List topicosFaltantes = descobrirTopicosFaltantes(conteudos, nivelETopico); + + + //recomendar os tópicos de níveis mais baixos. + //pegar os conteúdos desse tópico + if(topicosFaltantes.isEmpty()) + { + int proximoNivelAluno = 1; + for (int i = 0; i < niveisFeitos.length; i++) { + int nivelFeito = Integer.parseInt(niveisFeitos[i]); + if(nivelFeito>proximoNivelAluno) + { + proximoNivelAluno=nivelFeito; + } } - }; - - for (Content content : conteudos) { - if(!content.getComplexity().equals(aluno.getNivelEducacional())) + proximoNivelAluno++; + + ServiceWrapper servicoPegarConteudosDoNivel = require("SACIP", "getContents"); + servicoPegarConteudosDoNivel.addParameter("level", proximoNivelAluno); + resultado = servicoPegarConteudosDoNivel.run(); + if(resultado.get(0)==null || resultado.get(0) instanceof String) { - content.pontos-=100; + return "não há conteúdos"; } - content.pontos += calculateTagPoints(content.getTags(), preferenciasAluno); - content.pontos += calculateDistancePoints(trilha, content); - + conteudos = (List) resultado.get(0); + } + else + { + conteudos = filtrarConteudosPorTopicos(conteudos, topicosFaltantes); + } + conteudos = filtrarConteudosPorTags(conteudos, caracteristicas); + + + + //PRIORIZAR POR PONTOS + for (Content content : conteudos) { + // if(!content.getDifficulty().equals(aluno.getNivelEducacional())) + // { + // content.pontos-=100; + // } + content.pontos += calculateTagPoints(content.getTags(), preferenciasAluno); sortedContent.add(content); } @@ -133,18 +176,6 @@ private int calculateTagPoints(List tagsConteudo, List preferenc return pontos; } - private int calculateDistancePoints(List trilha, Content conteudo) - { - int pontos = 0; - ListIterator li = trilha.listIterator(trilha.size()); - - while(li.hasPrevious()) - { - Content contTrilha = (Content) li.previous(); - } - return pontos; - } - private int dificuldadeMedia(List trilha) { int media = 0; @@ -155,4 +186,143 @@ private int dificuldadeMedia(List trilha) return media/trilha.size(); } + + private HashMap> descobrirNiveisETopicos(List trilha) + { + HashMap> nivelETopic = new HashMap(); + + for (Content content : trilha) { + int nivel = content.getLevel(); + String topico = content.getTopic(); + if(nivelETopic.containsKey(nivel)) + { + nivelETopic.get(nivel).add(topico); + } + else + { + List topicos = new ArrayList<>(); + topicos.add(topico); + nivelETopic.put(nivel, topicos); + } + } + return nivelETopic; + } + + private List descobrirTopicosFaltantes(List conteudosBuscados, HashMap> niveisTopicosDoAluno) + { + HashMap> niveisETopicosBuscados = descobrirNiveisETopicos(conteudosBuscados); + List topicosFaltantes = new ArrayList<>(); + + for (Entry> entry : niveisETopicosBuscados.entrySet()) { + Integer key = entry.getKey(); + List listaTopicos = entry.getValue(); + for (String topico : listaTopicos) { + if(!niveisTopicosDoAluno.get(key).contains(topico)) + { + topicosFaltantes.add(topico); + } + } + } + + return topicosFaltantes; + } + + private List filtrarConteudosPorTopicos(List conteudos, List topicos) + { + List conteudosRecomendados = new ArrayList<>(); + + for (Content content : conteudosRecomendados) { + if(!topicos.contains(content.getTopic())) + { + continue; + } + conteudos.add(content); + } + + if(conteudosRecomendados.isEmpty()) + { + return conteudos; + } + + return conteudosRecomendados; + } + + private List filtrarConteudosPorTags(List conteudos, List caracteristicas) + { + List conteudosRecomendados = new ArrayList<>(); + + for (Content content : conteudosRecomendados) { + + if(!caracteristicas.stream().anyMatch(element -> content.getTags().contains(element))) + { + continue; + } + + conteudos.add(content); + } + + if(conteudosRecomendados.isEmpty()) + { + return conteudos; + } + + return conteudosRecomendados; + } + + private Map descobrirProximosConteudosPorTaxonomia(List trilha) + { + Map taxonomiaPorTopicos = new HashMap<>(); + String[] taxBloom = {"Lembrar", "Compreeder", "Aplicar", "Analisar", "Avaliar", "Criar"}; + + for (Content content : trilha) { + String topico = content.getTopic(); + String tax = content.getTaxonomy(); + if(taxonomiaPorTopicos.containsKey(topico)) + { + String setTax = taxonomiaPorTopicos.get(topico); + boolean foundTax = false; + for (int i = 0; i < taxBloom.length-1; i++) { + if(taxBloom[i].equals(tax) ||taxBloom[i].equals(setTax)) + { + if(!foundTax) + { + foundTax = true; + } + else + { + taxonomiaPorTopicos.put(topico, taxBloom[i+1]); + } + } + } + } + else + { + if(!tax.equals("Criar")) + taxonomiaPorTopicos.put(topico, tax); + } + } + + return taxonomiaPorTopicos; + } + + private List descobrirConteudosDeTaxonomia(List conteudos, Map taxonomiasPorTopicos) + { + List conteudosRecomendados = new ArrayList<>(); + + for (Content content : conteudosRecomendados) { + if(taxonomiasPorTopicos.containsKey(content.getTopic())) + { + String tax = taxonomiasPorTopicos.get(content.getTopic()); + if(content.getTaxonomy().equals(tax)) + { + conteudosRecomendados.add(content); + } + } + } + + if(conteudosRecomendados.isEmpty()) + return conteudos; + + return conteudosRecomendados; + } } diff --git a/src/main/java/sacip/sti/agents/TrackingAgent.java b/src/main/java/sacip/sti/agents/TrackingAgent.java index b5693b3..c426b71 100644 --- a/src/main/java/sacip/sti/agents/TrackingAgent.java +++ b/src/main/java/sacip/sti/agents/TrackingAgent.java @@ -1,6 +1,5 @@ package sacip.sti.agents; -import java.time.Duration; import java.util.ArrayList; import java.util.Comparator; import java.util.LinkedHashMap; @@ -13,9 +12,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; import org.midas.as.AgentServer; import org.midas.as.agent.board.Board;