php:在文件/嵌套循环中查找重复内容

时间:2015-01-20 12:32:36

标签: php nested-loops duplicate-content

我已经删除了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";
    }
}

2 个答案:

答案 0 :(得分:0)

您可能希望找到一种方法来区分可能的候选人与不太可能的候选人。 所以,也许有一种方法可以为每个文件计算一个值(例如:一个单词计数,一个句子/段落的数量......甚至可能是一些单个字母的数量),以便事先确定不太可能的候选人。 如果你能做到这一点,你可以通过用这个计算出的数字对数组进行排序来减少比较量。

答案 1 :(得分:0)

我尝试的另一个过程是:

  1. 从页面
  2. 剥离html标签
  3. 将\ s {2,}替换为\ s,\ n {2,}替换为\ n,以便每个标记的文本b / w显示在一行(几乎)
  4. 比较两个这样生成的文件,取一行,preg_matching,如果找到 - &gt;复制,否则将行拆分为单词数组,计算array_intersect,如果count是行长度的70%或更多 - &gt;重复。
  5. 非常有效,我可以在~10分钟内比较5000个文件

    但我的要求仍然很慢。

    所以我实施了第一个逻辑&#34; ncd algo&#34;用C语言编写的方法,用5-10秒完成任务(取决于平均页面大小)