示例#1
0
        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);
        }
示例#2
0
        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());
        }