Я реализовал несколько алгоритмов, которые будут искать дубликаты, и они могут быть очень похожими.
подход я обычно использую это следующее:
- нормализовать строки
- использовать алгоритм сравнения (например, similar_text, Левенштейн и т.д.)
Мне кажется, что в реализации этапа 1) вы сможете резко улучшить свои результаты.
Пример алгоритма нормализации (я использую «Спонсоры отступите от Шараповой после неудачного теста наркотиков» для подробностей):
1) в нижнем регистре строку
-> «спонсоры назад от Шараповой после неудачной попытки испытание снадобья»
2) взрываются строку в словах
-> [спонсоры, назад, прочь от Шараповой, после того, как, не удалось, наркотиков, тест]
3) удалите шумные слова (например, предложения, например. in, for, that, this и т. д.). Этот шаг может быть настроен для ваших нужд
-> [спонсоры, Шарапова, не удалось, наркотиков, тест]
4) отсортировать массив в алфавитном порядке (по желанию, но это может помочь реализации алгоритма ...)
-> [наркотики, не удался, Шарапова, спонсоры, тест]
Применяя тот же самый алгоритм для вашей другой строки, вы получили бы:
[Австралийские, наркотики, не удался, Мария, открытый, Шарапов , тест]
Это поможет вам разработать умный алгоритм.Например:
- для каждого слова в первой строке, поиск наибольшего сходства в словах второй строки
- аккумулировать наибольшее сходство
- разрыва накопленных подобий по числу слов
$words1 = ['drug', 'failed', 'sharapova', 'sponsors', 'test'];
$words2 = ['australian', 'drugs', 'failed', 'maria', 'open', 'sharapova', 'test'];
$nbWords1 = count($words1);
$stringSimilarity = 0;
foreach($words1 as $word1){
$max = null;
$similarity = null;
foreach($words2 as $word2){
similar_text($word1, $word2, $similarity);
if($similarity > $max){ //1)
$max = $similarity;
}
}
$stringSimilarity += $max; //2)
}
var_dump(($stringSimilarity/$nbWords1)); //3)
Выполнение данного запроса даст вам 84.83660130719. Неплохо, я думаю ^^. Я уверен, что этот алгоритм может быть дополнительно уточнен, но это хороший старт ... Также здесь мы в основном вычисляем средний процент подобия для каждого слова, вам может понадобиться другой окончательный подход ... настроить для ваших нужд;)
Почему этот процент должен составлять более 53,7%? Как вы определяете «реальное» сходство? – showdev
Мне кажется, вы говорите о семантическом сходстве, т. Е. О сравнении значения двух разных строк. Это связано с обработкой естественного языка со всеми вытекающими проблемами. –
Да, возможно, я должен использовать ИК-алгоритмы, но я ищу более простой способ, не делая документ и запрос. –