自动完成的最近/最常联系人算法?

8
我们有一个自动完成列表,当你给某人发送电子邮件时,它会自动填充收件人地址。这样做很好,但当列表变得非常大时,你需要输入更多的地址才能找到想要的那个,这与自动完成的目的相反。
我认为应该添加一些逻辑,使自动完成结果按照最近联系或最常联系的某些函数进行排序,而不仅仅是按字母顺序排序。我想知道是否有任何已知的良好算法用于此类搜索,或者是否有任何建议。
我考虑只使用一个点数系统,例如:当天得5分,过去三天得4分,过去一周得3分,过去一个月得2分,过去六个月得1分。对于最常联系的人,25次以上得5分,15次以上得4分,10次以上得3分,5次以上得2分,2次以上得1分。除了这些任意选择的数字之外,是否有其他建议?如果您能说明为什么您认为其他数字更好,我们也欢迎。
编辑:这主要是在商业环境中使用的,在这种情况下,最近性和频率同样重要。另外,超过一定数量的联系人,比如80次和30次之间真的没有太大的区别。
7个回答

3
看看自组织列表。
快速而粗略的了解:
前移启发式: 一个链表,每当选择一个节点时,它就会被移到列表的前面。
频率启发式: 一个链表,每当选择一个节点时,它的频率计数会增加,然后该节点会被冒泡到列表的前面,以便最常访问的节点在列表的头部。
看起来前移实现最适合您的需求。
编辑:当选择一个地址时,请将其频率加一,并将其移到具有相同权重的节点组的前面(或(权重除以x)用于更粗略的分组)。我认为您提出的实现存在实际问题,即需要对每个项目进行权重计算。自组织列表是一个很好的选择,但算法需要进行一些调整才能满足您的要求。
进一步编辑: 老化是指权重随时间降低,这意味着您需要知道每个地址使用的时间。这意味着,在构建列表时,您必须拥有完整的电子邮件历史记录。
问题在于我们只想在实际访问时对节点执行计算(而不是搜索)-这为我们提供了统计良好的性能。

有趣的实现,但这仍然会导致最近的在前面或最频繁的在前面,而不是两者的组合。 - Davy8
我不完全确定你所说的“aging”是什么意思。我对这个解决方案的问题在于它更强调频率而不是(或多或少)平等地考虑两者。 - Davy8
一个可能会出现问题的例子是,假设你与客户来回沟通了很多次(因为有一个非常大的问题需要解决),但现在问题已经解决了,你很长一段时间内不需要再联系他们了。由于频率很高,他们仍然处于前台,并将长期保持这种状态。 - Davy8

2
这种东西似乎类似于Firefox在提示您输入的网站时所做的操作。
不幸的是,我不知道Firefox具体是如何做到的,点数系统也很好,也许您需要平衡一下您的分数:)
我会选择类似于以下内容:
NoM = 邮件数量
(今天发送给X的NoM)+ 1/2 *(上周发送给X的NoM)/ 7 + 1/3 *(上个月发送给X的NoM)/ 30
您在上个月内没有写过邮件的联系人将获得0分。您可以按照已发送的NoM对它们进行排序(因为它们在联系人列表中:))。这些将在得分> 0的联系人之后显示。
这只是一个想法,无论如何,目的是给最常联系和刚刚联系的联系人赋予不同的重要性。

嘿,我猜这是我刚刚发布的答案的稍微更加精确的版本。 - Davy8
这只是一些导数的总和,每个导数都有自己的权重(系数为1、1/2、1/3 :)。 - Andrea Ambu
我已删除我的回复,因为你基本上已经说了同样的话并且更多。 - Davy8
你们仍然存在着老化问题。 - Chris Cudmore
如果你想要结合“新近性”和频率,我认为这是必须的。无论如何,每次发送电子邮件时都可以缓存它 :) - Andrea Ambu
显示剩余3条评论

2
如果您想要更好地管理您的电子邮件,可以通过以下几种方式标记最“活跃”的邮件:
  • 最后访问时间
  • 使用频率
  • 与待处理销售相关的联系人
  • 直接上司
  • 等等
然后将活跃的邮件排在列表顶部。请注意用户最常使用哪个“组”。收集足够的数据后,可以完全切换到该排序策略。
这需要很多工作,但也很有趣...

嘿,比我预想的要复杂,但对其他人可能有用,所以点个赞。 - Davy8

1
也许可以统计每个地址发送的电子邮件数量。然后:
ORDER BY EmailCount DESC,LastName,FirstName 这样,您最常使用的地址将排在第一位,即使它们已经几天没有使用过。

是的,但在商业环境中(我想我应该明确说明),人们可能会与客户联系几天/几周,解决问题或达成协议/协议,在这种情况下,最近的比最常见的更相关。 - Davy8
当然,有各种潜在的用户 - 我可能会永远每两周给我的远程老板发电子邮件,我可能会有一个活跃的销售账户一个月,我可能会支持一个需要在新建筑后提供额外帮助的客户。也许是频率和时间紧迫性的结合? - Corbin March
也许是频率和时间紧迫性的结合?是的,这更接近我所寻求的,有点类似于如何平衡这两者的具体细节。 - Davy8

1

我喜欢按点评分的方式,包括最近使用的频率和其他可能因素(比如偏好与本地域内联系人)。

我曾经在几个这样的系统上工作过,但无论是“最近使用”还是“最常用”,都不太理想。如果你不小心输错一次,那么“最近使用”就会非常麻烦。另外,“最常用”也不会随着时间推移而改变,例如去年你经常联系某人,但现在工作发生了变化。

一旦你确定了要使用的测量指标集,就可以创建一个交互式应用程序来测试不同权重,并查看哪些数据样本能够给出最佳结果。


0
尽管已经选择了一个答案,但我想提交我的方法供考虑和反馈。
我会通过每次使用时将计数器递增来考虑频率,但是递增的值会比1大,比如10(为第二点添加精度)。
我会通过定期(比如24小时)用某个减少器(比如0.9)乘以所有计数器来考虑最近性。
每次使用:
UPDATE `addresslist` SET `favor` = `favor` + 10 WHERE `address` = 'foo@bar.com'

每个间隔:
UPDATE `addresslist` SET `favor` = FLOOR(`favor` * 0.9)

通过这种方式,我将频率和最近性合并为一个字段,避免了需要保留详细历史记录来推导{上一天、上一周、上个月}的需求,并且保持了数学(大多数情况下)为整数。

当然,增量和减量必须根据个人喜好进行调整。


0

这篇论文描述了一种单参数缓存清除策略家族,其中包括最近最少使用和最不经常使用的策略作为特殊情况。

参数lambda的范围从0到1。当lambda为0时,它的表现就像一个LFU缓存,当lambda为1时,它的表现就像一个LRU缓存。在0和1之间,它以自然的方式结合了最近性和频率信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接