gpt4 book ai didi

python - 如何针对大型规则集(超过 5000 条并且还在不断增加)构建高效的电子邮件过滤器

转载 作者:行者123 更新时间:2023-11-29 12:06:26 25 4
gpt4 key购买 nike

我正在构建一个电子邮件过滤器,我需要一种方法来有效地将单个电子邮件与大量过滤器/规则相匹配。可以在以下任何字段上匹配电子邮件:

  • 来自姓名
  • 来自地址
  • 发件人姓名
  • 发件人地址
  • 主题
  • 邮件正文

目前,我们的 PostgreSQL (9.1) 数据库中有超过 5000 个过滤器(并且还在不断增加),它们都定义在一个表中。每个过滤器可能有 1 个或多个用 Python 正则表达式填充的上述字段。

目前进行过滤的方式是选择所有过滤器并将它们加载到内存中。然后我们为每封电子邮件迭代它们,直到在所有非空白字段上找到正匹配。不幸的是,这意味着对于任何一封电子邮件,可能有多达 30,000 (5000 x 6) 次重新匹配操作。显然,随着添加更多过滤器,这不会扩展(实际上它已经不会)。

有更好的方法吗?

到目前为止我考虑过的选项:

  1. 将保存的 Python 正则表达式转换为 POSIX 风格的正则表达式,以利用 PostgreSQL 的 SIMILAR TO 表达式。这真的会更快吗?在我看来,它只是将负载转移到其他地方。

  2. 在每个用户的基础上定义过滤器。虽然这并不实用,因为我们的系统用户实际上受益于大量预定义的过滤器。

  3. 切换到基于文档的搜索引擎,如 Elasticsearch ,其中要过滤的第一封电子邮件被保存为规范表示。通过找到类似的电子邮件,我们可以缩小到特定的功能集进行测试并获得肯定的匹配。

  4. 切换到贝叶斯过滤器,这也将为我们提供一些机器学习能力,以检测相似的电子邮件或对现有电子邮件的更改,这些电子邮件仍然会以足够高的概率匹配以猜测它们是同一件事。这听起来很酷,但我不确定它的扩展性是否特别好。

是否有其他选项或方法可供考虑?

最佳答案

PostgreSQL 9.1 版中的三元组支持可能会满足您的需求。

http://www.postgresql.org/docs/9.1/interactive/pgtrgm.html

它几乎肯定会成为 9.2(计划于 2012 年夏季发布)中的可行解决方案,因为新版本知道如何使用三元组索引来快速匹配正则表达式。在我们的商店,我们发现三元组索引的速度非常好。

此外,如果您想进行“最近邻”搜索,即根据与搜索参数的相似性找到 K 个最佳匹配项,三元组索引非常棒——它实际上按顺序返回索引扫描中的行的“距离”。搜索 KNN-GiST 以获取评论。

关于python - 如何针对大型规则集(超过 5000 条并且还在不断增加)构建高效的电子邮件过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10214580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com