Eğer karşılaştırmak için yerine dizilerin basit metin kullanabilirsiniz, ve ben hedef olduğu doğru anlaşıldığı takdirde, sen google gibi vermek için genellikle kullanılan (levenshtein php fonksiyonunu kullanabilirsiniz eğer anlam mı ... php arama motorlarında? 'işlevi).
Bu konum kullanılarak ters şekilde çalışır: iki dizeleri arasındaki farkı döndürür.
Örnek:
<?php
function check($a, $b) {
return levenshtein($a, $b);
}
$a = 'this is just a test';
$b = 'this is not test';
$c = 'this is just a test';
echo check($a, $b) . '<br />';
//return 5
echo check($a, $c) . '<br />';
//return 0, the strings are identical
?>
Ama bu yürütme hızını artırmak eğer tam olarak bilmiyorum .. ama belki evet, take-out birçok foreach döngüleri ve array_merge işlevi.
EDIT:
Hız için bir basit bir test (30-saniye-wroted-script,% 100 eh accurated değil):
function check($terms_in_article1, $terms_in_article2) {
$length1 = count($terms_in_article1); // number of words
$length2 = count($terms_in_article2); // number of words
$all_terms = array_merge($terms_in_article1, $terms_in_article2);
$all_terms = array_unique($all_terms);
foreach ($all_terms as $all_termsa) {
$term_vector1[$all_termsa] = 0;
$term_vector2[$all_termsa] = 0;
}
foreach ($terms_in_article1 as $terms_in_article1a) {
$term_vector1[$terms_in_article1a]++;
}
foreach ($terms_in_article2 as $terms_in_article2a) {
$term_vector2[$terms_in_article2a]++;
}
$score = 0;
foreach ($all_terms as $all_termsa) {
$score += $term_vector1[$all_termsa]*$term_vector2[$all_termsa];
}
$score = $score/($length1*$length2);
$score *= 500; // for better readability
return $score;
}
$a = array('this', 'is', 'just', 'a', 'test');
$b = array('this', 'is', 'not', 'test');
$timenow = microtime();
list($m_i, $t_i) = explode(' ', $timenow);
for($i = 0; $i != 10000; $i++){
check($a, $b);
}
$last = microtime();
list($m_f, $t_f) = explode(' ', $last);
$fine = $m_f+$t_f;
$inizio = $m_i+$t_i;
$quindi = $fine - $inizio;
$quindi = substr($quindi, 0, 7);
echo 'end in ' . $quindi . ' seconds';
Yazıcı: 0.36765 saniye sonu
Ikinci test:
<?php
function check($a, $b) {
return levenshtein($a, $b);
}
$a = 'this is just a test';
$b = 'this is not test';
$timenow = microtime();
list($m_i, $t_i) = explode(' ', $timenow);
for($i = 0; $i != 10000; $i++){
check($a, $b);
}
$last = microtime();
list($m_f, $t_f) = explode(' ', $last);
$fine = $m_f+$t_f;
$inizio = $m_i+$t_i;
$quindi = $fine - $inizio;
$quindi = substr($quindi, 0, 7);
echo 'end in ' . $quindi . ' seconds';
?>
Yazıcı: 0.05023 saniye sonu
So, yes, seem faster.
Would be nice to try with many array items (and many words for levenshtein)
2°EDIT:
Benzer bir metin ile hız levenshtein yöntemine eşit gibi görünüyor:
<?php
function check($a, $b) {
return similar_text($a, $b);
}
$a = 'this is just a test ';
$b = 'this is not test';
$timenow = microtime();
list($m_i, $t_i) = explode(' ', $timenow);
for($i = 0; $i != 10000; $i++){
check($a, $b);
}
$last = microtime();
list($m_f, $t_f) = explode(' ', $last);
$fine = $m_f+$t_f;
$inizio = $m_i+$t_i;
$quindi = $fine - $inizio;
$quindi = substr($quindi, 0, 7);
echo 'end in ' . $quindi . ' seconds';
?>
Yazıcı: 0.05988 saniye sonu
Ama fazla 255 karakter alabilir:
Note also that the complexity of this
algorithm is O(N**3) where N is the
length of the longest string.
ve hatta yüzdesi similary değer döndürebilir:
function check($a, $b) {
similar_text($a, $b, $p);
return $p;
}
Yet another edit
Peki bunun yerine tüm veri ve döngü onları alınmasıyla, sql sorgu doğrudan karşılaştırmak yapmak için, bir veritabanı işlevi oluşturmak?
If youre running Mysql, give a look at this one (hand-made levenshtein function, still 255 char limit)
Else, if youre on Postgresql, this other one (many functions that should be evalutate)