Поиск нечеткого текста: 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"));
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;
}
Левенштейн - один из примеров строкового редактирования. Существуют разные метрики для разных целей. Познакомьтесь с ними и найдите тот, который работает для вас.