| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/ntp_snippets/user_classifier.h" | 5 #include "components/ntp_snippets/user_classifier.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cfloat> | 8 #include <cfloat> |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 const double kMaxHours = 7 * 24; | 34 const double kMaxHours = 7 * 24; |
| 35 const char kMaxHoursParam[] = "user_classifier_max_hours"; | 35 const char kMaxHoursParam[] = "user_classifier_max_hours"; |
| 36 | 36 |
| 37 // Ignore events within |kMinHours| hours since the last event (|kMinHours| is | 37 // Ignore events within |kMinHours| hours since the last event (|kMinHours| is |
| 38 // the length of the browsing session where subsequent events of the same type | 38 // the length of the browsing session where subsequent events of the same type |
| 39 // do not count again). | 39 // do not count again). |
| 40 const double kMinHours = 0.5; | 40 const double kMinHours = 0.5; |
| 41 const char kMinHoursParam[] = "user_classifier_min_hours"; | 41 const char kMinHoursParam[] = "user_classifier_min_hours"; |
| 42 | 42 |
| 43 // Classification constants. | 43 // Classification constants. |
| 44 const double kActiveConsumerScrollsAtLeastOncePerHours = 24; | 44 const double kActiveConsumerClicksAtLeastOncePerHours = 72; |
| 45 const char kActiveConsumerScrollsAtLeastOncePerHoursParam[] = | 45 const char kActiveConsumerClicksAtLeastOncePerHoursParam[] = |
| 46 "user_classifier_active_consumer_scrolls_at_least_once_per_hours"; | 46 "user_classifier_active_consumer_clicks_at_least_once_per_hours"; |
| 47 | 47 |
| 48 const double kRareUserOpensNTPAtMostOncePerHours = 72; | 48 const double kRareUserOpensNTPAtMostOncePerHours = 96; |
| 49 const char kRareUserOpensNTPAtMostOncePerHoursParam[] = | 49 const char kRareUserOpensNTPAtMostOncePerHoursParam[] = |
| 50 "user_classifier_rare_user_opens_ntp_at_most_once_per_hours"; | 50 "user_classifier_rare_user_opens_ntp_at_most_once_per_hours"; |
| 51 | 51 |
| 52 // Histograms for logging the estimated average hours to next event. | 52 // Histograms for logging the estimated average hours to next event. |
| 53 const char kHistogramAverageHoursToOpenNTP[] = | 53 const char kHistogramAverageHoursToOpenNTP[] = |
| 54 "NewTabPage.UserClassifier.AverageHoursToOpenNTP"; | 54 "NewTabPage.UserClassifier.AverageHoursToOpenNTP"; |
| 55 const char kHistogramAverageHoursToShowSuggestions[] = | 55 const char kHistogramAverageHoursToShowSuggestions[] = |
| 56 "NewTabPage.UserClassifier.AverageHoursToShowSuggestions"; | 56 "NewTabPage.UserClassifier.AverageHoursToShowSuggestions"; |
| 57 const char kHistogramAverageHoursToUseSuggestions[] = | 57 const char kHistogramAverageHoursToUseSuggestions[] = |
| 58 "NewTabPage.UserClassifier.AverageHoursToUseSuggestions"; | 58 "NewTabPage.UserClassifier.AverageHoursToUseSuggestions"; |
| 59 | 59 |
| 60 // The enum used for iteration. | 60 // The enum used for iteration. |
| 61 const UserClassifier::Metric kMetrics[] = { | 61 const UserClassifier::Metric kMetrics[] = { |
| 62 UserClassifier::Metric::NTP_OPENED, | 62 UserClassifier::Metric::NTP_OPENED, |
| 63 UserClassifier::Metric::SUGGESTIONS_SHOWN, | 63 UserClassifier::Metric::SUGGESTIONS_SHOWN, |
| 64 UserClassifier::Metric::SUGGESTIONS_USED}; | 64 UserClassifier::Metric::SUGGESTIONS_USED}; |
| 65 | 65 |
| 66 // The summary of the prefs. | 66 // The summary of the prefs. |
| 67 const char* kMetricKeys[] = { | 67 const char* kMetricKeys[] = { |
| 68 prefs::kUserClassifierAverageNTPOpenedPerHour, | 68 prefs::kUserClassifierAverageNTPOpenedPerHour, |
| 69 prefs::kUserClassifierAverageSuggestionsShownPerHour, | 69 prefs::kUserClassifierAverageSuggestionsShownPerHour, |
| 70 prefs::kUserClassifierAverageSuggestionsUsedPerHour}; | 70 prefs::kUserClassifierAverageSuggestionsUsedPerHour}; |
| 71 const char* kLastTimeKeys[] = {prefs::kUserClassifierLastTimeToOpenNTP, | 71 const char* kLastTimeKeys[] = {prefs::kUserClassifierLastTimeToOpenNTP, |
| 72 prefs::kUserClassifierLastTimeToShowSuggestions, | 72 prefs::kUserClassifierLastTimeToShowSuggestions, |
| 73 prefs::kUserClassifierLastTimeToUseSuggestions}; | 73 prefs::kUserClassifierLastTimeToUseSuggestions}; |
| 74 | 74 |
| 75 // Default lengths of the intervals for new users for the metrics. | 75 // Default lengths of the intervals for new users for the metrics. |
| 76 const double kInitialHoursBetweenEvents[] = {24, 36, 48}; | 76 const double kInitialHoursBetweenEvents[] = {24, 48, 96}; |
| 77 const char* kInitialHoursBetweenEventsParams[] = { | 77 const char* kInitialHoursBetweenEventsParams[] = { |
| 78 "user_classifier_default_interval_ntp_opened", | 78 "user_classifier_default_interval_ntp_opened", |
| 79 "user_classifier_default_interval_suggestions_shown", | 79 "user_classifier_default_interval_suggestions_shown", |
| 80 "user_classifier_default_interval_suggestions_used"}; | 80 "user_classifier_default_interval_suggestions_used"}; |
| 81 | 81 |
| 82 static_assert(arraysize(kMetrics) == | 82 static_assert(arraysize(kMetrics) == |
| 83 static_cast<int>(UserClassifier::Metric::COUNT) && | 83 static_cast<int>(UserClassifier::Metric::COUNT) && |
| 84 arraysize(kMetricKeys) == | 84 arraysize(kMetricKeys) == |
| 85 static_cast<int>(UserClassifier::Metric::COUNT) && | 85 static_cast<int>(UserClassifier::Metric::COUNT) && |
| 86 arraysize(kLastTimeKeys) == | 86 arraysize(kLastTimeKeys) == |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 return 1.0 / (1.0 - std::exp(-discount_rate_per_hour * estimate_hours)); | 179 return 1.0 / (1.0 - std::exp(-discount_rate_per_hour * estimate_hours)); |
| 180 } | 180 } |
| 181 | 181 |
| 182 } // namespace | 182 } // namespace |
| 183 | 183 |
| 184 UserClassifier::UserClassifier(PrefService* pref_service) | 184 UserClassifier::UserClassifier(PrefService* pref_service) |
| 185 : pref_service_(pref_service), | 185 : pref_service_(pref_service), |
| 186 discount_rate_per_hour_(GetDiscountRatePerHour()), | 186 discount_rate_per_hour_(GetDiscountRatePerHour()), |
| 187 min_hours_(GetMinHours()), | 187 min_hours_(GetMinHours()), |
| 188 max_hours_(GetMaxHours()), | 188 max_hours_(GetMaxHours()), |
| 189 active_consumer_scrolls_at_least_once_per_hours_( | 189 active_consumer_clicks_at_least_once_per_hours_( |
| 190 variations::GetVariationParamByFeatureAsDouble( | 190 variations::GetVariationParamByFeatureAsDouble( |
| 191 kArticleSuggestionsFeature, | 191 kArticleSuggestionsFeature, |
| 192 kActiveConsumerScrollsAtLeastOncePerHoursParam, | 192 kActiveConsumerClicksAtLeastOncePerHoursParam, |
| 193 kActiveConsumerScrollsAtLeastOncePerHours)), | 193 kActiveConsumerClicksAtLeastOncePerHours)), |
| 194 rare_user_opens_ntp_at_most_once_per_hours_( | 194 rare_user_opens_ntp_at_most_once_per_hours_( |
| 195 variations::GetVariationParamByFeatureAsDouble( | 195 variations::GetVariationParamByFeatureAsDouble( |
| 196 kArticleSuggestionsFeature, | 196 kArticleSuggestionsFeature, |
| 197 kRareUserOpensNTPAtMostOncePerHoursParam, | 197 kRareUserOpensNTPAtMostOncePerHoursParam, |
| 198 kRareUserOpensNTPAtMostOncePerHours)) { | 198 kRareUserOpensNTPAtMostOncePerHours)) { |
| 199 // The pref_service_ can be null in tests. | 199 // The pref_service_ can be null in tests. |
| 200 if (!pref_service_) { | 200 if (!pref_service_) { |
| 201 return; | 201 return; |
| 202 } | 202 } |
| 203 | 203 |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 // The pref_service_ can be null in tests. | 269 // The pref_service_ can be null in tests. |
| 270 if (!pref_service_) { | 270 if (!pref_service_) { |
| 271 return UserClass::ACTIVE_NTP_USER; | 271 return UserClass::ACTIVE_NTP_USER; |
| 272 } | 272 } |
| 273 | 273 |
| 274 if (GetEstimatedAvgTime(Metric::NTP_OPENED) >= | 274 if (GetEstimatedAvgTime(Metric::NTP_OPENED) >= |
| 275 rare_user_opens_ntp_at_most_once_per_hours_) { | 275 rare_user_opens_ntp_at_most_once_per_hours_) { |
| 276 return UserClass::RARE_NTP_USER; | 276 return UserClass::RARE_NTP_USER; |
| 277 } | 277 } |
| 278 | 278 |
| 279 if (GetEstimatedAvgTime(Metric::SUGGESTIONS_SHOWN) <= | 279 if (GetEstimatedAvgTime(Metric::SUGGESTIONS_USED) <= |
| 280 active_consumer_scrolls_at_least_once_per_hours_) { | 280 active_consumer_clicks_at_least_once_per_hours_) { |
| 281 return UserClass::ACTIVE_SUGGESTIONS_CONSUMER; | 281 return UserClass::ACTIVE_SUGGESTIONS_CONSUMER; |
| 282 } | 282 } |
| 283 | 283 |
| 284 return UserClass::ACTIVE_NTP_USER; | 284 return UserClass::ACTIVE_NTP_USER; |
| 285 } | 285 } |
| 286 | 286 |
| 287 std::string UserClassifier::GetUserClassDescriptionForDebugging() const { | 287 std::string UserClassifier::GetUserClassDescriptionForDebugging() const { |
| 288 switch (GetUserClass()) { | 288 switch (GetUserClass()) { |
| 289 case UserClass::RARE_NTP_USER: | 289 case UserClass::RARE_NTP_USER: |
| 290 return "Rare user of the NTP"; | 290 return "Rare user of the NTP"; |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 373 | 373 |
| 374 void UserClassifier::SetMetricValue(Metric metric, double metric_value) { | 374 void UserClassifier::SetMetricValue(Metric metric, double metric_value) { |
| 375 pref_service_->SetDouble(kMetricKeys[static_cast<int>(metric)], metric_value); | 375 pref_service_->SetDouble(kMetricKeys[static_cast<int>(metric)], metric_value); |
| 376 } | 376 } |
| 377 | 377 |
| 378 void UserClassifier::ClearMetricValue(Metric metric) { | 378 void UserClassifier::ClearMetricValue(Metric metric) { |
| 379 pref_service_->ClearPref(kMetricKeys[static_cast<int>(metric)]); | 379 pref_service_->ClearPref(kMetricKeys[static_cast<int>(metric)]); |
| 380 } | 380 } |
| 381 | 381 |
| 382 } // namespace ntp_snippets | 382 } // namespace ntp_snippets |
| OLD | NEW |