Exemplo n.º 1
0
        public UserMovieRatingsTable GetUserMovieRatingsTable()
        {
            var users       = _mapper.Map <IEnumerable <UserViewModel> >(_userRepository.GetAll());
            var usersIdList = new List <string>();

            foreach (var user in users)
            {
                usersIdList.Add(user.Id);
            }
            UserMovieRatingsTable table = new UserMovieRatingsTable();

            table.UserIndexToId = usersIdList;
            var movies       = _mapper.Map <IEnumerable <MovieViewModel> >(_movieRepository.GetAll());
            var moviesIdList = new List <int>();

            foreach (var movie in movies)
            {
                moviesIdList.Add(movie.Id);
            }
            table.MovieIndexToId = moviesIdList;
            foreach (var userId in table.UserIndexToId)
            {
                table.Users.Add(new UserMoviesRatings(userId, table.MovieIndexToId.Count));
            }
            foreach (var user in _userRepository.GetAll())
            {
                var userActions = _userActionRepo.GetAll().Where(x => x.UserId == user.Id);

                foreach (var movie in _movieRepository.GetAll())
                {
                    List <UserActionsViewModel> actionsForMovie = new List <UserActionsViewModel>();

                    foreach (var userAction in userActions)
                    {
                        var userActionsMovie = _userActionMovieRepo.GetAll().Where(x => x.MovieId == movie.Id && x.UserActionId == userAction.Id);
                        foreach (var userActionMovie in userActionsMovie)
                        {
                            UserActionsViewModel userActionsViewModel = new UserActionsViewModel
                            {
                                Action = (ActionsViewModel)userActionMovie.UserActions.Action,
                            };
                            actionsForMovie.Add(userActionsViewModel);
                        }
                    }
                    int userIndex  = table.UserIndexToId.IndexOf(user.Id);
                    int movieIndex = table.MovieIndexToId.IndexOf(movie.Id);
                    table.Users[userIndex].MovieRatings[movieIndex] = Rating(actionsForMovie);
                }
            }
            return(table);
        }
Exemplo n.º 2
0
        private List <int> GetHighestRatedArticlesForUser(int userIndex, UserMovieRatingsTable table)
        {
            List <Tuple <int, double> > items = new List <Tuple <int, double> >();

            for (int articleIndex = 0; articleIndex < table.MovieIndexToId.Count; articleIndex++)
            {
                if (table.Users[userIndex].MovieRatings[articleIndex] != 0)
                {
                    items.Add(new Tuple <int, double>(articleIndex, table.Users[userIndex].MovieRatings[articleIndex]));
                }
            }
            items.Sort((c, n) => n.Item2.CompareTo(c.Item2));
            return(items.Select(x => x.Item1).ToList());
        }
Exemplo n.º 3
0
        private void FillTransposedRatings(UserMovieRatingsTable table)
        {
            int features = table.Users.Count;

            transposedRatings = new double[table.MovieIndexToId.Count][];
            for (int a = 0; a < table.MovieIndexToId.Count; a++)
            {
                transposedRatings[a] = new double[features];

                for (int f = 0; f < features; f++)
                {
                    transposedRatings[a][f] = table.Users[f].MovieRatings[a];
                }
            }
        }
Exemplo n.º 4
0
        private List <MovieRating> GetNearestNeighbors(int movieId, int nummovies, UserMovieRatingsTable table)
        {
            FillTransposedRatings(table);
            List <MovieRating> neighbors = new List <MovieRating>();
            var     mainMovieIndex       = table.MovieIndexToId.IndexOf(movieId);
            Methods pearsoneCorrelation  = new Methods {
            };

            for (int movieIndex = 0; movieIndex < table.MovieIndexToId.Count - 1; movieIndex++)
            {
                int    searchMovieIndex = table.MovieIndexToId[movieIndex];
                double score            = pearsoneCorrelation.PearsoneCorrelation(transposedRatings[mainMovieIndex], transposedRatings[searchMovieIndex]);
                neighbors.Add(new MovieRating(searchMovieIndex, score));
            }
            neighbors.Sort((c, n) => n.Rating.CompareTo(c.Rating));
            return(neighbors.Take(nummovies).ToList());
        }
