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

发布于 2024-08-10 18:49:11 字数 464 浏览 15 评论 0原文

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

我在想正则表达式生成器也许能够做到这一点。因此,如果输入“crazy”,它将生成此正则表达式:

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

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

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

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

I'm wondering if there is some kind of way to do fuzzy string matching in PHP. Looking for a word in a long string, finding a potential match even if its mis-spelled; something that would find it if it was off by one character due to an OCR error.

I was thinking a regex generator might be able to do it. So given an input of "crazy" it would generate this regex:

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

It would then return all matches for that word or variations of that word.

How to build the generator:
I would probably split the search string/word up into an array of characters and build the regex expression doing a foreach the newly created array replacing the key value (the position of the letter in the string) with ".+".

Is this a good way to do fuzzy text search or is there a better way? What about some kind of string comparison that gives me a score based on how close it is? I'm trying to see if some badly converted OCR text contains a word in short.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

别闹i 2024-08-17 18:49:11

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

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

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

String distance functions are useless when you don't know what the right word is. I'd suggest pspell functions:

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

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

第几種人 2024-08-17 18:49:11
    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;
    }
    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;
    }
围归者 2024-08-17 18:49:11

Levenshtein 是字符串 编辑距离 的一个示例。不同的目的有不同的指标。熟悉它们并找到适合您的那个。

Levenshtein is one example of a String Edit-distance. There are different metrics for different purposes. Familiarize yourself with them and find the one that works for you.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文