From 38d0fb668602f9989a0ca74c0493da5d3bbf4690 Mon Sep 17 00:00:00 2001 From: Maxim Pimenov Date: Tue, 9 Apr 2019 18:46:54 +0300 Subject: [PATCH] [search] [assessment-tool] Added Relevance::Harmful. --- .../assessment_tool/result_view.cpp | 8 +++++++- .../assessment_tool/result_view.hpp | 1 + search/search_quality/gen-samples.lisp | 3 +++ search/search_quality/sample.cpp | 16 ++++++++++------ search/search_quality/sample.hpp | 12 ++++++++++++ search/search_quality/scoring_model.py | 2 +- 6 files changed, 34 insertions(+), 8 deletions(-) diff --git a/search/search_quality/assessment_tool/result_view.cpp b/search/search_quality/assessment_tool/result_view.cpp index f8cdb6cb9b..d4e31f9397 100644 --- a/search/search_quality/assessment_tool/result_view.cpp +++ b/search/search_quality/assessment_tool/result_view.cpp @@ -127,6 +127,7 @@ void ResultView::Init() auto * groupLayout = new QHBoxLayout(group /* parent */); group->setLayout(groupLayout); + m_harmful = CreateRatioButton("Harmful", *groupLayout); m_irrelevant = CreateRatioButton("Irrelevant", *groupLayout); m_relevant = CreateRatioButton("Relevant", *groupLayout); m_vital = CreateRatioButton("Vital", *groupLayout); @@ -141,6 +142,7 @@ void ResultView::SetContents(string const & name, string const & type, string co SetText(*m_type, type); SetText(*m_address, address); + m_harmful->setChecked(false); m_irrelevant->setChecked(false); m_relevant->setChecked(false); m_vital->setChecked(false); @@ -161,7 +163,9 @@ void ResultView::OnRelevanceChanged() return; auto relevance = Relevance::Irrelevant; - if (m_irrelevant->isChecked()) + if (m_harmful->isChecked()) + relevance = Relevance::Harmful; + else if (m_irrelevant->isChecked()) relevance = Relevance::Irrelevant; else if (m_relevant->isChecked()) relevance = Relevance::Relevant; @@ -176,6 +180,7 @@ void ResultView::UpdateRelevanceRadioButtons() if (!m_editor) return; + m_harmful->setChecked(false); m_irrelevant->setChecked(false); m_relevant->setChecked(false); m_vital->setChecked(false); @@ -187,6 +192,7 @@ void ResultView::UpdateRelevanceRadioButtons() switch (*r) { + case Relevance::Harmful: m_harmful->setChecked(true); break; case Relevance::Irrelevant: m_irrelevant->setChecked(true); break; case Relevance::Relevant: m_relevant->setChecked(true); break; case Relevance::Vital: m_vital->setChecked(true); break; diff --git a/search/search_quality/assessment_tool/result_view.hpp b/search/search_quality/assessment_tool/result_view.hpp index f5cec97724..cfefe72755 100644 --- a/search/search_quality/assessment_tool/result_view.hpp +++ b/search/search_quality/assessment_tool/result_view.hpp @@ -44,6 +44,7 @@ private: QLabel * m_type = nullptr; QLabel * m_address = nullptr; + QRadioButton * m_harmful = nullptr; QRadioButton * m_irrelevant = nullptr; QRadioButton * m_relevant = nullptr; QRadioButton * m_vital = nullptr; diff --git a/search/search_quality/gen-samples.lisp b/search/search_quality/gen-samples.lisp index a61fa6cd8b..4191e4adc6 100755 --- a/search/search_quality/gen-samples.lisp +++ b/search/search_quality/gen-samples.lisp @@ -78,6 +78,9 @@ exec /usr/bin/env sbcl --noinform --quit --load "$0" --end-toplevel-options "$@" (defmacro irrelevant (&rest args) `(make-result 'irrelevant ,@args)) +(defmacro harmful (&rest args) + `(make-result 'harmful ,@args)) + (defclass sample () ((query :initarg :query) (locale :initarg :locale) diff --git a/search/search_quality/sample.cpp b/search/search_quality/sample.cpp index c43f4d85e3..18ca3c5880 100644 --- a/search/search_quality/sample.cpp +++ b/search/search_quality/sample.cpp @@ -196,12 +196,14 @@ void FromJSONObject(json_t * root, char const * field, Sample::Result::Relevance { string r; FromJSONObject(root, field, r); - if (r == "vital") - relevance = search::Sample::Result::Relevance::Vital; - else if (r == "relevant") - relevance = search::Sample::Result::Relevance::Relevant; + if (r == "harmful") + relevance = search::Sample::Result::Relevance::Harmful; else if (r == "irrelevant") relevance = search::Sample::Result::Relevance::Irrelevant; + else if (r == "relevant") + relevance = search::Sample::Result::Relevance::Relevant; + else if (r == "vital") + relevance = search::Sample::Result::Relevance::Vital; else CHECK(false, ("Unknown relevance:", r)); } @@ -213,9 +215,10 @@ void ToJSONObject(json_t & root, char const * field, Sample::Result::Relevance r string r; switch (relevance) { - case Relevance::Vital: r = "vital"; break; - case Relevance::Relevant: r = "relevant"; break; + case Relevance::Harmful: r = "harmful"; break; case Relevance::Irrelevant: r = "irrelevant"; break; + case Relevance::Relevant: r = "relevant"; break; + case Relevance::Vital: r = "vital"; break; } json_object_set_new(&root, field, json_string(r.c_str())); @@ -255,6 +258,7 @@ string DebugPrint(Sample::Result::Relevance r) { switch (r) { + case Sample::Result::Relevance::Harmful: return "Harmful"; case Sample::Result::Relevance::Irrelevant: return "Irrelevant"; case Sample::Result::Relevance::Relevant: return "Relevant"; case Sample::Result::Relevance::Vital: return "Vital"; diff --git a/search/search_quality/sample.hpp b/search/search_quality/sample.hpp index 342dc7c947..e787ccab1e 100644 --- a/search/search_quality/sample.hpp +++ b/search/search_quality/sample.hpp @@ -24,8 +24,20 @@ struct Sample { enum class Relevance { + // A result that should not be present and it's hard (for the user) + // to explain why it is there, i.e. it is a waste of time even + // to try to understand what this result is about. + Harmful, + + // A result that is irrelevant to the query but at + // least it is easy to explain why it showed up. Irrelevant, + + // A result that is relevant to the query. Relevant, + + // A result that definetely should be present, preferably + // at a position close to the beginning. Vital }; diff --git a/search/search_quality/scoring_model.py b/search/search_quality/scoring_model.py index dc2c04b8cc..ab010dfd64 100755 --- a/search/search_quality/scoring_model.py +++ b/search/search_quality/scoring_model.py @@ -17,7 +17,7 @@ import sys MAX_DISTANCE_METERS = 2e6 MAX_RANK = 255 MAX_POPULARITY = 255 -RELEVANCES = {'Irrelevant': 0, 'Relevant': 1, 'Vital': 3} +RELEVANCES = {'Harmful': -3, 'Irrelevant': 0, 'Relevant': 1, 'Vital': 3} NAME_SCORES = ['Zero', 'Substring', 'Prefix', 'Full Match'] SEARCH_TYPES = ['POI', 'Building', 'Street', 'Unclassified', 'Village', 'City', 'State', 'Country'] FEATURES = ['DistanceToPivot', 'Rank', 'Popularity', 'FalseCats', 'ErrorsMade', 'AllTokensUsed',