Exemplo n.º 5
0
        public List <MovieViewModel> GetSuggestions(string userId, int numSuggestions, UserMovieRatingsTable table)
        {
            int               userIndex   = table.UserIndexToId.IndexOf(userId);
            List <int>        movies      = GetHighestRatedArticlesForUser(userIndex, table).Take(5).ToList();
            List <Suggestion> suggestions = new List <Suggestion>();

            foreach (int movieIndex in movies)
            {
                int movieId = table.MovieIndexToId[movieIndex];
                List <MovieRating> neighboringMovies = GetNearestNeighbors(movieId, 5, table);
                foreach (MovieRating neighbor in neighboringMovies)
                {
                    int    neighborArticleIndex = table.MovieIndexToId.IndexOf(neighbor.MovieId);
                    double averageMovieRating   = 0.0;
                    int    count = 0;
                    for (int userRatingIndex = 0; userRatingIndex < table.UserIndexToId.Count; userRatingIndex++)
                    {
                        if (transposedRatings[neighborArticleIndex][userRatingIndex] != 0)
                        {
                            averageMovieRating += transposedRatings[neighborArticleIndex][userRatingIndex];
                            count++;
                        }
                    }
                    if (count > 0)
                    {
                        averageMovieRating /= count;
                    }
                    suggestions.Add(new Suggestion(userId, neighbor.MovieId, averageMovieRating));
                }
            }
            suggestions.Sort((c, n) => n.Rating.CompareTo(c.Rating));
            var suggestionsList = suggestions.Take(numSuggestions).ToList();
            List <MovieViewModel> movieViewModels = new List <MovieViewModel>();

            foreach (var suggestion in suggestionsList)
            {
                var movieViewModel = _mapper.Map <MovieViewModel>(_movieRepository.GetAll().FirstOrDefault(x => x.Id == suggestion.MovieId));
                movieViewModels.Add(movieViewModel);
            }
            return(movieViewModels);
        }
Exemplo n.º 6
0
        private List <UserMoviesRatings> GetNearestNeighbors(string userId, UserMoviesRatings user, int numUsers, UserMovieRatingsTable table)
        {
            List <UserMoviesRatings> neighbors = new List <UserMoviesRatings>();
            Methods pearsoneCorrelation        = new Methods {
            };

            for (var i = 0; i < table.Users.Count(); i++)
            {
                if (table.Users[i].UserId == user.UserId)
                {
                    table.Users[i].Score = double.NegativeInfinity;
                }
                else
                {
                    table.Users[i].Score = pearsoneCorrelation.PearsoneCorrelation(table.Users[i].MovieRatings, user.MovieRatings);
                }
            }
            var similarUsers = table.Users.OrderByDescending(x => x.Score);

            return(similarUsers.Take(numUsers).ToList());
        }
Exemplo n.º 7
0
        public List <MovieViewModel> GetSuggestions(string userId, int numSuggestions, UserMovieRatingsTable table)
        {
            int userIndex = table.UserIndexToId.IndexOf(userId);
            UserMoviesRatings        user        = table.Users[userIndex];
            List <Suggestion>        suggestions = new List <Suggestion>();
            List <UserMoviesRatings> neighbors   = GetNearestNeighbors(userId, user, 5, table);

            if (neighbors.ToList()[0].Score <= 0.5)
            {
                ItemBasedRecommender itemBasedRecommender = new ItemBasedRecommender(_mapper, _movieRepository);
                return(itemBasedRecommender.GetSuggestions(userId, 10, table));
            }
            for (int movieIndex = 0; movieIndex < table.MovieIndexToId.Count; movieIndex++)
            {
                if (user.MovieRatings[movieIndex] != 0)
                {
                    double score = 0.0;
                    int    count = 0;
                    for (var u = 0; u < neighbors.Count; u++)
                    {
                        if (neighbors[u].MovieRatings[movieIndex] != 0)
                        {
                            score += neighbors[u].MovieRatings[movieIndex] - ((u + 1.0) / 100.0);
                            count++;
                        }
                    }
                    if (count > 0)
                    {
                        score /= count;
                    }
                    suggestions.Add(new Suggestion(userId, table.MovieIndexToId[movieIndex], score));
                }
            }
            suggestions.Sort((c, n) => n.Rating.CompareTo(c.Rating));
            List <Suggestion>     suggestionsList = suggestions.Take(numSuggestions).ToList();
            List <MovieViewModel> movieViewModels = new List <MovieViewModel>();

            foreach (var suggestion in suggestionsList)
            {
                Movie movie = _movieRepository.GetById(suggestion.MovieId);
                movieViewModels.Add(_mapper.Map <MovieViewModel>(movie));
            }
            return(movieViewModels);
        }