/// <summary> /// Computes the number of original observations, positive /// ratings, and negative ratings for each user and item /// </summary> /// <param name="userRatingCounts">A map from each user to their rating counts.</param> /// <param name="itemRatingCounts">A map from each item to its rating counts.</param> private void ComputeRatingCounts( out IDictionary <string, RatingCounts> userRatingCounts, out IDictionary <string, RatingCounts> itemRatingCounts) { Rand.Restart(12347); var positiveOnlyMapping = new PositiveOnlyDataMapping(); var negativeDataGeneratorMapping = positiveOnlyMapping.WithGeneratedNegativeData(1.0); userRatingCounts = new Dictionary <string, RatingCounts>(); itemRatingCounts = new Dictionary <string, RatingCounts>(); // Count the number of positive observations for each user and item. foreach (var instance in positiveOnlyMapping.GetInstances(this.positiveOnlyDataset)) { var user = positiveOnlyMapping.GetUser(this.positiveOnlyDataset, instance); var item = positiveOnlyMapping.GetItem(this.positiveOnlyDataset, instance); RatingCounts ratingCounts; if (!userRatingCounts.TryGetValue(user, out ratingCounts)) { ratingCounts = new RatingCounts(); userRatingCounts.Add(user, ratingCounts); } ++ratingCounts.Original; if (!itemRatingCounts.TryGetValue(item, out ratingCounts)) { ratingCounts = new RatingCounts(); itemRatingCounts.Add(item, ratingCounts); } ++ratingCounts.Original; } // Compute the number of positive and negative ratings generated for each user and item. foreach (var instance in negativeDataGeneratorMapping.GetInstances(this.positiveOnlyDataset)) { var user = negativeDataGeneratorMapping.GetUser(this.positiveOnlyDataset, instance); var item = negativeDataGeneratorMapping.GetItem(this.positiveOnlyDataset, instance); var rating = negativeDataGeneratorMapping.GetRating(this.positiveOnlyDataset, instance); if (rating == 1) { ++userRatingCounts[user].Positive; ++itemRatingCounts[item].Positive; } else if (rating == 0) { ++userRatingCounts[user].Negative; ++itemRatingCounts[item].Negative; } } }
// Constructor for database end. public ProductRating(long pid, string languageString, int nativeTotalReviewCount, int externalTotalReviewCount, int combinedTotalReviewCount, RatingCounts nativeRatings, RatingCounts externalRatings) { PID = pid; LanguageString = languageString; NativeRatings = nativeRatings; ExternalRatings = externalRatings; NativeTotalReviewCount = nativeTotalReviewCount; ExternalTotalReviewCount = externalTotalReviewCount; CombinedTotalReviewCount = combinedTotalReviewCount; }