soundex()
Статья о функции PHP soundex(), которая вычисляет ключ Soundex строки и полезна для сравнения произношения слов.
Функция PHP soundex() вычисляет ключ Soundex строки — короткий код, представляющий то, как строка звучит на английском языке, а не как она пишется. Два слова, написанных по-разному, но произносимых схожим образом (например, «Smith» и «Smyth»), дают одинаковый ключ, что делает Soundex удобным инструментом для нечёткого поиска имён, подсказок при проверке орфографии и дедупликации списков контактов.
На этой странице рассматриваются синтаксис soundex(), формат возвращаемого ключа, принцип работы алгоритма и практические примеры — включая ограничения функции и её сравнение со связанными функциями.
Синтаксис
soundex(string $string): stringФункция принимает один параметр:
$string— входная строка для кодирования. Учитываются только буквенные символы; цифры, пробелы и знаки пунктуации игнорируются.
Функция возвращает ключ Soundex в виде строки. Для непустого буквенного ввода ключ всегда состоит из 4 символов: одной заглавной буквы, за которой следуют три цифры (например, H464). Если входная строка не содержит букв, soundex() возвращает пустую строку.
Как формируется ключ Soundex
Алгоритм Soundex сводит слово к его первой букве плюс трёхзначный код на основе оставшихся согласных звуков:
-
Сохраняется первая буква слова.
-
Оставшиеся буквы преобразуются в цифры; согласные, звучащие похоже, группируются:
Буквы Цифра b, f, p, v 1 c, g, j, k, q, s, x, z 2 d, t 3 l 4 m, n 5 r 6 -
Гласные
a, e, i, o, uи буквыh, w, yотбрасываются (им не присваивается цифра). -
Соседние одинаковые цифры сворачиваются в одну.
-
Результат дополняется нулями (или усекается) до ровно четырёх символов.
Вот почему soundex('Robert') и soundex('Rupert') оба дают R163 — различающиеся гласные игнорируются.
Базовый пример
Здесь строка $string кодируется с помощью soundex(). Результат:
H464H — это первая буква, а 464 кодирует согласные звуки l (4), r (6), l (4). Пробел и граница слова игнорируются — Soundex обрабатывает входные данные как единую последовательность букв.
Сравнение двух строк
Наиболее распространённое применение soundex() — проверка того, одинаково ли звучат два слова, путём сравнения их ключей:
Поскольку Smith и Smyth оба кодируются в S530, их ключи совпадают и результат:
The strings sound the same.Поиск имени в списке
Типичный паттерн — предлагать варианты «вы имели в виду…» из известного списка, когда точное совпадение не найдено:
<?php
$names = ['Robert', 'Rupert', 'Rubin', 'Albert'];
$query = 'Ruppert';
$queryKey = soundex($query);
foreach ($names as $name) {
if (soundex($name) === $queryKey) {
echo "$name sounds like $query\n";
}
}
?>И Robert, и Rupert имеют тот же ключ R163, что и Ruppert, поэтому результат:
Robert sounds like Ruppert
Rupert sounds like RuppertОграничения
- Ориентация на английский язык. Сопоставление букв с цифрами настроено под английское произношение, поэтому для имён из других языков функция работает плохо.
- Первая буква должна совпадать. Поскольку Soundex всегда сохраняет первую букву,
Kris(K620) иChris(C620) не совпадут, хотя звучат одинаково. - Грубое сопоставление. Учитываются лишь первые несколько согласных звуков, поэтому сильно различающиеся длинные слова могут получить одинаковый ключ. Используйте Soundex как предварительный фильтр, а не как окончательный ответ.
Для другого фонетического алгоритма, который нередко лучше справляется с английским, см. metaphone(). Чтобы измерить насколько похожи две строки, а не просто одинаково ли они звучат, см. similar-text() и levenshtein().