您如何编写反抄袭网站的代码?

ale*_*lex 22 php theory

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

这些算法如何在上传文本中检测抄袭?它是否使用正则表达式将所有单词发送到索引,删除已知的单词,如"the","a"等,然后查看在不同的文章中有多少单词是相同的?他们是否有一些神奇的相同单词将它标记为可能的副本?它是否使用levenshtein()

我选择的语言是PHP.

UPDATE

我正在考虑不在全球范围内检查抄袭,但更多的是在30个上传的论文中说.如果学生们在一个严格的一个人的任务上聚在一起.

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

Ste*_*202 31

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

但是,您也可以应用常规解决方案.看看标准化压缩距离(NCD).显然你不能精确计算文本的Kolmogorov复杂度,但你可以简单地压缩文本.

较小的NCD表示两个文本更相似.一些压缩算法会比其他算法提供更好的结果.幸运的是,PHP支持多种压缩算法,因此您可以立即运行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'));
Run Code Online (Sandbox Code Playgroud)

蟒蛇:

>>> 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
Run Code Online (Sandbox Code Playgroud)

请注意,对于较大的文本(读取:实际文件),结果将更加明显.试一试并报告您的经历!


Rog*_*cks 5

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

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

基本概念似乎是

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

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

  • 使用谷歌非常聪明。当我需要查找源文档而我只有一两句话时,我会不时这样做。 (3认同)

Pet*_*ore 5

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

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

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

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

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


Pet*_*uss 5

                           (这是一个 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);
}
Run Code Online (Sandbox Code Playgroud)


Ala*_*lum 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
Run Code Online (Sandbox Code Playgroud)

因此,即使采用这种方法,您也很有可能找到一两个很好的匹配项(有趣的事实:大多数罪犯确实很愚蠢)。

如果the窃者使用同义词,更改单词顺序等,显然会变得更加困难。您还必须存储同义词,并尝试稍微标准化语法结构以保持相同的方法有效。当然,拼写也一样(例如,尝试通过归一化进行匹配,或者尝试考虑匹配中的偏差,如其他答案中所介绍的NCD方法)。

然而,最大的问题是概念上的。窃。这确实很困难,并且如果不解析每个句子的语义(即足够复杂的AI),就没有明显的解决方案。

但事实是,您只需要找到某种匹配项即可。您无需查找完全匹配即可在语料库中找到相关文本。无论如何,最终的评估应始终由人工完成,因此,如果发现不完全匹配,也可以。

gia窃者大多是愚蠢和懒惰的,因此他们的副本也将是愚蠢和懒惰的。有些人投入了大量的精力,但这些作品通常首先是非显而易见的窃行为,因此很难通过程序进行追查(即,如果人们在识别并列两种文字时都难以识别窃行为, ,一台计算机也很有可能也会这样做)。对于所有其他大约80%左右的问题,愚蠢的方法就足够了。