Алгоритм сортировки на основе тегов автозаполнения на основе частоты использования тегов и времени последнего использования?

В настоящее время я создаю простое поле ввода, которое помечает введенный идентификатор электронной почты на основе существующего списка имен и идентификаторов электронной почты. Нечто подобное тому, что делают gmail и outlook, когда начинаешь вводить адрес электронной почты в поле "Кому".

У меня есть данные о частоте и lastUsedTimeStamp для каждого почтового адреса. Исходя из этого, мне нужно отсортировать предложения, чтобы вынести наиболее полезную опцию наверх. Первой мыслью, которую я получил, была сортировка по частоте /durationSincelastUsed, но у меня было ощущение, что это сильно ослабит набор результатов. Следующая мысль - сначала сравнить частоты, а затем сравнить временные метки между одинаково используемыми предложениями.

У кого-нибудь есть идеи получше? Интересно, как это делает Gmail. Я сейчас ломаю себе голову над этим.

2 ответа

В первый раз, когда я сделал что-то подобное, я вычислил значение, основанное на времени с момента последнего использования. Это значение было очень высоким (например, 100), если адрес электронной почты использовался в течение последних 15 минут. Затем он быстро упал до 0 через пару часов.

Мой род сначала использовал это значение, а затем частоту.

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

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

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

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

Я пришел с похожим ответом: сортировать список адресов электронной почты (например, входящие) по тегам

В chrome, например, откройте Inspect source, перейдите в COnsole и скопируйте этот код Javascript

!function() { //ordenar por tag
    function e(e)
    {
        var t,u,v,w,n,a,p,q,r,s,l=e.getElementsByTagName("td");
        for(a=0;a<l.length;a++)
        {
            if("xY a4W"==l[a].className)
                for(t=l[a].getElementsByTagName("div"),p=0;p<t.length;p++)
                    if("xS"==t[p].className)
                        for(u=t[p].getElementsByTagName("div"),q=0;q<u.length;q++)
                            if("xT"==u[q].className)
                                for(v=u[q].getElementsByTagName("div"),r=0;r<v.length;r++)
                                    if("yi"==v[r].className)
                                        for(w=v[r].getElementsByTagName("div"),s=0;s<w.length;s++)
                                            if("ar as"==w[s].className&&(n=w[s].getElementsByTagName("div"),n.length))
                                                return n[0].getAttribute("title");
            if(l[a].hasAttribute("role")&&"link"==l[a].getAttribute("role"))
                for(t=l[a].getElementsByTagName("div"),r=0;r<t.length;r++)
                    if("y6"==t[r].className&&(n=t[r].getElementsByTagName("span"),n.length))
                        return n[0].innerHTML
        }
    return""
    }
    function t(e,t)
    {
        return e=e[0].toLowerCase(),t=t[0].toLowerCase(),t>e?-1:e>t?1:0
    }
    function n(n)
    {
        var a=Array.prototype.slice.call(n.getElementsByTagName("tr"),0);if(a.length)
        {
            for(var r=a[0].parentNode,l=[],g=0;g<a.length;g++)l[g]=[e(a[g]),a[g]];
            for(l=l.sort(t),g=0;g<l.length;g++)
                r.appendChild(l[g][1])
        }
    }
            for(var a=document.getElementsByTagName("table"),r=0;r<a.length;r++)
                if("F cf zt"==a[r].className)
                {
                    n(a[r]);break
                }
}();

(спасибо https://www.gtricks.com/gmail/sort-gmail-subject-label-sender/ за упорядочение отправной идеи отправителем)

Другие вопросы по тегам