Как проверить частичное сходство двух строк в PHP - программирование

Как проверить частичное сходство двух строк в PHP

Является ли какой-либо функцией в PHP проверкой% сходства двух строк?

Например, у меня есть:

$string1="Hello how are you doing" 
$string2= " hi, how are you"

и function($string1, $string2) вернет меня true, потому что в строке присутствуют слова "как", "есть", "вы".

Или даже лучше, верните мне 60% подобия, потому что "как", "есть", "вы" - это 3/5 из $string1.

Есть ли какая-нибудь функция в PHP, которая это делает?

4b9b3361

Ответ 1

Как хороший вопрос, я вложил в это несколько усилий:

<?php
$string1="Hello how are you doing";
$string2= " hi, how are you";

echo 'Compare result: ' . compareStrings($string1, $string2) . '%';
//60%


function compareStrings($s1, $s2) {
    //one is empty, so no result
    if (strlen($s1)==0 || strlen($s2)==0) {
        return 0;
    }

    //replace none alphanumeric charactors
    //i left - in case its used to combine words
    $s1clean = preg_replace("/[^A-Za-z0-9-]/", ' ', $s1);
    $s2clean = preg_replace("/[^A-Za-z0-9-]/", ' ', $s2);

    //remove double spaces
    while (strpos($s1clean, "  ")!==false) {
        $s1clean = str_replace("  ", " ", $s1clean);
    }
    while (strpos($s2clean, "  ")!==false) {
        $s2clean = str_replace("  ", " ", $s2clean);
    }

    //create arrays
    $ar1 = explode(" ",$s1clean);
    $ar2 = explode(" ",$s2clean);
    $l1 = count($ar1);
    $l2 = count($ar2);

    //flip the arrays if needed so ar1 is always largest.
    if ($l2>$l1) {
        $t = $ar2;
        $ar2 = $ar1;
        $ar1 = $t;
    }

    //flip array 2, to make the words the keys
    $ar2 = array_flip($ar2);


    $maxwords = max($l1, $l2);
    $matches = 0;

    //find matching words
    foreach($ar1 as $word) {
        if (array_key_exists($word, $ar2))
            $matches++;
    }

    return ($matches / $maxwords) * 100;    
}
?>

Ответ 2

Как уже говорили другие ответы, вы можете использовать аналогичный_текст. Здесь демонстрация:

$string1="Hello how are you doing" ;
$string2= " hi, how are you";

echo similar_text($string1, $string2, $perc); //12

echo $perc; //61.538461538462

вернет 12 и установит в $perc процент сходства, о котором вы просили.

Ответ 3

В дополнение к Алексу Сири ответьте и согласно следующей статье:

http://docstore.mik.ua/orelly/webprog/php/ch04_06.htm

PHP предоставляет несколько функций, которые позволяют вам проверить, примерно ли две строки примерно равны:

$string1="Hello how are you doing" ;
$string2= " hi, how are you";

SOUNDEX

if (soundex($string1) == soundex($string2)) {

  echo "similar";

} else {

  echo "not similar";

}

Metaphone

if (metaphone($string1) == metaphone($string2)) {

   echo "similar";

} else {

  echo "not similar";

}

ПОХОЖИЙ ТЕКСТ

$similarity = similar_text($string1, $string2);

Левенштейн

$distance = levenshtein($string1, $string2); 

Ответ 4

Хорошо, вот моя функция, которая делает ее очень интересной.

Я проверяю приблизительно сходство строк.

Вот критерий, который я использую для этого.

  • Порядок слов важен.
  • Слова могут иметь 85% сходства.

Пример:

$string1 = "How much will it cost to me" (string in vocabulary)
$string2 = "How much does costs it "   //("costs" instead "cost" -is a mistake) (user input);

Алгоритм: 1) Проверьте сходство слов и создайте чистые строки с "правильными" словами (в порядке, указанном в лексике). OUTPUT: "сколько это стоит" 2) создать чистую строку с "правильными словами", чтобы она отображалась в пользовательском вводе. OUTPUT: "сколько стоит" 3) Сравните два выхода - если не одно и то же - верните no, else, если они вернутся да.

error_reporting(E_ALL);
ini_set('display_errors', true);

$string1="сколько это стоит ваще" ;
$string2= "сколько будет стоить это будет мне";

if(compareStrings($string1, $string2)) {
 echo "yes";    
} else {
    echo 'no';
}
//echo compareStrings($string1, $string2);

function compareStrings($s1, $s2) {

    if (strlen($s1)==0 || strlen($s2)==0) {
        return 0;
    }

    while (strpos($s1, "  ")!==false) {
        $s1 = str_replace("  ", " ", $s1);
    }
    while (strpos($s2, "  ")!==false) {
        $s2 = str_replace("  ", " ", $s2);
    }

    $ar1 = explode(" ",$s1);
    $ar2 = explode(" ",$s2);
  //  $array1 = array_flip($ar1);
  //  $array2 = array_flip($ar2);
    $l1 = count($ar1);
    $l2 = count($ar2);

 $meaning="";
    $rightorder="";
    $compare=0;
    for ($i=0;$i<$l1;$i++) {


        for ($j=0;$j<$l2;$j++) {

            $compare = (similar_text($ar1[$i],$ar2[$j],$percent)) ;
          //  echo $compare;
if ($percent>=85) {
    $meaning=$meaning." ".$ar1[$i];
    $rightorder=$rightorder." ".$ar1[$j];
    $compare=0;
}

        }


    }
    //print_r($rightorder);
if ($rightorder==$meaning) {
    return true;
} else {
    return false;
}

}

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

Ответ 5

Вы можете использовать функцию PHP similar_text.

int similar_text ( string $first , string $second)

Проверьте документ PHP по адресу http://php.net/manual/en/function.similar-text.php