Ich habe zwei PHP-Funktionen, um die Beziehung zwischen zwei Texten zu berechnen. Sie benutzen beide den Beutel mit Wörtern, aber check2() ist viel schneller. Wie auch immer, beide Funktionen geben die gleichen Ergebnisse. Warum? check1() verwendet ein großes Dictionary-Array, das ALLE Wörter enthält - wie im Textbeutelmodell beschrieben. check2() verwendet kein großes Array, sondern ein Array, das nur die Wörter eines Textes enthält. Check2() sollte also nicht funktionieren, tut es aber nicht. Warum geben beide Funktionen die gleichen Ergebnisse?Beutel mit Wörtern Modell: 2 PHP-Funktionen, gleiche Ergebnisse: Warum?
function check1($terms_in_article1, $terms_in_article2) {
global $zeit_check1;
$zeit_s = microtime(TRUE);
$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
$zeit_e = microtime(TRUE);
$zeit_check1 += ($zeit_e-$zeit_s);
return $score;
}
function check2($terms_in_article1, $terms_in_article2) {
global $zeit_check2;
$zeit_s = microtime(TRUE);
$length1 = count($terms_in_article1); // number of words
$length2 = count($terms_in_article2); // number of words
$score_table = array();
foreach($terms_in_article1 as $term){
if(!isset($score_table[$term])) $score_table[$term] = 0;
$score_table[$term] += 1;
}
$score_table2 = array();
foreach($terms_in_article2 as $term){
if(isset($score_table[$term])){
if(!isset($score_table2[$term])) $score_table2[$term] = 0;
$score_table2[$term] += 1;
}
}
$score = 0;
foreach($score_table2 as $key => $entry){
$score += $score_table[$key] * $entry;
}
$score = $score/($length1*$length2);
$score *= 500;
$zeit_e = microtime(TRUE);
$zeit_check2 += ($zeit_e-$zeit_s);
return $score;
}
Ich hoffe, Sie können mir helfen. Danke im Voraus!
Ich bin froh, dass Sie jemanden gefunden haben, der es erklären konnte:) Schöne Verbesserung von Werner auch! Pass auf! – 0scar