我有两个php函数来计算两个文本之间的关系。它们都使用单词包模型,但是check2()要快得多。无论如何,这两个函数都给出相同的结果。为什么?check1()使用一个包含所有单词的大字典数组-如单词包模型中所述。check2()不使用一个大数组,而是只包含一个文本的单词的数组。所以check2()应该不起作用,但它不起作用。为什么两个函数都给出相同的结果?
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;
}
我希望你能帮助我。提前谢谢!
最佳答案
这两个函数实现了几乎相同的算法,但是第一个函数以简单的方式实现,第二个函数则更聪明一些,跳过了一部分不必要的工作。
支票1如下:
// loop length(words1) times
for each word in words1:
freq1[word]++
// loop length(words2) times
for each word in words2:
freq2[word]++
// loop length(union(words1, words2)) times
for each word in union(words1, words2):
score += freq1[word] * freq2[word]
但是记住:当你用零乘某物时,你会得到零。
这意味着,计算不在两个集合中的单词的频率是浪费时间-我们将频率乘以零,这将不会增加分数。
支票2考虑了这一点:
// loop length(words1) times
for each word in words1:
freq1[word]++
// loop length(words2) times
for each word in words2:
if freq1[word] > 0:
freq2[word]++
// loop length(intersection(words1, words2)) times
for each word in freq2:
score += freq1[word] * freq2[word]