你会如何编写一个反抄袭网站?

2022-08-30 17:00:13

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

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

我选择的语言是PHP。

更新

我正在考虑的不是在全球范围内检查抄袭行为,而是在一个班级上传的30篇文章中说得更多。如果学生在严格的一人作业中聚在一起。

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


答案 1

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

但是,您也可以应用常规解决方案。查看归一化压缩距离 (NCD)。显然,你不能准确地计算文本的柯尔莫哥洛夫的复杂性,但你可以通过简单地压缩文本来接近它。

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

菲律宾比索:

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'));

蟒:

>>> 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

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


答案 2

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

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

有很多关于这个主题的论文,所以我怀疑还没有一个完美的解决方案。例如,这2篇论文介绍了这种软件的一些一般问题,并有很多参考资料,如果你愿意,你可以更深入地挖掘。

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

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


推荐