Как средствами PHP найти паттерн в предложении, в котором есть опечатка?

Есть ли элегантный способ найти паттерн в предложении в котором присутствует этот паттер с опечаткой?

Паттерн может содержать от 1 до нескольких слов, если паттерн состоит из нескольких слов, то эти слова могут

быть без пробелов.


Пример: Найти паттерн «Поиск паттерна» в предложении «Функция, которая использует поескпатттерна»


На данных момент, решение которое я вижу, это: нужно создать массив со всеми комбинациями слов без пробелов («функция», «функциякоторая», «которая», «котораяиспользует»)

и проверять каждый токен функцией levenshtein с определенным порогом на ошибку (скажем с расстоянием не более 3), и выбирать наиболее подходящие.


Есть ли какое-либо более элегантное решение? Было бы классно иметь что то вроде:

preg_match_levenshtain($sentence,$pattern, $maxdistance);
  • Вопрос задан
  • 3673 просмотра
Пригласить эксперта
Ответы на вопрос 2
@rowdyro
Возможно поможет: убираете пробелы из паттерна и предложения, потом проходитесь по предложению и ищите минимальное расстояние левенштейна по всей строке.

$pattern = 'Search pattern';
$sentence = 'Function, what uses searchpatttern';

$pattern = strtolower(str_replace(' ', '',$pattern));
$sentence = strtolower(str_replace(' ', '', $sentence));

$min = MAX_INT;
$index = -1;
for ($i = 0; $i < strlen($sentence) - strlen($pattern); ++$i) {
    $len = levenshtein($pattern, substr($sentence, $i, strlen($pattern) ));
    if ($len < $min) {
       // found
       $min = $len; 
       $index = $i;
    }
}

if ($min < THRESHOLD) {
 //found pattern at $index
}


Возможно достаточно убрать пробелы только из паттерна. Незабыть сохранить позиции пробелов, чтобы потом их вернуть на место.
Ответ написан
@shagguboy
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы