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

时间:2009-11-12 08:06:56

标签: php regex ocr fuzzy-search fuzzy-comparison

我想知道在PHP中是否有某种方法可以进行模糊字符串匹配。寻找一个长字符串中的单词,找到一个潜在的匹配,即使它拼写错误;如果由于OCR错误而被一个字符关闭的话会发现它。

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

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

然后会返回该词的所有匹配或该词的变体。

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

这是进行模糊文本搜索的好方法还是有更好的方法?怎么样的字符串比较,根据它的接近程度给我一个分数?我试图看看一些转换不良的OCR文本是否包含一个单词。

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:1)

Levenshtein是String Edit-distance的一个例子。针对不同目的有不同的指标。熟悉它们并找到适合你的那个。

答案 2 :(得分:1)

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;
}