Скрипт сравнения двух текстов. Позволяет сравнить два текста на уникальность. В результате выдает схожесть текстов в процентах.
Алгоритм для сравнения двух текстов:
1. Делаем нижний регистр для всего текста.
2. Оставляем только слова, все остальные символы удаляем(кроме пробелов).
3. Превращаем оба текста в массивы из слов, теперь задача упростилась нужно сравнить уже два массива. После этого шага можно пойти разными путями, но вот как я решил сравнить эти два массива из слов.
4. Создаем дополнительные массивы, в которых удаляем дубликаты слов. После этого для каждого слова считаем количество повторений в тексте.
5. Сравниванием число повторений для каждого слова из двух массивов.
6. Т.к. будут попадаться такие слова, которые единожды встречаются в тексте, придется их посчитать.
7. Считаем суммарное различие и подсчитываем процент совпадения.
8. Если один текст совсем отличен от другого или в каком-то слов больше, то результат будет отрицательным. Поэтому для такого случая будем говорить что один текст похож на другой на 0%.
Вот такой алгоритм у меня получился. Теперь давайте приступим к написанию скрипта на php, который был определял схожесть текстов.
Создадим сперва форму для отправки и назовем файл куда все это вставим index.php,к примеру, вы можете назвать его как хотите.
Теперь создадим analiz.php, который будет выполнять сравнение.
setlocale(LC_ALL, 'ru_RU');
//переводим текст в нижний регистр.
$text1=strtolower($_REQUEST['text1']);
$text2=strtolower($_REQUEST['text2']);
//
/*избавляемся от точек и прочих лишних символов
оставляем только слова
*/
$DelSymbols=array('~','!','@','#','$','%','^','&','*',
'(',')','-','_','+','=','|','?',',',
'.','/',
';',':','"','№');
//теперь я удалю все и оставлю только слова
//str_replace $DelSymbols можно дополнить
// своими символами если недостаточно
$text1=str_replace($DelSymbols,"",$text1);
$text2=str_replace($DelSymbols,"",$text2);
//echo $text1;
//превращаем текст в массив из слов.
$words1 = explode(" ", $text1);
$words2 = explode(" ", $text2);
//удаляем дубликаты
$bufwords1=$words1;
$bufwords2=$words2;
$OneWords1=array_unique($bufwords1);
$OneWords2=array_unique($bufwords2);
//перезаписываем
foreach ($OneWords1 as $element){
$NewOneWords1[]=$element;
}
$OneWords1=$NewOneWords1;
foreach ($OneWords2 as $element){
$NewOneWords2[]=$element;
}
$OneWords2=$NewOneWords2;
//print_r($OneWords1);
//подсчитывает количество повторов для каждого слова
function CountReply($word,$text){
$count=count($text);
$res=0;
for($i=0;$i<$count;$i++){
if($word==$text[$i]){
$res++;
}
}
return $res;
}
foreach($OneWords1 as $Word){
$rep=CountReply($Word,$words1);
$ReplyWord1[$Word]=$rep;
}
foreach($OneWords2 as $Word){
$rep=CountReply($Word,$words2);
$ReplyWord2[$Word]=$rep;
}
$C1=count($OneWords1);
$sum=0;
$K=0;//количество совпадений.
for($i=0;$i<$C1;$i++){
$res=$ReplyWord2[$OneWords1[$i]];
if($res){
$res2=$ReplyWord1[$OneWords1[$i]];
$Diff=abs($res-$res2);
$K++;
}else{
$Diff=0;
}
$sum=$sum+$Diff;
}
$NoWords1=$C1-$K;
$NoWords2=count($OneWords2)-$K;
$sum=$NoWords1+$NoWords2+$sum;
$resultat=round(100-($sum*100/count($words1)));
if($resultat<0){
$resultat=0;
}
echo "Текст совпадает на ".$resultat."%";
?>