【问题标题】:Multiple keyword (100s to 1000s) search (string-search algorithm) in PHPPHP中的多个关键字(100到1000)搜索(字符串搜索算法)
【发布时间】:2011-10-03 14:38:15
【问题描述】:

我在我的 PHP 项目中有这个问题要解决,其中一些关键字(从几百到几千,长度可以变化)需要在大约 100-300 个字符长的字符串中搜索,有时长度更短 30- 50 个字符。我可以预处理关键字以重用于搜索字符串的新实例。我对 PHP 有点陌生,在 PHP 库中没有找到这样做的方法。经过一番搜索,我在 Aho Corasick 算法中找到了一些不错的候选者,然后是 Sun Wu 和 Udi Manber 的改进,它似乎也被称为 agrep(或者是 agrep 的一部分):http://webglimpse.net/pubs/TR94-17.pdf

还有 Rabin Karp、Suffix Trees 等,但它们看起来不太适合,因为第一个是固定长度的关键字,而后者看起来很通用,需要做很多工作。

谁能告诉我在 php 中自己实现 Agrep/Sun Wu-Manber 是否是解决此问题的好方法?还有其他反馈吗?

编辑:正如我在下面的评论中提到的,有数百个或更多不同的搜索关键字,因此正则表达式无济于事。所以这种反应是没有帮助的。

【问题讨论】:

  • 有很多方法可以做到,第一个问题是:这些词是从哪里来的?
  • 关键字是一个固定的集合,每次执行搜索的可搜索字符串都会不同。所以我可以对关键字做一些预处理。
  • 你可以尝试做的是这个。将关键字放入数组中;然后对数组进行客户比较器搜索。您的比较器功能将根据各个关键字检查您的可搜索字符串。另一种选择是准备一个包含所有关键字的大正则表达式 - 它看起来像这样:/keyword1|keyword2|keyword3|.../ - 当然,您需要对特殊字符进行适当的转义。然后您可以简单地使用preg_match() 来查看是否匹配。
  • 我同意,如果你有一组固定的词,你可以使用 preg_match,但如果你有一个大的词集要搜索,它可能会有点慢。
  • 为所有关键字创建单个正则表达式实际上与我提到的 Aho-Corasick 算法类似。以标准的算法方式来做这件事并非易事,因为它们是不相关的不同单词。

标签: php search keyword string-algorithm agrep


【解决方案1】:

我认为您可以通过使用“Levenshtein 距离”度量来解决这个问题。

From wikipedia;

在信息论和计算机科学中,Levenshtein 距离 是一个字符串度量,用于测量两个之间的差异量 序列。

另外,PHP 有一个levenshtein() 方法。使用您的关键字列表作为数组和可搜索字符串作为输入并遍历您的数组并在每次迭代中使用 levenshtein() 进行匹配。

【讨论】:

    【解决方案2】:

    从 PHP 5.5 开始,PHP 的 strtr 使用 Wu-Manbers 算法进行多模式匹配。有关实现的详细信息,请参阅 PHP git 存储库中的 commit ccf15cf2。根据我的经验,它非常有效。

    Aho-Corasick 算法的纯 PHP 实现可在此处获得:https://packagist.org/packages/wikimedia/aho-corasick

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 2015-12-19
      • 2018-12-16
      相关资源
      最近更新 更多