【问题标题】:How would you code an anti plagiarism site?你将如何编写一个反剽窃网站?
【发布时间】:2010-11-08 06:35:53
【问题描述】:

首先,请注意,我对这样的东西如何工作很感兴趣,并且不打算为客户等构建它,因为我确信可能已经有开源实现。

检测上传文本中抄袭的算法如何工作?它是否使用正则表达式将所有单词发送到索引,去除已知单词,如“the”、“a”等,然后查看不同文章中有多少单词相同?他们是否有大量相同的单词将其标记为可能的重复?它使用levenshtein() 吗?

我选择的语言是 PHP。

更新

我正在考虑不要在全球范围内检查抄袭,而是在一个班级上传的 30 篇论文中进行更多检查。以防学生们聚在一起完成一项严格的单人作业。

这是一个声称这样做的在线网站:http://www.plagiarism.org/

【问题讨论】:

    标签: php theory


    【解决方案1】:

    这真的取决于“从哪里抄袭”。 如果您是在单个站点的上下文中讨论的,那与整个网络、大会图书馆或 ...

    http://www.copyscape.com/ 几乎证明了它是可以做到的。

    基本概念好像是

    • 用谷歌搜索一些不常见的 单词序列
    • 对每一个结果,做一个详细的分析

    详细分析部分当然可以类似,因为它是一对一的比较,但定位和获取源文档是关键因素。

    【讨论】:

    • 非常聪明地使用 Google。当我需要查找源文档而我只有一两句话时,我会不时这样做。
    • @Jonathan - 同样,或者当我有一些歌曲的歌词并且不记得艺术家或标题时。 @Roger - 抓取 Google 结果合法和/或道德吗?有没有更好的办法?
    • 如果您是在“专业”的基础上进行的,您可以注册开发应用程序令牌等并使用它们提供的 API。相当慷慨的开始条款。
    【解决方案2】:

    良好的抄袭检测将根据文档类型(例如特定语言的论文或程序代码)应用启发式方法。

    但是,您也可以应用通用解决方案。看看Normalized Compression Distance (NCD)。显然,您无法准确计算文本的Kolmogorov complexity,但您可以通过简单地压缩文本来处理它。

    较小的 NCD 表示两个文本更相似。一些压缩 算法将提供比其他算法更好的结果。幸运的是 PHP 提供了支持 对于several 压缩算法,所以你可以有你的NCD驱动的抄袭 检测代码立即运行。下面我将给出使用的示例代码 Zlib:

    PHP:

    function ncd($x, $y) { 
      $cx = strlen(gzcompress($x));
      $cy = strlen(gzcompress($y));
      return (strlen(gzcompress($x . $y)) - min($cx, $cy)) / max($cx, $cy);
    }   
    
    print(ncd('this is a test', 'this was a test'));
    print(ncd('this is a test', 'this text is completely different'));
    

    Python:

    >>> from zlib import compress as c
    >>> def ncd(x, y): 
    ...     cx, cy = len(c(x)), len(c(y))
    ...     return (len(c(x + y)) - min(cx, cy)) / max(cx, cy) 
    ... 
    >>> ncd('this is a test', 'this was a test')
    0.30434782608695654
    >>> ncd('this is a test', 'this text is completely different')
    0.74358974358974361
    

    请注意,对于较大的文本(阅读:实际文件),结果会更多 发音。试一试并报告您的经验!

    【讨论】:

    • +1。很久以前我读到过压缩被用来测量信息内容,但你的帖子带回了这个有趣的想法。
    • 两个相同的文件可以给出较低的值 (0.03, 0.10) 但也可以根据大小 (0.99) 给出较高的值这一事实非常重要。我不会仅仅依靠这个。
    【解决方案3】:

    我认为这个问题很复杂,没有一个最好的解决方案。 您可以在整个文档级别(即有人从网络下载整篇文章)一直到短语级别检测到单词的精确重复。在文档级别执行此操作非常容易 - 最简单的解决方案是获取每个提交的文档的校验和,并将其与已知文档的校验和列表进行比较。之后你可以尝试检测思想的抄袭,或者找到直接复制然后稍微改变的句子,以甩掉这样的软件。

    要获得在短语级别有效的东西,如果想要任何级别的效率,您可能需要变得更复杂。例如,您可以寻找段落之间写作风格的差异,并将注意力集中在与论文其余部分相比感觉“不合适”的段落上。

    有很多关于这个主题的论文,所以我怀疑还没有一个完美的解决方案。例如,这 2 篇论文介绍了这类软件的一些常见问题,并提供了大量参考资料,如果您愿意,可以深入研究。

    http://ir.shef.ac.uk/cloughie/papers/pas_plagiarism.pdf

    http://proceedings.informingscience.org/InSITE2007/IISITv4p601-614Dreh383.pdf

    【讨论】:

    • 感谢彼得的链接 - +1
    【解决方案4】:

                             (这是一个 Wiki!请在此处编辑进行更正或增强)

    为了在不太大的字符串上获得更好的结果:

    在字符串或小文本上直接使用 NCD 公式存在问题。 NCD(X,X) 不为零 (!)。要删除此伪影,请减去自我比较。

    http://leis.saocarlos.sp.gov.br/SIMILAR.php查看similar_NCD_gzip() 演示

    function similar_NCD_gzip($sx, $sy, $prec=0, $MAXLEN=90000) {
    # 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,
    #     $pres=1 or =2,3... for better precision (not a reliable)  
    # Use MAXLEN=-1 or a aprox. compress lenght. 
    # For NCD definition see http://arxiv.org/abs/0809.2553
    # (c) Krauss (2010).
      $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.
      
      # Optional correction (for little strings):
      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);
    }
    

    【讨论】:

      【解决方案5】:

      嗯,首先你必须明白你的对手是什么。

      逐字抄袭应该很容易被发现。最幼稚的方法是获取足够长的单词元组并将它们与您的语料库进行比较。足够的长度可以非常低。比较 Google 结果:

      "I think" => 454,000,000
      "I think this" => 329,000,000
      "I think this is" => 227,000,000
      "I think this is plagiarism" => 5
      

      因此,即使采用这种方法,您也有很大的机会找到一两个好的匹配对象(有趣的事实:大多数罪犯都非常愚蠢)。

      如果剽窃者使用了同义词,改变了词序等等,显然它会变得更加困难。您还必须存储同义词并尝试稍微规范语法结构以保持相同的方法有效。当然,拼写也是如此(即尝试通过标准化进行匹配或尝试解释匹配中的偏差,如其他答案中发布的 NCD 方法)。

      但最大的问题是概念抄袭。这真的很难,如果不解析每个句子的语义(即足够复杂的 AI),就没有明显的解决方案。

      但事实是,您只需要找到某种匹配项。您无需找到完全匹配即可在语料库中找到相关文本。无论如何,最终的评估都应该由人来进行,所以如果你发现不精确的匹配也没关系。

      抄袭者大多是愚蠢和懒惰的,所以他们的副本也会愚蠢和懒惰。有些人在他们的作品中付出了难以置信的努力,但这些作品通常是不明显的抄袭,所以很难通过程序来追踪(即,如果一个人在两个文本并排呈现的情况下难以识别抄袭) ,计算机很可能也会)。对于所有其他 80% 左右的人来说,愚蠢的方法就足够了。

      【讨论】:

        猜你喜欢
        • 2010-10-09
        • 1970-01-01
        • 2019-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-03
        相关资源
        最近更新 更多