模糊文本搜索:正则表达式通配符搜索生成器?

Posted

技术标签:

【中文标题】模糊文本搜索:正则表达式通配符搜索生成器?【英文标题】:Fuzzy Text Search: Regex Wildcard Search Generator? 【发布时间】:2010-12-15 19:02:54 【问题描述】:

我想知道是否有某种方法可以在 php 中进行模糊字符串匹配。在长字符串中查找一个单词,即使拼写错误也能找到可能的匹配项;如果由于 OCR 错误而将其关闭一个字符,就会找到它。

我在想一个正则表达式生成器可能能够做到这一点。所以给定一个“疯狂”的输入,它会生成这个正则表达式:

.*((crazy)|(.+razy)|(c.+azy)|cr.+zy)|(cra.+y)|(craz.+)).*

然后它将返回该单词的所有匹配项或该单词的变体。

如何构建生成器: 我可能会将搜索字符串/单词拆分为一个字符数组并构建正则表达式,对新创建的数组执行 foreach 用“.+”替换键值(字符串中字母的位置)。

这是进行模糊文本搜索的好方法还是有更好的方法?某种字符串比较如何根据它的接近程度给我一个分数?我正在尝试查看某些转换错误的 OCR 文本是否包含简短的单词。

【问题讨论】:

您的正则表达式错误 - 将 + 替换为 . 感谢您的提示,用 .+ 解决了这个问题 c.+azy 将匹配 calksjdazy - c 后跟一个或多个字符,后跟 azy。对于单个字符,使用c.azy 【参考方案1】:

当您不知道正确的词是什么时,字符串距离函数是无用的。我建议使用 pspell 函数:

$p = pspell_new("en");
print_r(pspell_suggest($p, "crazzy"));

http://www.php.net/manual/en/function.pspell-suggest.php

【讨论】:

啊,说明我是PHP新手:没听说过这种方法!很好的建议,这应该被投票。 +1 +1 表明每天都有新东西要学习!但是请注意,pspell_suggest 在给出正确拼写的单词时,将不会为您提供拼写错误的选项。因此,它不会真正满足 OP 的需要。【参考方案2】:
    echo generateRegex("crazy");
    function generateRegex($word)
    
      $len = strlen($word);
      $regex = "\b((".$word.")";
      for($i = 0; $i < $len; $i++)
      
        $temp = $word;
        $temp[$i] = '.';
        $regex .= "|(".$temp.")";
      
      $regex = $regex.")\b";
      return $regex;
    

【讨论】:

OP 要求提供基于 PHP 的解决方案。 同意。但是翻译这个有多难? 翻译成 php - 点击 diff 中的 viewsource 链接查看 java 版本。【参考方案3】:

Levenshtein 是字符串Edit-distance 的一个示例。有不同的指标用于不同的目的。熟悉它们并找到适合您的。

【讨论】:

以上是关于模糊文本搜索:正则表达式通配符搜索生成器?的主要内容,如果未能解决你的问题,请参考以下文章

grep和egrep正则表达式

[MySQL] 用正则表达式进行搜索

perl模糊匹配文件名

用于字母数字通配符搜索的正则表达式

正则表达式

我的Linux,我做主!通配符和正则表达式深层解析