Кажется, что легко найти процент между двумя строками, используя код php, я просто использую
int similar_text ( string $first , string $second [, float &$percent ]
но предположим, что у меня есть две строки, например:
1- Спонсоры вернулись от Шараповой после неудачного теста на наркотики
2- Мария Шарапова провалила тест на наркотики на Открытом чемпионате Австралии
С similar_text
инструмент у меня получил 53,7%, но это не имеет никакого смысла, потому что две строки говорят о «провалившемся тесте на наркотики» для «Шараповой», а процент должен быть больше 53,7%.
Мой вопрос: есть ли способ найти реальный процент сходства между двумя строками?
Я реализовал несколько алгоритмов, которые будут искать дубликаты, и они могут быть очень похожи.
Подход, который я обычно использую, заключается в следующем:
Мне кажется, что при выполнении шага 1) вы сможете значительно улучшить свои результаты.
Пример алгоритма нормализации (для деталей я использую «Спонсоры от Шараповой после неудачного теста на наркотики»):
1) строчная строка
-> «Спонсоры вернулись от Шарапова после неудачного теста на наркотики»
2) взорвать строку в словах
-> [спонсоры, назад, подальше, от, шарапова, после, провал, наркотик, тест]
3) удалить шумные слова (например, предложения, например, для, это, это и т. Д.). Этот шаг может быть настроен в соответствии с вашими потребностями
-> [спонсоры, шарапова, провал, наркотик, тест]
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. Не плохо, я думаю ^^. Я уверен, что этот алгоритм может быть доработан, но это хорошее начало … Кроме того, здесь мы в основном вычисляем средний процент сходства для каждого слова, вы можете захотеть другой конечный подход … настроить для ваших нужд; )
Других решений пока нет …