Я хочу сравнить две строки и вернуться к уровню сравнения.
Строка 1 является входной и может поступать в разных форматах от клиентов. Например:
string 1 - "GCSE English Lang Year 10" or string 1 - "Year 10 Eng Lang GCSE" etc
Строка 2 – это строка, с которой я хочу сравнить ее. Например:
string 2 - "English Language"
Я понимаю, что я могу использовать preg_match
для поиска точного шаблона:
$subject = $inputString; $pattern= "/Eng/"; if (preg_match($pattern, $inputString)) { echo "match"; }
Но есть ли метод, который вернет фактор соответствия, а не просто да или нет? Я понимаю, что может быть более сложный ответ на кодирование с использованием метода типа preg_match
но мне интересно, есть ли что-то уже вокруг, которого я не нашел.
Вы можете использовать levenshtein()
:
Расстояние Левенштейна определяется как минимальное количество символов, которые вы должны заменить, вставить или удалить, чтобы преобразовать str1 в str2. Сложность алгоритма O (m * n), где n и m – длина str1 и str2 (довольно хорошая по сравнению с аналогичным_text (), которая равна O (max (n, m) ** 3), но еще дорогой).
Например, расстояние Левенштейна для «английского языка» и «GCSE English Lang Year 10» составляет 12.
$lev = levenshtein('GCSE English Lang Year 10', 'English Language'); echo $lev; // 12
У вас есть большая часть того, что вам нужно. Вам нужно зафиксировать совпадение, которое вы нашли, а затем вы можете использовать levenshtein, чтобы узнать, насколько он отличается от полного слова.
$subject = $inputString; $pattern= "/Eng[a-zA-Z]+/"; // I made it clear that I want all letters in the word. $matches = array(); // This is an array of all the words that match. if (preg_match($pattern, $inputString, $matches)) { $match = $matches[0]; // Check first match - assume only one matched. $diff = levenshtein(strtolower($match), 'english'); print "Found $match which is $diff edits from English.\n"; }
Теперь max $ diff будет: max(strlen($match), strlen('english'));
, Если вы установите $ max на максимальную разницу, то подобие от 0 до 100 будет 100*($max-$diff)/$max;
– Но я советую вам этого не делать. Это плохая метрика. Придерживайтесь $ diff и ищите самый низкий $ diff.
Возможно, что-то вроде:
$string1 = "GCSE English Lang Year 10"; $string2 = "Year 10 Eng Lang GCSE"; $i = array_intersect( str_word_count(strtolower($string1), 2), str_word_count(strtolower($string2), 2) ); $similarityPercentage = count($i) / max(count($array1), count($array2)) * 100;
который вычисляет процент идентичных слов в двух строках, хотя он не позволяет аббревиатуру от English
до English