2016-03-10 11 views
1

Это кажется так легко найти процент между двумя строками с использованием кода PHP, я просто использоватьПодобный текст процент в PHP

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

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

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

2 Мария Шарапова не прошла тест на наркотики на Australian Open

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

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

+0

Почему этот процент должен составлять более 53,7%? Как вы определяете «реальное» сходство? – showdev

+2

Мне кажется, вы говорите о семантическом сходстве, т. Е. О сравнении значения двух разных строк. Это связано с обработкой естественного языка со всеми вытекающими проблемами. –

+0

Да, возможно, я должен использовать ИК-алгоритмы, но я ищу более простой способ, не делая документ и запрос. –

ответ

1

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

подход я обычно использую это следующее:

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

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

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

1) в нижнем регистре строку

-> «спонсоры назад от Шараповой после неудачной попытки испытание снадобья»

2) взрываются строку в словах

-> [спонсоры, назад, прочь от Шараповой, после того, как, не удалось, наркотиков, тест]

3) удалите шумные слова (например, предложения, например. in, for, that, this и т. д.). Этот шаг может быть настроен для ваших нужд

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

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

+0

Обратите внимание, что если вы инвертируете два слова, алгоритм выше вернет другое значение (72.454946891037). Это может быть хорошим или плохим свойством для вас ... –