Другие функции сравнения работают с целыми фразами. Например, функция levenshtein() вычисляет “расстояние” между двумя фразами, определяя минимальное число дополнений, удалений и замен, необходимых для трансформации одной строки в другую:
echo levenshtein (’Tabini’, ‘Tabani’); echo “\n”;
?>Этот сценарий вернет 41, поскольку необходимо изменить только одну первую букву ‘\’ в слове ‘Tabini’ на ‘а’, чтобы получить строку ‘Tabani’. Несмотря на то что меньшее значение levenshiein-расстояиия обычно означает большее сходство между двумя параметрами, значение, возвращаемое этой функцией, дает лучшее представление о близости двух предложений, когда вы сравниваете его с длиной первого параметра:
Slev = levenshtein (’Tabini’, ‘Tabani’); $per = $lev / strlen (’Tabini’) * 100; echo “Sper\n”;
?>
Результатом будет значение, которое приближенно представляет процент расстояния между двумя параметрами. Предьщущий сценарий вернет расстояние в 16,67 %, которое может быть транслировано в степень сходства между строками в 83,33 %, если вычесть разницу из 100 %.
Другой способ определения сходства между двумя строками представлен функцией sitrtilar_text (), которая вычисляет количество совпадений между двумя строками и таким образом определяет их сходство:
Smatches = similar_text (’Tabini1, ‘Tabani1, &Sper); echo “Совпадений: Smatches - в процентах: SperNn”;
?>
Достаточно интересно то, что, запустив этот сценарий, мы получим следующий результат:
Совпадений: 5 - в процентах: 83.333333333333
Что как раз равно значению, которое мы вычислили ранее, приведя к процентам совпадения расстояние, полученное от функции levenstein ().
“сходства”
Довольно трудно научить компьютер понимать” строки так же, как это делает человек. Типичный пример этой проблемы — ошибки правописания, в частности, когда вы имеете дело с именами.
Несмотря на то что не существует решений, которые хотя бы в начальной степени приближались к возможностям человеческого мозга, все же некоторые алгоритмы в течении мнопгх лет были разработаны для определения “сходства” между строками в виде полутонов, вместо “черно-белого” подхода.Одним из примеров этого является алгоритм soundex, изначально разработанный для применения в процессе переписи населения США в конце XIX века. Этот алгоритм работает за счет присвоения значения каждому гласному звуку алфавита и последующего вычисления общего значения слова на основе его начала и составляющих его слогов. Результирующее soundex-зиачение представляется начальной буквой слова и комбинацией значений его слогов.
Этот алгоритм, который был реализован в РНР в функции soundex (), может оказаться чрезвычайно полезным при поиске имен на основе их фонетических представлений. Например, слова “Tabini” и “Tabani” имеют одинаковые soundex-значеиия:
echo soundex (’Tabini’); echo “\n”;
echo soundex (’Tabani’); echo “\n”;
Приведенный выше сценарий вернет следующее:
Т150 Т150
В результате поиск имен становится намного легче, даже если их точное написание неизвестно.
Более совершенный алгоритм для сравнения двух слов базируется на их фонетическом представлении — метафопический (metaphone), который был представлен в 1990 году Лоуренсом Филипсом (Lawrence Philips). Метафонический алгоритм работает методом присвоения фонетического значения комбинациям символов, на базе их типичного применения в английском языке.
В РНР доступна реализация этого алгоритма в виде функции metaphone ():
echo metaphone (’Tabini’); echo “\n”;
echo metaphone (’Tabani’); echo “\n”;
Этот сценарий вернет метафоническое значение “ТВН” для обеих строк.
Комментариев нет:
Отправить комментарий