我已经删除了5000个文件,将它们存储在单个文件中(0-4999.txt),现在我需要在其中找到重复的内容。所以我在嵌套循环中比较每个文件(ETA 82小时)。这种方法肯定需要数小时才能完成。我主要担心的是否定。迭代。任何人都可以建议一种更好的方法来减少迭代并减少所花费的时间吗?
当前代码:NCD算法
function ncd_new($sx, $sy, $prec=0, $MAXLEN=9000) {
# NCD with gzip artifact correctoin and percentual return.
# sx,sy = strings to compare.
# Use $prec=-1 for result range [0-1], $pres=0 for percentual,
# For NCD definition see http://arxiv.org/abs/0809.2553
$x = $min = strlen(gzcompress($sx));
$y = $max = strlen(gzcompress($sy));
$xy= strlen(gzcompress($sx.$sy));
$a = $sx;
if ($x>$y) { # swap min/max
$min = $y;
$max = $x;
$a = $sy;
}
$res = ($xy-$min)/$max; # NCD definition.
if ($MAXLEN<0 || $xy<$MAXLEN) {
$aa= strlen(gzcompress($a.$a));
$ref = ($aa-$min)/$min;
$res = $res - $ref; # correction
}
return ($prec<0)? $res: 100*round($res,2+$prec);
}
循环遍历每个文件:
$totalScraped = 5000;
for($fileC=0;$fileC<$totalScraped;$fileC++)
{
$f1 = file_get_contents($fileC.".txt");
$stripstr = array('/\bis\b/i', '/\bwas\b/i', '/\bthe\b/i', '/\ba\b/i');
$file1 = preg_replace($stripstr, '', $f1);
// 0+fileC => exclude already compared files
// eg. if fileC=10 , start loop 11 to 4999
for($fileD=(0+$fileC);$fileD<$totalScraped;$fileD++)
{
$f2 = file_get_contents($fileD.".txt", FILE_USE_INCLUDE_PATH);
$stripstr = array('/\bis\b/i', '/\bwas\b/i', '/\bthe\b/i', '/\ba\b/i');
$file2 = preg_replace($stripstr, '', $f2);
$total=ncd_new($file1,$file2);
echo "$fileName1 vs $fileName2 is: $total%\n";
}
}
答案 0 :(得分:0)
您可能希望找到一种方法来区分可能的候选人与不太可能的候选人。 所以,也许有一种方法可以为每个文件计算一个值(例如:一个单词计数,一个句子/段落的数量......甚至可能是一些单个字母的数量),以便事先确定不太可能的候选人。 如果你能做到这一点,你可以通过用这个计算出的数字对数组进行排序来减少比较量。
答案 1 :(得分:0)
我尝试的另一个过程是:
非常有效,我可以在~10分钟内比较5000个文件
但我的要求仍然很慢。
所以我实施了第一个逻辑&#34; ncd algo&#34;用C语言编写的方法,用5-10秒完成任务(取决于平均页面大小)