Аналогичный процент текста в переполнении стека

Кажется, что легко найти процент между двумя строками, используя код php, я просто использую

int similar_text ( string $first , string $second [, float &$percent ]

но предположим, что у меня есть две строки, например:

1- Спонсоры вернулись от Шараповой после неудачного теста на наркотики

2- Мария Шарапова провалила тест на наркотики на Открытом чемпионате Австралии

С similar_text инструмент у меня получил 53,7%, но это не имеет никакого смысла, потому что две строки говорят о «провалившемся тесте на наркотики» для «Шараповой», а процент должен быть больше 53,7%.

Мой вопрос: есть ли способ найти реальный процент сходства между двумя строками?

1

Решение

Я реализовал несколько алгоритмов, которые будут искать дубликаты, и они могут быть очень похожи.

Подход, который я обычно использую, заключается в следующем:

  1. нормализовать строки
  2. использовать алгоритм сравнения (например, Similar_text, Левенштейн и т. д.)

Мне кажется, что при выполнении шага 1) вы сможете значительно улучшить свои результаты.

Пример алгоритма нормализации (для деталей я использую «Спонсоры от Шараповой после неудачного теста на наркотики»):

1) строчная строка

-> «Спонсоры вернулись от Шарапова после неудачного теста на наркотики»

2) взорвать строку в словах

-> [спонсоры, назад, подальше, от, шарапова, после, провал, наркотик, тест]

3) удалить шумные слова (например, предложения, например, для, это, это и т. Д.). Этот шаг может быть настроен в соответствии с вашими потребностями

-> [спонсоры, шарапова, провал, наркотик, тест]

4) сортировать массив по алфавиту (необязательно, но это может помочь в реализации алгоритма …)

-> [наркотик, провал, шарапова, спонсоры, тест]

Применяя тот же алгоритм к другой строке, вы получите:

[австралиец, наркотики, провал, мария, открытый, шарапова, тест]

Это поможет вам разработать умный алгоритм. Например:

  1. для каждого слова в первой строке найдите наибольшее сходство в словах второй строки
  2. накапливать наибольшее сходство
  3. разделите накопленное сходство на количество слов

$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. Не плохо, я думаю ^^. Я уверен, что этот алгоритм может быть доработан, но это хорошее начало … Кроме того, здесь мы в основном вычисляем средний процент сходства для каждого слова, вы можете захотеть другой конечный подход … настроить для ваших нужд; )

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]