Алгоритм для самых последних / часто контактов для автозаполнения? - PullRequest
8 голосов
/ 16 октября 2008

У нас есть автоматически заполненный список, который заполняется, когда вы отправляете кому-то электронное письмо, и это хорошо, пока список не станет по-настоящему большим, вам нужно вводить все больше и больше адресов, чтобы добраться до того, который вы хотите , что противоречит цели автозаполнения

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

Я хочу знать, есть ли какие-нибудь известные хорошие алгоритмы для этого вида поиска, или у кого-нибудь есть какие-либо предложения.

Я думал только о системе баллов, что-то вроде того же дня - 5 баллов, последние три дня - 4 балла, последняя неделя - 3 балла, прошлый месяц - 2 балла, а последние 6 месяцев - 1 балл. Тогда чаще всего 25+ - это 5 баллов, 15+ - это 4, 10+ - это 3, 5+ - это 2, 2+ - это 1. Никакая реальная логика, кроме этих чисел, не «чувствует» правильное.

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

Редактировать: Это было бы в первую очередь в бизнес-среде, где недавность (ага, чтобы придумывать слова) часто так же важна, как и частота. Кроме того, после определенного момента на самом деле нет большой разницы между тем, с кем вы разговаривали 80 раз, и тем, что говорите 30 раз.

Ответы [ 7 ]

3 голосов
/ 16 октября 2008

Взгляните на самоорганизующиеся списки.

Быстрый и грязный взгляд:

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

Частота эвристики: Связанный список, такой, что всякий раз, когда выбирается узел, его частотный счет увеличивается, а затем узел пузыряется в начале списка, так что наиболее часто доступ к нему находится в начале списка.

Похоже, что переход на фронтальную реализацию лучше всего соответствует вашим потребностям.

РЕДАКТИРОВАТЬ: Когда адрес выбран, добавьте его к его частоте и переместите в начало группы узлов с одинаковым весом (или (вес делением х) для группировок курсора). Я рассматриваю старение как реальную проблему с вашей предполагаемой реализацией, так как она требует расчета веса для каждого элемента. Самоорганизующийся список - это хороший способ, но алгоритм нуждается в небольшой настройке, чтобы делать то, что вы хотите.

Дальнейшее редактирование: Старение означает, что веса со временем уменьшаются, а это означает, что вам нужно знать каждый раз, когда адрес был использован. Это означает, что вам нужно иметь всю историю электронной почты, доступную вам, когда вы создаете свой список.

Проблема заключается в том, что мы хотим выполнять вычисления (кроме поиска) на узле только тогда, когда к нему фактически осуществляется доступ - это дает нам статистически хорошую производительность.

2 голосов
/ 16 октября 2008

Если вы хотите сойти с ума, отметьте самые «активные» электронные письма одним из следующих способов:

  • Последний доступ
  • Частота использования
  • Контакты с ожидающими продаж
  • Прямые боссы
  • Etc

Затем представьте активные электронные письма в верхней части списка. Обратите внимание на то, какую «группу» использует ваш пользователь больше всего. Переходите на эту стратегию сортировки только после сбора достаточного количества данных.

Это много работы, но отчасти весело ...

2 голосов
/ 16 октября 2008

Это похоже на то, что делает firefox, когда намекает, для какого сайта вы печатаете.

К сожалению, я не знаю точно, как это делает Firefox, система баллов также кажется хорошей, возможно, вам нужно будет сбалансировать свои очки:)

Я бы пошел на что-то похожее на:

NoM = номер почты

(NoM отправлено X сегодня) + 1/2 * (NoM отправлено X в течение последней недели) / 7 + 1/3 * (NoM отправлено X в течение последнего месяца) / 30

Контакты, которые вы не писали в течение последнего месяца (их можно изменить), будут иметь 0 баллов. Вы можете начать сортировать их по номеру отправленного сообщения (так как он есть в списке контактов :). Они будут показаны после контактов с точками> 0

Это просто идея, так или иначе, это придавать разное значение большинству и только что отправленным по почте контактам.

1 голос
/ 16 октября 2008

Мне нравится идея системы, основанной на баллах, с точками для недавнего использования, частотой использования и потенциально другими факторами (предпочитаете контакты в локальном домене?).

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

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

1 голос
/ 16 октября 2008

Возможно подсчитать количество писем, отправленных на каждый адрес. Тогда:

ЗАКАЗ ПО EmailCount DESC, Фамилия, Имя

Таким образом, ваши наиболее часто используемые адреса идут первыми, даже если они не использовались в течение нескольких дней.

0 голосов
/ 18 февраля 2012

Несмотря на то, что ответ был выбран, я хочу представить свой подход к рассмотрению и обратную связь.

Я бы учел частоту, увеличивая счетчик при каждом использовании, но на некоторое значение больше единицы, например, 10 (чтобы добавить точность ко второй точке).

Я бы учел недавность, умножив все счетчики через регулярные интервалы (скажем, 24 часа) на некоторое уменьшение (скажем, 0,9).

Каждое использование:

UPDATE `addresslist` SET `favor` = `favor` + 10 WHERE `address` = 'foo@bar.com'

Каждый интервал:

UPDATE `addresslist` SET `favor` = FLOOR(`favor` * 0.9)

Таким образом, я сверяю и частоту, и недавность в одно поле, избегая необходимости хранить подробную историю для получения {последний день, последняя неделя, последний месяц} и сохранять математическое (в основном) целое число.

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

0 голосов
/ 18 февраля 2012

В этом документе описывается семейство политик удаления кэша с одним параметром, которое включает в себя в качестве особых случаев наименее часто используемые и наименее часто используемые политики.

Параметр lambda находится в диапазоне от 0 до 1. Когда lambda равен 0, он работает точно так же, как кэш LFU, когда lambda равен 1, он работает точно так же, как кэш LRU. В диапазоне от 0 до 1 он естественным образом объединяет информацию о времени и частоте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...