Алгоритм поиска, основанный на совпадении слов/тегов, последнем доступе и частоте

Вопрос:

Я работаю над небольшим мобильным приложением, которое используется для хранения секретов. Секреты разных типов: простой (простой текст), пароли и изображения. Каждый секрет связан одним или несколькими тегами. У меня есть текстовое поле поиска на домашней странице, где пользователь может ввести текст для поиска секретов.

На простом уровне я могу искать сохраненные секреты на основе соответствия строк над описанием или тегом. Имеет смысл те, которые соответствуют описанию, имеют более высокий ранг, чем теги. Но, я должен рассмотреть пару других факторов: последний доступ и частоту доступа. Я озадачен тем, как эти два фактора влияют на матч.

Существует ли какая-либо структура данных/алгоритм для сортировки совпадающих объектов на основе описания, тега, последнего доступа и частоты доступа?

Лучший ответ:

Если я правильно вас понимаю, вы хотите выполнить поиск по слову и тегу, чтобы получить список кандидатов, из которых вы выберете “лучшие” предметы. Ваш вопрос указывает, что вы согласитесь на точное соответствие описания (слова?) По совпадению тегов. Теперь вы хотите знать, как вы будете учитывать частоту доступа и время последнего доступа.

Для этой цели вам не нужна конкретная структура данных. Любой список, который вы можете отсортировать, будет работать отлично. Трюк приходит с функцией сравнения, которая учитывает эти вещи. Способ работы функции сравнения зависит от вас.

Простейшей функцией сравнения будет простой порядок, основанный на четырех критериях: совпадение слов, совпадение тегов, последний доступ и частота. Это будет выглядеть примерно так:

// returns 1 if item1 > item2.
// returns -1 if item1 < item2
// returns 0 if item1 == item2
int compare(item1, item2)
{
    if (item1.wordMatch && !item2.wordMatch) return 1;
    if (item2.wordMatch && !item1.wordMatch) return -1;
    // do the same with tag match
    // then check last access
    if (item1.lastAccess > item2.lastAccess) return 1;
    if (item1.lastAccess < item2.lastAccess) return -1;
    // and check access frequency
    if (item1.freq > item2.freq) return 1;
    if (item1.freq < item2.freq) return -1;
    // everything the same
    return 0;
}

Вместо этого вы можете вычислить “оценку” для каждого элемента. Например, совпадение слов стоит 10 очков, а совпадение тегов стоит, скажем, 4 балла. Таким образом, элемент, который имеет три совпадения тегов, будет иметь 12 баллов, считая его выше, чем элемент, который имеет одно точное совпадение слов.

Как вы квантифицируете последнее время доступа и частоту доступа зависит от вас. Вам нужно подумать о том, насколько важна каждая из этих вещей. Должно ли что-то, к которому обращаются нечасто, но последний раз доступный 30 секунд назад, был оценен выше или ниже, чем то, к которому обращались очень часто, но к нему не обращались вообще в течение последнего часа? Только вы можете решить, насколько важен каждый из этих критериев.

Как только вы придумали способ вычисления оценки для каждого элемента, ваша функция сравнения довольно проста.

Что бы вы ни делали, потребуется некоторая настройка. Один из способов начать:

10 points for an exact word match
 4 points for a tag match
subtract .01 points for every minute since the last access time, up to a maximum of 8 points.
add .01 points for each prior access (i.e. frequency count), up to a maximum of 8 points.

Я буду честен, что выше всего лишь дикая догадка о чем-то, что может дать разумные результаты. Дело в том, чтобы придумать что-нибудь и попробовать. Затем выполните некоторую настройку. Возможно, попробуйте другие вещи. Но основная идея состоит в том, чтобы придумать способ вычисления оценки на основе этих четырех критериев.

Оцените статью
TechArks.Ru
Добавить комментарий