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

Unified Diff: chrome/browser/history/url_index_private_data.cc

Issue 9359056: Merge 120346 - Fine-tune HQP Candidate Result Scoring (Closed) Base URL: svn://svn.chromium.org/chrome/branches/1025/src/
Patch Set: Created 8 years, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/history/in_memory_url_index_unittest.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/history/url_index_private_data.cc
===================================================================
--- chrome/browser/history/url_index_private_data.cc (revision 122007)
+++ chrome/browser/history/url_index_private_data.cc (working copy)
@@ -43,11 +43,16 @@
typedef imui::InMemoryURLIndexCacheItem_HistoryInfoMapItem_HistoryInfoMapEntry
HistoryInfoMapEntry;
+// The maximum score any candidate result can achieve.
+const int kMaxTotalScore = 1425;
+
// Score ranges used to get a 'base' score for each of the scoring factors
// (such as recency of last visit, times visited, times the URL was typed,
// and the quality of the string match). There is a matching value range for
-// each of these scores for each factor.
-const int kScoreRank[] = { 1425, 1200, 900, 400 };
+// each of these scores for each factor. Note that the top score is greater
+// than |kMaxTotalScore|. The score for each candidate will be capped in the
+// final calculation.
+const int kScoreRank[] = { 1450, 1200, 900, 400 };
// SearchTermCacheItem ---------------------------------------------------------
@@ -562,39 +567,34 @@
// Determine scoring factors for the recency of visit, visit count and typed
// count attributes of the URLRow.
- const int kDaysAgoLevel[] = { 0, 10, 20, 30 };
+ const int kDaysAgoLevel[] = { 1, 10, 20, 30 };
int days_ago_value = ScoreForValue((base::Time::Now() -
row.last_visit()).InDays(), kDaysAgoLevel);
const int kVisitCountLevel[] = { 30, 10, 5, 3 };
int visit_count_value = ScoreForValue(row.visit_count(), kVisitCountLevel);
- const int kTypedCountLevel[] = { 10, 5, 3, 1 };
+ const int kTypedCountLevel[] = { 20, 10, 3, 1 };
int typed_count_value = ScoreForValue(row.typed_count(), kTypedCountLevel);
// The final raw score is calculated by:
- // - accumulating each contributing factor, some of which are added more
- // than once giving them more 'influence' on the final score (currently,
- // visit_count_value is added twice and typed_count_value three times)
- // - dropping the lowest scores (|kInsignificantFactors|)
- // - dividing by the remaining significant factors
- // This approach allows emphasis on more relevant factors while reducing the
- // inordinate impact of low scoring factors.
- int factor[] = {term_score, days_ago_value, visit_count_value,
- visit_count_value, typed_count_value, typed_count_value,
- typed_count_value};
- const int kInsignificantFactors = 2;
- const int kSignificantFactors = arraysize(factor) - kInsignificantFactors;
- std::partial_sort(factor, factor + kSignificantFactors,
- factor + arraysize(factor), std::greater<int>());
- for (int i = 0; i < kSignificantFactors; ++i)
- match.raw_score += factor[i];
- match.raw_score /= kSignificantFactors;
+ // - multiplying each factor by a 'relevance'
+ // - calculating the average.
+ const int kTermScoreRelevance = 1;
+ const int kDaysAgoRelevance = 2;
+ const int kVisitCountRelevance = 3;
+ const int kTypedCountRelevance = 4;
+ match.raw_score = term_score * kTermScoreRelevance +
+ days_ago_value * kDaysAgoRelevance +
+ visit_count_value * kVisitCountRelevance +
+ typed_count_value * kTypedCountRelevance;
+ match.raw_score /= (kTermScoreRelevance + kDaysAgoRelevance +
+ kVisitCountRelevance + kTypedCountRelevance);
+ match.raw_score = std::min(kMaxTotalScore, match.raw_score);
return match;
}
int URLIndexPrivateData::ScoreComponentForMatches(const TermMatches& matches,
size_t max_length) {
- // TODO(mrossetti): This is good enough for now but must be fine-tuned.
if (matches.empty())
return 0;
@@ -602,7 +602,7 @@
// in the same order in the match. Start with kOrderMaxValue points divided
// equally among (number of terms - 1); then discount each of those terms that
// is out-of-order in the match.
- const int kOrderMaxValue = 250;
+ const int kOrderMaxValue = 1000;
int order_value = kOrderMaxValue;
if (matches.size() > 1) {
int max_possible_out_of_order = matches.size() - 1;
@@ -617,11 +617,11 @@
// Score component for how early in the match string the first search term
// appears. Start with kStartMaxValue points and discount by
- // 1/kMaxSignificantStart points for each character later than the first at
- // which the term begins. No points are earned if the start of the match
- // occurs at or after kMaxSignificantStart.
- const size_t kMaxSignificantStart = 20;
- const int kStartMaxValue = 250;
+ // kStartMaxValue/kMaxSignificantStart points for each character later than
+ // the first at which the term begins. No points are earned if the start of
+ // the match occurs at or after kMaxSignificantStart.
+ const size_t kMaxSignificantStart = 50;
+ const int kStartMaxValue = 1000;
int start_value = (kMaxSignificantStart -
std::min(kMaxSignificantStart, matches[0].offset)) * kStartMaxValue /
kMaxSignificantStart;
@@ -634,15 +634,21 @@
const size_t kMaxSignificantLength = 50;
size_t max_significant_length =
std::min(max_length, std::max(term_length_total, kMaxSignificantLength));
- const int kCompleteMaxValue = 500;
+ const int kCompleteMaxValue = 1000;
int complete_value =
term_length_total * kCompleteMaxValue / max_significant_length;
- int raw_score = order_value + start_value + complete_value;
- const int kTermScoreLevel[] = { 1000, 650, 500, 200 };
+ const int kOrderRelevance = 1;
+ const int kStartRelevance = 6;
+ const int kCompleteRelevance = 3;
+ int raw_score = order_value * kOrderRelevance +
+ start_value * kStartRelevance +
+ complete_value * kCompleteRelevance;
+ raw_score /= (kOrderRelevance + kStartRelevance + kCompleteRelevance);
- // Scale the sum of the three components above into a single score component
- // on the same scale as that used in ScoredMatchForURL().
+ // Scale the raw score into a single score component in the same manner as
+ // used in ScoredMatchForURL().
+ const int kTermScoreLevel[] = { 1000, 750, 500, 200 };
return ScoreForValue(raw_score, kTermScoreLevel);
}
« no previous file with comments | « chrome/browser/history/in_memory_url_index_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698