Поиск нечеткого текста: Regex Wildcard Search Generator?

Мне интересно, есть ли какой-нибудь способ сделать нечеткое сопоставление строк в PHP. Поиск слова в длинной строке, поиск потенциального соответствия, даже если оно неправильно написано; что-то, что могло бы найти его, если бы оно было отключено одним символом из-за ошибки OCR.

Я думал, что генератор регулярных выражений мог бы сделать это. Таким образом, с учетом ввода "сумасшедший" будет генерировать это регулярное выражение:

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

Затем он возвращает все совпадения для этого слова или варианты этого слова.

Как построить генератор: я бы, вероятно, разбил строку поиска / слово на массив символов и построил бы выражение регулярного выражения, выполнив foreach недавно созданный массив, заменив значение ключа (положение буквы в строке) на ".+".

Это хороший способ сделать нечеткий текстовый поиск или есть лучший способ? Как насчет сравнения строк, которое дает мне оценку, основанную на том, насколько близко это? Я пытаюсь увидеть, если какой-то плохо преобразованный текст OCR содержит слово вкратце.

3 ответа

Решение

Функции расстояния до строки бесполезны, когда вы не знаете, какое слово подходит. Я бы предложил функции pspell:

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

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

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

Левенштейн - один из примеров строкового редактирования. Существуют разные метрики для разных целей. Познакомьтесь с ними и найдите тот, который работает для вас.

Другие вопросы по тегам