首先,请注意,我感兴趣的是这样的东西是如何工作的,并且我不打算为客户端等构建它,因为我确信可能已经存在开源实现.
这些算法如何在上传文本中检测抄袭?它是否使用正则表达式将所有单词发送到索引,删除已知的单词,如"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)
请注意,对于较大的文本(读取:实际文件),结果将更加明显.试一试并报告您的经历!
这真的取决于“从哪里抄袭”。如果您是在单个站点的上下文中进行讨论,那么这与整个网络、会议图书馆或...
http://www.copyscape.com/ 几乎证明这是可以做到的。
基本概念似乎是
详细分析部分当然可以类似,因为它是1对1的比较,但定位和获取源文档是关键因素。
我认为这个问题很复杂,并没有一个最好的解决方案.您可以在整个文档级别(即,有人从Web下载整篇文章)一直到短语级别检测到单词的确切重复.在文档级别执行此操作非常简单 - 最简单的解决方案将采用提交的每个文档的校验和,并将其与已知文档的校验和列表进行比较.之后,您可以尝试检测想法的抄袭,或者找到直接复制然后稍微改变的句子,以便抛弃这样的软件.
要获得在短语级别工作的东西,如果想要任何级别的效率,您可能需要变得更复杂.例如,您可以在段落之间寻找写作风格的差异,并将注意力集中在与纸张其他部分相比感觉"不合适"的段落上.
关于这个主题有很多论文,所以我怀疑还没有一个完美的解决方案.例如,这两篇论文介绍了这类软件的一些一般性问题,并提供了大量参考资料,如果你愿意,可以深入研究.
http://ir.shef.ac.uk/cloughie/papers/pas_plagiarism.pdf
http://proceedings.informingscience.org/InSITE2007/IISITv4p601-614Dreh383.pdf
(这是一个 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)
好吧,您首先必须了解您要面对的挑战。
逐字窃应该很容易被发现。最幼稚的方法是采用足够长的单词元组,并将其与您的语料库进行比较。足够的长度可能非常短。比较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%左右的问题,愚蠢的方法就足够了。
| 归档时间: |
|
| 查看次数: |
10025 次 |
| 最近记录: |