0

我已经抓取了 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";
    }
}
4

2 回答 2

0

您可能想找到一种方法来区分可能的候选人和不太可能的候选人。因此,也许有一种方法可以计算每个文件的值(例如:字数、句子/段落数……甚至可能是单个字母的数),以预先识别不太可能的候选者。如果你能做到这一点,你可以通过按这个计算的数字对你的数组进行排序来减少比较的数量。

于 2015-01-20T13:48:30.553 回答
0

我尝试的另一个过程是:

  1. 从页面中去除 html 标签
  2. 将 \s{2,} 替换为 \s,将 \n{2,} 替换为 \n,以便每个标签的文本黑白显示在一行中(几乎)
  3. 通过取一行 preg_matching 比较两个这样的生成文件,如果找到 -> 重复,否则将行分成单词数组,计算 array_intersect,如果计数是行长度的 70% 或更多 -> 重复。

这非常有效,我可以在大约 10 分钟内比较 5000 个文件

但我的要求仍然很慢。

所以我用 C 语言实现了第一个逻辑“ncd algo”方法,它在 5-10 秒内完成了任务(取决于平均页面大小)

于 2015-06-03T11:45:07.123 回答