public double PredicaoDeVaga(Usuario usuario, Vaga vaga) { double pontuacao = 0.0; double avaliadaPor = 0.0; bool alreadyFound = false; foreach (Avaliacao avaliacao in vaga.avaliacoes) { if (alreadyFound || avaliacao.usuario.ID != usuario.ID) { ++avaliadaPor; double pontosSimilaridade = SimilaridadeDeUsuarioComOutroUsuario(usuario, avaliacao.usuario); if (avaliacao.Gostou) { pontuacao += pontosSimilaridade; } else { pontuacao -= pontosSimilaridade; } } else { alreadyFound = true; } } return pontuacao / avaliadaPor; }
public double CalculaPercentagemDeRequisitosAtendidos(Usuario usuario, Vaga vaga) { double pontosTotais = 0, pontosFeitos = 0; foreach (NivelQualificacao qualificacaoVaga in vaga.qualidadesDesejadas) { NivelQualificacao qualificacaoUsuario = usuario.qualidades.FirstOrDefault(n => n.qualificacao.Tipo == qualificacaoVaga.qualificacao.Tipo); pontosTotais += qualificacaoVaga.Nivel; if (qualificacaoUsuario != null) { double aproveitamento = (double)qualificacaoUsuario.Nivel / qualificacaoVaga.Nivel; if (aproveitamento > 1) { pontosFeitos += qualificacaoVaga.Nivel + (qualificacaoUsuario.Nivel - qualificacaoVaga.Nivel) * 0.05; } else if (aproveitamento == 1) { pontosFeitos += qualificacaoVaga.Nivel; } else if (aproveitamento < 1) { pontosFeitos += qualificacaoUsuario.Nivel; // * aproveitamento; } } } return pontosFeitos / pontosTotais; }
public void TestDistanciaFundaoBarra() { //https://www.google.com.br/maps/dir/-22.8580108,-43.2322284/-22.9965259,-43.3564107 RecommendationService rService = Factory.Instance.Get<RecommendationService>(); Usuario usuario = new Usuario { Latitude = -22.8580108, Longitude = -43.2322284 }; Vaga vaga = new Vaga { Latitude = -22.9965259, Longitude = -43.3564107 }; double distancia = rService.CalculaDistanciaEntreUsuarioEVaga(usuario, vaga); Assert.IsTrue(distancia > 25 && distancia < 30, "Esperando entre 25 e 30, retornado: " + distancia); }
public double CalculaDistanciaEntreUsuarioEVaga(Usuario usuario, Vaga vaga) { if (usuario.Latitude != 0.0 && usuario.Longitude != 0.0 && vaga.Latitude != 0.0 && vaga.Longitude != 0.0) { return googleApi.CalculaDistanciaEntreDoisPontos(usuario.Latitude, usuario.Longitude, vaga.Latitude, vaga.Longitude); } return 0.0; }
public IEnumerable<PontuacaoVaga> OrdenaVagasPorCoeficienteDeJaccard(IEnumerable<Vaga> vagas, Usuario usuario) { List<PontuacaoVaga> listaPontuacaoVaga = new List<PontuacaoVaga>(); foreach (Vaga vaga in vagas) { listaPontuacaoVaga.Add(new PontuacaoVaga { vaga = vaga, predicaoAvaliacao = PredicaoDeVaga(usuario, vaga) }); } //TO DO return listaPontuacaoVaga.OrderByDescending(v => v.predicaoAvaliacao); }
public List<Vaga> OrdenaVagasPorRecomendacao(Usuario usuario, List<Vaga> listaVagas) { List<Tuple<Vaga, double, double>> listaRetornoVagas = new List<Tuple<Vaga, double, double>>(); foreach (Vaga vaga in listaVagas) { double requisitosAtendidos = CalculaPercentagemDeRequisitosAtendidos(usuario, vaga); double distanciaUsuarioVaga = CalculaDistanciaEntreUsuarioEVaga(usuario, vaga); listaRetornoVagas.Add(Tuple.Create(vaga, requisitosAtendidos, distanciaUsuarioVaga)); } listaRetornoVagas.Sort(new ComparadorVaga()); return listaRetornoVagas.Select(t => t.Item1).ToList(); }
public double SimilaridadeDeUsuarioComOutroUsuario(Usuario usuario, Usuario outro) { double acordos = 0.0; double desacordos = 0.0; double totalAvaliacoes = 0.0; HashSet<Avaliacao> outrasAvaliacoes = (outro.avaliacoes as HashSet<Avaliacao>); Dictionary<int, Avaliacao> dic = new Dictionary<int, Avaliacao>(); foreach (Avaliacao avaliacao in outrasAvaliacoes) { dic.Add(avaliacao.vaga.ID, avaliacao); } foreach (Avaliacao avaliacao in usuario.avaliacoes) { Avaliacao outra; if (dic.TryGetValue(avaliacao.vaga.ID, out outra)) { dic.Remove(avaliacao.vaga.ID); if (avaliacao.Gostou == outra.Gostou) { ++acordos; } else { ++desacordos; } outrasAvaliacoes.Remove(outra); } } totalAvaliacoes = usuario.avaliacoes.Count + outrasAvaliacoes.Count; return (acordos - desacordos) / totalAvaliacoes; }
public void TestBasico() { Usuario usuario = new Usuario { qualidades = new List<NivelQualificacao> { new NivelQualificacao { qualificacao = jQuery, Nivel = 90 }, new NivelQualificacao { qualificacao = javascript, Nivel = 95 }, new NivelQualificacao { qualificacao = CSharp, Nivel = 70 }, new NivelQualificacao { qualificacao = CSS, Nivel = 60 }, new NivelQualificacao { qualificacao = Lideranca, Nivel = 50 } } }; List<Vaga> listaVagasInicial = new List<Vaga> { new Vaga { Titulo = "Vaga3", qualidadesDesejadas = new List<NivelQualificacao> { new NivelQualificacao { qualificacao = TrabalhoEmEquipe, Nivel = 80 }, new NivelQualificacao { qualificacao = SerAutoDidata, Nivel = 60 }, }}, new Vaga { Titulo = "Vaga1", qualidadesDesejadas = new List<NivelQualificacao> { new NivelQualificacao { qualificacao = jQuery, Nivel = 70 }, new NivelQualificacao { qualificacao = javascript, Nivel = 80 }, new NivelQualificacao { qualificacao = CSharp, Nivel = 90 }, new NivelQualificacao { qualificacao = SerAutoDidata, Nivel = 50 }, }}, new Vaga { Titulo = "Vaga2", qualidadesDesejadas = new List<NivelQualificacao> { new NivelQualificacao { qualificacao = CSS, Nivel = 70 }, new NivelQualificacao { qualificacao = CSharp, Nivel = 60 }, new NivelQualificacao { qualificacao = TrabalhoEmEquipe, Nivel = 80 }, new NivelQualificacao { qualificacao = SerAutoDidata, Nivel = 80 }, }} }; RecommendationService rService = Factory.Instance.Get<RecommendationService>(); List<Vaga> listaVagasRecomendadas = rService.OrdenaVagasPorRecomendacao(usuario, listaVagasInicial); Assert.IsTrue(listaVagasRecomendadas != null); Assert.IsTrue(listaVagasRecomendadas[0].Titulo == "Vaga1", "Esperada vaga1, vaga retornada = " + listaVagasRecomendadas[0].Titulo); Assert.IsTrue(listaVagasRecomendadas[1].Titulo == "Vaga2", "Esperada vaga2, vaga retornada = " + listaVagasRecomendadas[1].Titulo); Assert.IsTrue(listaVagasRecomendadas[2].Titulo == "Vaga3", "Esperada vaga3, vaga retornada = " + listaVagasRecomendadas[2].Titulo); }
public UsuarioModel(Usuario usuario) { this.ID = usuario.ID; this.UserID = usuario.UserID; this.Email = usuario.Email; this.Nome = usuario.Nome; this.Sobrenome = usuario.Sobrenome; this.Roles = usuario.Roles; this.Latitude = usuario.Latitude; this.Longitude = usuario.Longitude; this.DataCriacao = usuario.DataCriacao; this.DataNascimento = usuario.DataNascimento; this.Genero = usuario.Genero; this.FacebookID = usuario.FacebookID; this.EmailVerificado = usuario.EmailVerificado; this.CadastradoPeloFacebook = usuario.CadastradoPeloFacebook; this.Descricao = usuario.Descricao; this.DescricaoMarkdown = usuario.DescricaoMarkdown; this.HeaderImageUrl = usuario.HeaderImageUrl; this.ProfileImageUrl = usuario.ProfileImageUrl; this.Bloqueado = usuario.Bloqueado; this.EhAdmin = usuario.Roles.Contains("admin"); }
public void TestSimilaridade1Inverso() { Usuario usuario = new Usuario { avaliacoes = new List<Avaliacao> { new Avaliacao { Gostou = true, vaga = vaga1 } } }; Usuario outro = new Usuario { avaliacoes = new List<Avaliacao> { new Avaliacao { Gostou = false, vaga = vaga1 } } }; Assert.AreEqual(-1, jaccardService.SimilaridadeDeUsuarioComOutroUsuario(usuario, outro)); }
private IEnumerable<Vaga> OrdenaVagasRestantesPorConteudo(List<JaccardService.PontuacaoVaga> vagasOrdenadasPorJaccard, Usuario usuario) { IEnumerable<Vaga> vagasOrdenadas = new List<Vaga>(); List<Vaga> tempVagas = new List<Vaga>(); if (vagasOrdenadasPorJaccard.Count > 1) { tempVagas.Add(vagasOrdenadasPorJaccard[0].vaga); } else { return vagasOrdenadasPorJaccard.Select(v => v.vaga); } for (int i = 1; i < vagasOrdenadasPorJaccard.Count(); ++i) { if (vagasOrdenadasPorJaccard[i].predicaoAvaliacao != vagasOrdenadasPorJaccard[i - 1].predicaoAvaliacao) { tempVagas = _recommendationService.OrdenaVagasPorRecomendacao(usuario, tempVagas); vagasOrdenadas = vagasOrdenadas.Concat(tempVagas); tempVagas = new List<Vaga>(); } tempVagas.Add(vagasOrdenadasPorJaccard[i].vaga); } tempVagas = _recommendationService.OrdenaVagasPorRecomendacao(usuario, tempVagas); vagasOrdenadas = vagasOrdenadas.Concat(tempVagas); return vagasOrdenadas.ToList(); }
public bool RegistrarUsuario(string Nome, string userID, string Email, string senha) { Usuario usuario = _uow.Usuarios.Get(u => u.UserID.ToLower() == userID.ToLower() || u.Email.ToLower() == Email.ToLower()).FirstOrDefault(); if (Nome != HtmlRemoval.StripTagsRegex(Nome) || Email != HtmlRemoval.StripTagsRegex(Email) || userID != HtmlRemoval.StripTagsRegex(userID)) return false; if (usuario != null || userID.Length < 6 || Nome.Length < 2 || Email.Length < 5 || senha.Length < 6) return false; string patternEmail = @"^[a-z0-9!#$%&'*+/=?^_`{|}~.-]+@[a-z0-9-]+\.([a-z0-9])+(\.[a-z0-9]+)*"; Regex rgx = new Regex(patternEmail, RegexOptions.IgnoreCase); if (!rgx.IsMatch(Email)) return false; Usuario novoUsuario = new Usuario() { Nome = Nome, Email = Email, UserID = userID, Senha = senha, Roles = "user", DataCriacao = DateTime.Now }; _uow.Usuarios.Insert(novoUsuario); _uow.Save(); return true; }
private Usuario GetUsuarioFromUsuarioModel(UsuarioModel usuarioModel) { if (usuarioModel == null) return null; Usuario usuario = new Usuario(); usuarioModel.Nome = HtmlRemoval.StripTagsRegex(usuarioModel.Nome); usuarioModel.DescricaoMarkdown = HtmlRemoval.StripTagsRegex(usuarioModel.DescricaoMarkdown); usuarioModel.Descricao = HtmlRemoval.StripTagsRegex(usuarioModel.Descricao); usuarioModel.ProfileImageUrl = HtmlRemoval.StripTagsRegex(usuarioModel.ProfileImageUrl); usuarioModel.HeaderImageUrl = HtmlRemoval.StripTagsRegex(usuarioModel.HeaderImageUrl); Uri uriResult; if (!(Uri.TryCreate(usuarioModel.ProfileImageUrl, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp)) { usuarioModel.ProfileImageUrl = null; } if (!(Uri.TryCreate(usuarioModel.HeaderImageUrl, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp)) { usuarioModel.HeaderImageUrl = null; } usuario.Nome = usuarioModel.Nome.Substring(0, usuarioModel.Nome.Length > 29 ? 29 : usuarioModel.Nome.Length); usuario.Descricao = usuarioModel.Descricao.Substring(0, usuarioModel.Descricao.Length > 79 ? 79 : usuarioModel.Descricao.Length); usuario.DescricaoMarkdown = usuarioModel.DescricaoMarkdown.Substring(0, usuarioModel.DescricaoMarkdown.Length > 3999 ? 3999 : usuarioModel.DescricaoMarkdown.Length); usuario.ProfileImageUrl = usuarioModel.ProfileImageUrl; usuario.HeaderImageUrl = usuarioModel.HeaderImageUrl; return usuario; }
public void TestUmaSoQualidade2() { Usuario usuario = new Usuario { qualidades = new List<NivelQualificacao> { new NivelQualificacao { qualificacao = jQuery, Nivel = 80 }, new NivelQualificacao { qualificacao = javascript, Nivel = 80 }, new NivelQualificacao { qualificacao = CSharp, Nivel = 80 } } }; List<Vaga> listaVagasInicial = new List<Vaga> { new Vaga { Titulo = "Vaga1", qualidadesDesejadas = new List<NivelQualificacao> { new NivelQualificacao { qualificacao = javascript, Nivel = 75 } }}, new Vaga { Titulo = "Vaga3", qualidadesDesejadas = new List<NivelQualificacao> { new NivelQualificacao { qualificacao = CSharp, Nivel = 85 } }}, new Vaga { Titulo = "Vaga2", qualidadesDesejadas = new List<NivelQualificacao> { new NivelQualificacao { qualificacao = jQuery, Nivel = 81 } }} }; RecommendationService rService = Factory.Instance.Get<RecommendationService>(); List<Vaga> listaVagasRecomendadas = rService.OrdenaVagasPorRecomendacao(usuario, listaVagasInicial); Assert.IsTrue(listaVagasRecomendadas != null); Assert.IsTrue(listaVagasRecomendadas[0].Titulo == "Vaga1", "Esperada vaga1, vaga retornada = " + listaVagasRecomendadas[0].Titulo); Assert.IsTrue(listaVagasRecomendadas[1].Titulo == "Vaga2", "Esperada vaga2, vaga retornada = " + listaVagasRecomendadas[1].Titulo); Assert.IsTrue(listaVagasRecomendadas[2].Titulo == "Vaga3", "Esperada vaga3, vaga retornada = " + listaVagasRecomendadas[2].Titulo); }
public void TestSalarioERequisitosLigeiramenteDiferentes() { Usuario usuario = new Usuario { qualidades = new List<NivelQualificacao> { new NivelQualificacao { qualificacao = jQuery, Nivel = 70 }, new NivelQualificacao { qualificacao = javascript, Nivel = 80 }, new NivelQualificacao { qualificacao = CSharp, Nivel = 90 }, } }; List<Vaga> listaVagasInicial = new List<Vaga> { new Vaga { Titulo = "Vaga2", Salario = 2100, qualidadesDesejadas = new List<NivelQualificacao> { new NivelQualificacao { qualificacao = jQuery, Nivel = 70 }, new NivelQualificacao { qualificacao = javascript, Nivel = 80 }, new NivelQualificacao { qualificacao = CSharp, Nivel = 90 }, new NivelQualificacao { qualificacao = SerAutoDidata, Nivel = 50 }, }}, new Vaga { Titulo = "Vaga1", Salario = 2500, qualidadesDesejadas = new List<NivelQualificacao> { new NivelQualificacao { qualificacao = jQuery, Nivel = 80 }, new NivelQualificacao { qualificacao = javascript, Nivel = 90 }, new NivelQualificacao { qualificacao = CSharp, Nivel = 90 }, new NivelQualificacao { qualificacao = SerAutoDidata, Nivel = 50 }, }} }; RecommendationService rService = Factory.Instance.Get<RecommendationService>(); List<Vaga> listaVagasRecomendadas = rService.OrdenaVagasPorRecomendacao(usuario, listaVagasInicial); Assert.IsTrue(listaVagasRecomendadas != null); Assert.IsTrue(listaVagasRecomendadas[0].Titulo == "Vaga1", "Esperada vaga1, vaga retornada = " + listaVagasRecomendadas[0].Titulo); Assert.IsTrue(listaVagasRecomendadas[1].Titulo == "Vaga2", "Esperada vaga2, vaga retornada = " + listaVagasRecomendadas[1].Titulo); }
public void TestPorcentagem75Porcento() { Usuario usuario = new Usuario { qualidades = new List<NivelQualificacao> { new NivelQualificacao { qualificacao = jQuery, Nivel = 100 }, new NivelQualificacao { qualificacao = javascript, Nivel = 100 }, new NivelQualificacao { qualificacao = CSharp, Nivel = 100 }, } }; Vaga vaga = new Vaga { Titulo = "Vaga2", Salario = 2100, qualidadesDesejadas = new List<NivelQualificacao> { new NivelQualificacao { qualificacao = jQuery, Nivel = 100 }, new NivelQualificacao { qualificacao = javascript, Nivel = 100 }, new NivelQualificacao { qualificacao = CSharp, Nivel = 100 }, new NivelQualificacao { qualificacao = SerAutoDidata, Nivel = 100 }, } }; RecommendationService rService = Factory.Instance.Get<RecommendationService>(); Assert.AreEqual(rService.CalculaPercentagemDeRequisitosAtendidos(usuario, vaga), 0.75); }