Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(138)

Side by Side Diff: components/ntp_snippets/user_classifier.cc

Issue 2748053002: Merge "[UserClassifier] Fix the classification for M58 condensed NTP..." (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « components/ntp_snippets/user_classifier.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « components/ntp_snippets/user_classifier.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698