public double GetCosineDistance(BagOfWords bag1, BagOfWords bag2, bool useLabels) { var words1 = useLabels ? bag1.Labels : bag1.WordsFrequency; var words2 = useLabels ? bag2.Labels : bag2.WordsFrequency; double numerator = 0; double denumerator1 = 0; foreach (var word1 in words1) { if (words2.ContainsKey(word1.Key)) { numerator += word1.Value.Frequency * words2[word1.Key].Frequency; } denumerator1 += word1.Value.Frequency * word1.Value.Frequency; } denumerator1 = Math.Sqrt(denumerator1); double denumerator2 = 0; foreach (var word in words2) { denumerator2 += word.Value.Frequency * word.Value.Frequency; } denumerator2 = Math.Sqrt(denumerator2); double result = numerator / (denumerator1 * denumerator2); return(result); }
public List <DocumentRating> CalculateRatings(List <BagOfWords> bags) { Clustering clustering = new Clustering(); var ratings = new List <DocumentRating>(); for (int i = 0; i < bags.Count - 1; i++) { BagOfWords bag = bags[i]; if (Interest != null && Interest.LikedDocs.Contains(bag.DocumentID)) { continue; } double sim = clustering.GetCosineDistance(this, bag, true); ratings.Add(new DocumentRating() { ID = bag.DocumentID, Name = bag.Name, Type = bag.Type, Rating = sim }); } return(ratings.OrderByDescending(rating => rating.Rating).ToList()); }