/// <summary> /// Возвращает список наилучших соответствий для человека из словаря prefs. /// </summary> /// <param name="prefs">Список оценок</param> /// <param name="person">Имя критика для которого происходит сравнение</param> /// <param name="typeSimilarity">Тип функции подобия</param> /// <param name="n">Количество результатов в списке</param> /// <returns>Список результатов</returns> private static IEnumerable <KeyValuePair <string, decimal> > TopMatches(Dictionary <string, List <RatingFilm> > prefs, string person, Type typeSimilarity, int n = 5) { var similarity = FactoryDistance.CreateDistance(typeSimilarity, prefs); return(prefs.Where(rec => rec.Key != person) .Select(pref => new KeyValuePair <string, decimal>(pref.Key, similarity.SimDistance(pref.Key, person))) .OrderByDescending(x => x.Value) .Take(n) .ToList()); }
static void Main(string[] args) { Console.WriteLine("[1] Евклидово расстояние"); Console.WriteLine("[2] Корреляции Пирсона"); Console.WriteLine("[3] Ранжирование критиков 'Евклидово расстояние'"); Console.WriteLine("[4] Ранжирование критиков 'Корреляции Пирсона'"); Console.WriteLine("[другое] Выход"); var ch = Console.ReadKey(); Console.Clear(); IDistance distance = null; switch (ch.KeyChar) { case '1': distance = FactoryDistance.CreateDistance <EuclideanDistance>(Program.GetCritics()); break; case '2': distance = FactoryDistance.CreateDistance <CorrelationPearson>(Program.GetCritics()); break; case '3': Program.RankingCritics(typeof(EuclideanDistance), Console.In, Console.Out); break; case '4': Program.RankingCritics(typeof(CorrelationPearson), Console.In, Console.Out); break; } if (distance != null) { var result = distance.SimDistance("Lisa Rose", "Gene Seymour"); Console.WriteLine("Результат = {0}", result); } Console.ReadKey(); }
private static IEnumerable <KeyValuePair <string, decimal> > GetRecommendations(Dictionary <string, List <RatingFilm> > prefs, string person, Type typeSimilarity) { var result = new List <KeyValuePair <string, decimal> >(); var similarity = FactoryDistance.CreateDistance(typeSimilarity, prefs); foreach (var pref in prefs.Where(rec => rec.Key != person)) { var sim = similarity.SimDistance(person, pref.Key); // Игнорировать нулевые и отрицательные оценки if (sim <= 0) { continue; } // Оценивать только фильмы, которые я еще не смотрел foreach (var ratingFilms in pref.Value.Where(item => !prefs[person].Contains(item) || prefs[person].Find(x => x == item).Rating == 0)) { } } return(result); }
/// <summary> /// Создает указанный вычислитель /// </summary> /// <typeparam name="T">Тип вычислителя</typeparam> /// <param name="critics">Список критиков</param> /// <returns>Новый вычислитель</returns> public static IDistance CreateDistance <T>(Dictionary <string, List <RatingFilm> > critics) where T : IDistance { return(FactoryDistance.CreateDistance(typeof(T), critics)); }