Similar text: примеры (PHP)
similar_text(string first, string second [, float &percent]): intФункция similar_text() вычисляет схожесть двух строк по алгоритму Оливера. Она возвращает количество совпадающих символов и может вычислять процент схожести. Функция используется для нечеткого сравнения строк, например, при поиске похожих названий, проверке опечаток или анализе текста.
Синтаксис функции:
similar_text(string $string1, string $string2, float &$percent = null): int
Аргументы:
$string1 - первая строка для сравнения.
$string2 - вторая строка для сравнения.
$percent - необязательный параметр, передаваемый по ссылке. После выполнения функции содержит процент схожести двух строк.
Функция возвращает целое число - количество совпадающих символов.
$count = similar_text('hello', 'hallo');
echo $count;4
similar_text('hello', 'hallo', $percent);
echo round($percent, 2) . '%';80%
similar_text('программирование', 'программа', $percent);
echo round($percent, 2) . '%';66.67%
levenshtein() - вычисляет расстояние Левенштейна между двумя строками (минимальное количество операций вставки, замены, удаления для превращения одной строки в другую). Более эффективна для коротких строк, но не возвращает процент.
soundex() и metaphone() - создают ключи, основанные на звучании строк на английском языке. Полезны для поиска фонетически похожих слов.
similar_text() предпочтительнее, когда нужен процент схожести и для относительно коротких строк. Для длинных текстов или когда важна производительность, levenshtein() может быть лучше, но она не дает процента.
$percent = 0;
$count = similar_text('test', 'text', $percent); // Правильно
// $count = similar_text('test', 'text', $percent); - ошибки нет, но процент не изменится, если передать не по ссылке в старой версии PHPsimilar_text('Hello', 'hello', $percent);
echo round($percent, 2) . '%';80%
Функция чувствительна к регистру. Для независимого от регистра сравнения строки нужно приводить к одному регистру.
Функция имеет сложность O(N^3), поэтому для сравнения длинных текстов она работает медленно. В таких случаях лучше использовать другие методы.
В PHP 8 функция similar_text() не претерпела значительных изменений в поведении. Однако, в PHP 8.0 была улучшена безопасность типа для параметра $percent: теперь он ожидает тип float или null. Также в целом PHP 8 привнес оптимизации производительности, которые могут незначительно ускорить выполнение функции.
Важно отметить, что в PHP 8 все функции стали более строгими к типам, поэтому передача неверного типа в $percent вызовет TypeError.
$base = 'кошка';
$words = ['кошара', 'собака', 'кошечка', 'окошко'];
foreach ($words as $word) {
similar_text($base, $word, $percent);
echo "$base - $word: " . round($percent, 2) . "%
";
}кошка - кошара: 71.43% кошка - собака: 0% кошка - кошечка: 82.35% кошка - окошко: 55.56%
$input = 'Александр';
$names = ['Алекс', 'Александра', 'Алексей', 'Саша'];
$threshold = 60;
$matches = [];
foreach ($names as $name) {
similar_text($input, $name, $percent);
if ($percent >= $threshold) {
$matches[] = ['name' => $name, 'percent' => $percent];
}
}
print_r($matches);Array
(
[0] => Array
(
[name] => Алекс
[percent] => 66.666666666667
)
[1] => Array
(
[name] => Александра
[percent] => 84.615384615385
)
)$str1 = 'PHP программирование';
$str2 = 'программирование PHP';
similar_text($str1, $str2, $percent);
echo 'Без перестановок: ' . round($percent, 2) . "%
";
// Разбиваем на слова и сравниваем каждое слово
$words1 = explode(' ', $str1);
$words2 = explode(' ', $str2);
$totalPercent = 0;
foreach ($words1 as $w1) {
$max = 0;
foreach ($words2 as $w2) {
similar_text($w1, $w2, $p);
if ($p > $max) $max = $p;
}
$totalPercent += $max;
}
echo 'С учетом перестановок слов: ' . round($totalPercent / count($words1), 2) . '%';Без перестановок: 50% С учетом перестановок слов: 100%
import difflib
text1 = 'hello'
text2 = 'hallo'
seq = difflib.SequenceMatcher(None, text1, text2)
print(seq.ratio())0.8
// Использование библиотеки string-similarity
const stringSimilarity = require('string-similarity');
const similarity = stringSimilarity.compareTwoStrings('hello', 'hallo');
console.log(similarity);0.8
SELECT SOUNDEX('hello'), SOUNDEX('hallo');H400 H400
Алгоритмы в других языках часто реализуются через расстояние Левенштейна или собственные методы сравнения последовательностей. PHP функция similar_text уникальна своей реализацией алгоритма Оливера.