【问题标题】:Testing phrases to see if they match each other测试短语以查看它们是否相互匹配
【发布时间】:2011-03-05 22:29:21
【问题描述】:

我有大量的短语(大约几百万),每个不到六七个字,大部分不到五个,我想看看它们是否“短语匹配”。这是一个搜索引擎营销术语 - 本质上,如果 A 包含在 B 中,则 A 短语匹配 B。现在,它们存储在 db (postgres) 中,我正在对正则表达式执行连接(参见 this question)。即使在尝试了所有基本的优化技巧(索引等)并尝试了所提供的建议之后,它的运行速度也慢得令人难以置信。
有没有更简单的方法来做到这一点?我不反对非数据库解决方案。是否有任何理由认为正则表达式过于矫枉过正并且比其他解决方案花费的时间更长?

【问题讨论】:

  • 您能更详细地解释一下“A 包含在 B 中”是什么意思吗?您是指确切的字符串还是单个单词?
  • 我刚刚查看了您的链接帖子。您在 A 中获得了多少条记录,在 B 中获得了多少条记录?
  • 您得到想要的答案了吗?如果是这样,你能接受吗?如果没有,你能澄清一下你还在寻找什么吗?通常,您提供的信息越多,就越有可能有人可以帮助您。

标签: sql


【解决方案1】:

当您拥有 MaasSQL 先前答案中的“已清理列”时,您可以根据“短语匹配”的确切工作方式(我不知道),根据包含字符串的长度对该列进行排序。

然后确保您在过程而不是平面查询中以收敛的方式运行比较查询,方法是单步执行您的表(使用游标)并通过 WHERE 语句消除用于比较的候选项,并删除已经存在的候选项测试(完全)。您可能需要一个临时表来执行此操作。

我之前所说的“WHERE”语句是什么意思?好吧,如果比较值在按长度排序的列中,您将永远不必测试较长的字符串是否与较短的字符串匹配。

以及删除候选:从最短的字符串开始,一旦您测试了一定长度的所有字符串,您就可以将它们从比较表中删除,因为您将进行的任何下一个测试都不会得到匹配.

当然,这需要更多的编程,而不仅仅是一条 SQL 语句。并且取决于“短语匹配”的确切工作方式。

DTS 或 SSIS 也可能是您的朋友。

【讨论】:

    【解决方案2】:

    进行子字符串匹配的理想算法是AhoCorsick

    虽然您必须从数据库中读取数据才能使用它,但与更简单的方法相比,它的速度非常快。

    有关子字符串匹配的相关问题,请参阅here

    here 用于 Java 中的 AhoCorsick 实现:

    【讨论】:

      【解决方案3】:

      如果您需要了解更多关于为什么需要查看哪些短语是其他短语的子集的上下文,那就太好了:例如,无论如何都要以这种方式构建数据库,这似乎很奇怪:您必须现在做这项工作,因为数据库的格式不合适,所以你应该“修复”数据库或它的构建方式是有意义的。

      这在很大程度上取决于您对数据所做的工作以及原因,但我发现过去将事物分解为单个单词和成对的单词很有用,然后将资源或短语链接到这些单/对。

      例如实现我所做的搜索:

      原文:

      要查看的测试短语

      参赛作品:

      • 测试
      • 测试短语
      • 短语
      • 短语

      要查看另一个短语是否相似(授予,不包含在其中),您将以相同的方式分解另一个短语并计算它们之间共有的短语数量。

      如果您要使用(例如)“查看测试阶段”,它具有仍然匹配的良好副作用:因为单个单词会匹配..但由于顺序不同,对不会匹配,所以它是同时考虑到词组(连续的词),匹配的次数不会那么高,适合作为匹配中的“分数”使用。

      正如我所说的那样,这种事情对我有用,但如果能听到更多背景/上下文的话会很棒,这样我们就可以看看是否能找到更好的解决方案。

      【讨论】:

        猜你喜欢
        • 2018-05-14
        • 2020-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-18
        • 2017-11-30
        相关资源
        最近更新 更多