Нечеткий текстовый поиск: Regex Wildcard Search Generator? - PullRequest
3 голосов
/ 12 ноября 2009

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

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

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

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

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

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

Ответы [ 3 ]

6 голосов
/ 12 ноября 2009

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

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

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

1 голос
/ 12 ноября 2009
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;
}
1 голос
/ 12 ноября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...