На новом веб-сайте, который я разрабатываю для клиента, мне нужно было добавить обычное «Вы имели в виду …?» в результатах поиска для нее. Я начал думать о самом простом способе сделать это.
На самом деле существует множество php- функций для поиска похожего текста. Самый очевидный?
Similar_text ()
Вы должны передать 2 параметра плюс необязательный третий. Два первых — это строки для сравнения, а необязательный — это процент «близости», который вы хотите получить. Это довольно полезно, хотя это слишком дорого с точки зрения времени, чтобы использовать с огромными поисками в базе данных, поэтому я бы не рекомендовал это.
Есть два других метода, которые могут быть хорошими для некоторых случаев, и другая функция, которая является просто лучшей. Сначала я покажу вам лучший способ добиться этого:
это алгоритм Левенштейна , который в основном находит количество символов, которые вы должны добавить, отредактировать или удалить из строки, чтобы она соответствовала другому. Сначала это звучит не слишком полезно, но взгляните на этот пример:
< ?php
// input misspelled word
$input = 'carrrot';
// array of words to check against
$words = array('apple','pineapple','banana','orange',
'radish','carrot','pea','bean','potato');
// no shortest distance found, yet
$shortest = -1;
// loop through words to find the closest
foreach ($words as $word) {
// calculate the distance between the input word,
// and the current word
$lev = levenshtein($input, $word);
// check for an exact match
if ($lev == 0) {
// closest word is this one (exact match)
$closest = $word;
$shortest = 0;
// break out of the loop; we've found an exact match
break;
}
// if this distance is less than the next found shortest
// distance, OR if a next shortest word has not yet been found
if ($lev <= $shortest || $shortest < 0) {
// set the closest match, and shortest distance
$closest = $word;
$shortest = $lev;
}
}
echo "Input word: $input\n";
if ($shortest == 0) {
echo "Exact match found: $closest\n";
} else {
echo "Did you mean: $closest?\n";
}
?>
Это пример, где можно найти даже слово с ошибкой. Он использует Левенштейна, чтобы найти слово, которое является наиболее похожим, а затем оно возвращается. Это вывод кода перед:
Input word: carrrot
Did you mean: carrot?
Использование этой функции довольно просто, хотя есть много дополнительных параметров для более точного использования. Смотрите ссылку на php.net для этой функции .
Другими способами, которые я сказал, которые могут быть использованы для этого, являются soudex и metaphone , хотя их использование может быть более сложным для использования этого конкретного предложения.
Soundex создаст одинаковый ключ для всех слов, которые произносятся одинаково. Например, следующий код:
< ?php
echo soundex('beard').'';
echo soundex('bird').'';
echo soundex('bear');
?>
Будет производить этот вывод:
B630
B630
B600
Где борода и птица одинаковы.
Это может сделать предложения быстрыми, если вы уже создали столбец в
таблицах mysql, например, с ключом soundex тегов, чтобы вы могли искать не только строку, но и ее ключ soundex …
ОБНОВЛЕНИЕ: Вы можете используйте встроенную в MySQL функцию SOUNDEX () для поиска строки как есть, так и для soundex, чтобы обеспечить также слова с ошибками.
И, наконец, функция метафона — это разновидность клавиши soundex, которая также выдает клавишу, которая одинакова для всех произнесенных слов, но более точно, чем soundex, поскольку метафон фактически знает правила английского произношения.
Использование будет точно таким же, как и в soundex, и если вы собираетесь использовать что-то в этом роде, я бы порекомендовал метафон поверх soundex для его повышенной точности.
Но имейте в виду, что как soundex, так и metaphone, вероятно, не будут работать нормально на большинстве других языков или, по крайней мере, для языков с фонемами, которых нет на английском языке.
Надеюсь, ты нашел это полезным,
Алекс